generated from cloudwego/.github
-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat:add consul && client && server &&config watch (#1)
* test * consul * client * server * server * server * tests.yml * license * license header * staticcheck * staticcheck * staticcheck * lint * golangci * golangci * golangci * lint * lint * lint * lint * lint * lint * license header * 修正部分命名 * 补充readme * 修正小问题 * 修正配置为空时无法解析问题,修正panic问题
- Loading branch information
Showing
21 changed files
with
2,523 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,288 @@ | ||
# .github | ||
# config-consul | ||
[中文](./README_CN.md) | ||
|
||
etcd as config center for service governance. | ||
|
||
## Usage | ||
|
||
### Basic | ||
|
||
#### Server | ||
|
||
```go | ||
|
||
package main | ||
|
||
import ( | ||
"config-consul/consul" | ||
"context" | ||
"log" | ||
|
||
consulserver "config-consul/server" | ||
|
||
"github.com/cloudwego/kitex-examples/kitex_gen/api" | ||
"github.com/cloudwego/kitex-examples/kitex_gen/api/echo" | ||
"github.com/cloudwego/kitex/pkg/klog" | ||
"github.com/cloudwego/kitex/pkg/rpcinfo" | ||
"github.com/cloudwego/kitex/server" | ||
) | ||
|
||
var _ api.Echo = &EchoImpl{} | ||
|
||
// EchoImpl implements the last service interface defined in the IDL. | ||
type EchoImpl struct{} | ||
|
||
// Echo implements the Echo interface. | ||
func (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) { | ||
klog.Info("echo called") | ||
return &api.Response{Message: req.Message}, nil | ||
} | ||
|
||
func main() { | ||
klog.SetLevel(klog.LevelDebug) | ||
serviceName := "ServiceName" // your server-side service name | ||
etcdClient, _ := consul.NewClient(consul.Options{}) | ||
svr := echo.NewServer( | ||
new(EchoImpl), | ||
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}), | ||
server.WithSuite(consulserver.NewSuite(serviceName, etcdClient)), | ||
) | ||
if err := svr.Run(); err != nil { | ||
log.Println("server stopped with error:", err) | ||
} else { | ||
log.Println("server stopped") | ||
} | ||
} | ||
|
||
|
||
``` | ||
#### Client | ||
|
||
```go | ||
|
||
package main | ||
|
||
import ( | ||
"config-consul/consul" | ||
"config-consul/utils" | ||
"context" | ||
"log" | ||
"time" | ||
|
||
consulclient "config-consul/client" | ||
|
||
"github.com/cloudwego/kitex-examples/kitex_gen/api" | ||
"github.com/cloudwego/kitex-examples/kitex_gen/api/echo" | ||
"github.com/cloudwego/kitex/client" | ||
"github.com/cloudwego/kitex/pkg/klog" | ||
) | ||
|
||
type configLog struct{} | ||
|
||
func (cl *configLog) Apply(opt *utils.Options) { | ||
fn := func(k *consul.Key) { | ||
klog.Infof("consul config %v", k) | ||
} | ||
opt.ConsulCustomFunctions = append(opt.ConsulCustomFunctions, fn) | ||
} | ||
|
||
func main() { | ||
consulClient, err := consul.NewClient(consul.Options{}) | ||
if err != nil { | ||
panic(err) | ||
} | ||
|
||
cl := &configLog{} | ||
|
||
serviceName := "ServiceName" // your server-side service name | ||
clientName := "ClientName" // your client-side service name | ||
client, err := echo.NewClient( | ||
serviceName, | ||
client.WithHostPorts("0.0.0.0:8888"), | ||
client.WithSuite(consulclient.NewSuite(serviceName, clientName, consulClient, cl)), | ||
) | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
for { | ||
|
||
req := &api.Request{Message: "my request"} | ||
resp, err := client.Echo(context.Background(), req) | ||
if err != nil { | ||
klog.Errorf("take request error: %v", err) | ||
} else { | ||
klog.Infof("receive response %v", resp) | ||
} | ||
time.Sleep(time.Second * 10) | ||
} | ||
} | ||
|
||
``` | ||
### Consul Configuration | ||
|
||
#### CustomFunction | ||
|
||
Provide the mechanism to custom the etcd parameter `Key`. | ||
```go | ||
type Key struct { | ||
Type ConfigType | ||
Prefix string | ||
Path string | ||
} | ||
``` | ||
|
||
|
||
#### Options Variable | ||
|
||
| Variable Name | Default Value | | ||
|------------------|-------------------------------------------------------------| | ||
| Addr | 127.0.0.1:8500 | | ||
| Prefix | /KitexConfig | | ||
| ServerPathFormat | {{.ServerServiceName}}/{{.Category}} | | ||
| ClientPathFormat | {{.ClientServiceName}}/{{.ServerServiceName}}/{{.Category}} | | ||
| DataCenter | dc1 | | ||
| Timeout | 5 * time.Second | | ||
| NamespaceId | | | ||
| Token | | | ||
| Partition | | | ||
| LoggerConfig | NULL | | ||
| ConfigParser | defaultConfigParser | | ||
|
||
#### Governance Policy | ||
> The configPath and configPrefix in the following example use default values, the service name is `ServiceName` and the client name is `ClientName`. | ||
##### Rate Limit Category=limit | ||
> Currently, current limiting only supports the server side, so ClientServiceName is empty. | ||
[JSON Schema](https://github.com/cloudwego/kitex/blob/develop/pkg/limiter/item_limiter.go#L33) | ||
|
||
| Variable | Introduction | | ||
|------------------|------------------------------------| | ||
| connection_limit | Maximum concurrent connections | | ||
| qps_limit | Maximum request number every 100ms | | ||
|
||
Example: | ||
|
||
> configPath: /KitexConfig/ServiceName/limit | ||
```json | ||
{ | ||
"connection_limit": 100, | ||
"qps_limit": 2000 | ||
} | ||
``` | ||
|
||
Note: | ||
|
||
- The granularity of the current limit configuration is server global, regardless of client or method. | ||
- Not configured or value is 0 means not enabled. | ||
- connection_limit and qps_limit can be configured independently, e.g. connection_limit = 100, qps_limit = 0 | ||
|
||
##### Retry Policy Category=retry | ||
[JSON Schema](https://github.com/cloudwego/kitex/blob/develop/pkg/retry/policy.go#L63) | ||
|
||
| Variable | Introduction | | ||
|-------------------------------|------------------------------------------------| | ||
| type | 0: failure_policy 1: backup_policy | | ||
| failure_policy.backoff_policy | Can only be set one of `fixed` `none` `random` | | ||
|
||
Example: | ||
|
||
> configPath: /KitexConfig/ClientName/ServiceName/retry | ||
```json | ||
{ | ||
"*": { | ||
"enable": true, | ||
"type": 0, | ||
"failure_policy": { | ||
"stop_policy": { | ||
"max_retry_times": 3, | ||
"max_duration_ms": 2000, | ||
"cb_policy": { | ||
"error_rate": 0.3 | ||
} | ||
}, | ||
"backoff_policy": { | ||
"backoff_type": "fixed", | ||
"cfg_items": { | ||
"fix_ms": 50 | ||
} | ||
}, | ||
"retry_same_node": false | ||
} | ||
}, | ||
"echo": { | ||
"enable": true, | ||
"type": 1, | ||
"backup_policy": { | ||
"retry_delay_ms": 100, | ||
"retry_same_node": false, | ||
"stop_policy": { | ||
"max_retry_times": 2, | ||
"max_duration_ms": 300, | ||
"cb_policy": { | ||
"error_rate": 0.2 | ||
} | ||
} | ||
} | ||
} | ||
} | ||
``` | ||
Note: retry.Container has built-in support for specifying the default configuration using the `*` wildcard (see the [getRetryer](https://github.com/cloudwego/kitex/blob/v0.5.1/pkg/retry/retryer.go#L240) method for details). | ||
|
||
##### RPC Timeout Category=rpc_timeout | ||
|
||
[JSON Schema](https://github.com/cloudwego/kitex/blob/develop/pkg/rpctimeout/item_rpc_timeout.go#L42) | ||
|
||
Example: | ||
|
||
> configPath: /KitexConfig/ClientName/ServiceName/rpc_timeout | ||
```json | ||
{ | ||
"*": { | ||
"conn_timeout_ms": 100, | ||
"rpc_timeout_ms": 3000 | ||
}, | ||
"echo": { | ||
"conn_timeout_ms": 50, | ||
"rpc_timeout_ms": 1000 | ||
} | ||
} | ||
``` | ||
Note: The circuit breaker implementation of kitex does not currently support changing the global default configuration (see [initServiceCB](https://github.com/cloudwego/kitex/blob/v0.5.1/pkg/circuitbreak/cbsuite.go#L195) for details). | ||
|
||
##### Circuit Break: Category=circuit_break | ||
|
||
[JSON Schema](https://github.com/cloudwego/kitex/blob/develop/pkg/circuitbreak/item_circuit_breaker.go#L30) | ||
|
||
| Variable | Introduction | | ||
|------------|-----------------------------------| | ||
| min_sample | Minimum statistical sample number | | ||
|
||
Example: | ||
|
||
The echo method uses the following configuration (0.3, 100) and other methods use the global default configuration (0.5, 200) | ||
|
||
> configPath: /KitexConfig/ClientName/ServiceName/circuit_break | ||
```json | ||
{ | ||
"echo": { | ||
"enable": true, | ||
"err_rate": 0.3, | ||
"min_sample": 100 | ||
} | ||
} | ||
``` | ||
### More Info | ||
|
||
Refer to [example](https://github.com/kitex-contrib/config-consul/tree/main/example) for more usage. | ||
|
||
## Compatibility | ||
|
||
the version of Go must >=1.19 | ||
|
||
maintained by: [hiahia12](https://github.com/hiahia12) | ||
|
Oops, something went wrong.