Closed hiahia12 closed 7 months ago
https://github.com/cloudwego/kitex/issues/973
基于本文描述的配置存储参考规范: 按 Kitex 的 Suite 扩展规范,实现 ConsulClientSuite、ConsulServerSuite; 基于上面实现的方案,写一个简单的例子(Kitex Client & Server),用于展示实际用法;
参考Consul Api
在consul中,配置以Key-Value键值对形式存储,可根据前缀进行分类
consul使用ACL进行数据和接口的保护
配置信息格式为 JSON,其 Schema 为
map[string]*rpctimeout.RPCTimeout // 分method指定超时配置
说明:
rpctimeout.RPCTimeout: https://github.com/cloudwego/kitex/blob/develop/pkg/rpctimeout/item_rpc_timeout.go#L42
map 的 key 是 methodName,用于分 method 指定超时配置
当 methodName = * 时,表示这是默认配置,如果找不到 method 配置,会默认使用这个配置
例如:Echo 方法链接超时 50ms、请求超时 1s,其他方法连接超时 100ms、请求超时 2s
{ "*": { "conn_timeout_ms": 100, "rpc_timeout_ms": 2000 }, "Echo": { "conn_timeout_ms": 50, "rpc_timeout_ms": 1000 }}
注:Kitex 只区分连接超时和读写超时,因此只需要指定两个字段即可。
map[string]*retry.Policy
retry.Policy: https://github.com/cloudwego/kitex/blob/develop/pkg/retry/policy.go#L63
例如:Echo 方法启用备用请求(200ms后未返回则发出),其他请求都默认失败重试3次
{ "*": { "enable": true, "type": 0, // 失败重试(type=0) "failure_policy": { "stop_policy": { "max_retry_times": 3, "max_duration_ms": 2000, "cb_policy": { "error_rate": 0.5 } }, "backoff_policy": { "backoff_type": "fixed", "cfg_items": { "fix_ms": 50 } } } }, "Echo": { "enable": true, "type": 1, // 备用请求(type=1) "backup_policy": { "retry_delay_ms": 200, "stop_policy": { "max_retry_times": 2, "max_duration_ms": 1000, "cb_policy": { "error_rate": 0.3 } } } }}
注:retry.Container 内置支持用 * 通配符指定默认配置(详见 getRetryer 方法)
map[string]*circuitbreak.CBConfigItem
注:
circuitbreak.CBConfigItem: https://github.com/cloudwego/kitex/blob/develop/pkg/circuitbreak/item_circuit_breaker.go#L30
例如:Echo 方法使用下面的配置(0.3、100),其他方法使用全局默认配置(0.5、200)
{ "Echo": { "enable": true, "err_rate": 0.3, "min_sample": 100 }}
注:kitex 的熔断实现目前不支持修改全局默认配置(详见 initServiceCB)
Group 里 CallerName 的值留空,表示是服务端配置,与客户端无关
配置信息格式为 JSON,其 Schema 为 limiter.LimiterConfig
type LimiterConfig struct { ConnectionLimit int64 `json:"connection_limit"` QPSLimit int64 `json:"qps_limit"`}
例如:最大100并发 && 每 100ms 内最大 2000QPS
{ "connection_limit": 100, "qps_limit": 200}
限流配置的粒度是 Server 全局,不分 client、method
「未配置」或「取值为 0」表示不开启
connection_limit 和 qps_limit 可以独立配置,例如 connection_limit = 100, qps_limit = 0
麻烦再细化一点说明一下配置在 consul 中的存储结构
现在在外面,约四五天后我会继续细化
可以加入我们的 飞书专项群 ,方便沟通
背景
https://github.com/cloudwego/kitex/issues/973
目标
基于本文描述的配置存储参考规范: 按 Kitex 的 Suite 扩展规范,实现 ConsulClientSuite、ConsulServerSuite; 基于上面实现的方案,写一个简单的例子(Kitex Client & Server),用于展示实际用法;
配置存储参考规范
参考Consul Api
在consul中,配置以Key-Value键值对形式存储,可根据前缀进行分类
consul使用ACL进行数据和接口的保护
客户端配置
超时:Category=rpc_timeout
配置信息格式为 JSON,其 Schema 为
map[string]*rpctimeout.RPCTimeout // 分method指定超时配置
说明:
rpctimeout.RPCTimeout: https://github.com/cloudwego/kitex/blob/develop/pkg/rpctimeout/item_rpc_timeout.go#L42
map 的 key 是 methodName,用于分 method 指定超时配置
当 methodName = * 时,表示这是默认配置,如果找不到 method 配置,会默认使用这个配置
例如:Echo 方法链接超时 50ms、请求超时 1s,其他方法连接超时 100ms、请求超时 2s
注:Kitex 只区分连接超时和读写超时,因此只需要指定两个字段即可。
重试:Category=retry
配置信息格式为 JSON,其 Schema 为
map[string]*retry.Policy
说明:
retry.Policy: https://github.com/cloudwego/kitex/blob/develop/pkg/retry/policy.go#L63
例如:Echo 方法启用备用请求(200ms后未返回则发出),其他请求都默认失败重试3次
注:retry.Container 内置支持用 * 通配符指定默认配置(详见 getRetryer 方法)
熔断:Category=circuit_break
配置信息格式为 JSON,其 Schema 为
map[string]*circuitbreak.CBConfigItem
注:
circuitbreak.CBConfigItem: https://github.com/cloudwego/kitex/blob/develop/pkg/circuitbreak/item_circuit_breaker.go#L30
例如:Echo 方法使用下面的配置(0.3、100),其他方法使用全局默认配置(0.5、200)
注:kitex 的熔断实现目前不支持修改全局默认配置(详见 initServiceCB)
服务端
限流:Category=limit
配置信息格式为 JSON,其 Schema 为 limiter.LimiterConfig
例如:最大100并发 && 每 100ms 内最大 2000QPS
注:
限流配置的粒度是 Server 全局,不分 client、method
「未配置」或「取值为 0」表示不开启
connection_limit 和 qps_limit 可以独立配置,例如 connection_limit = 100, qps_limit = 0
参考
## **背景** https://github.com/cloudwego/kitex/issues/973 ## 目标 基于本文描述的配置存储参考规范: 按 Kitex 的 [[Suite 扩展规范](https://www.cloudwego.io/docs/kitex/tutorials/framework-exten/suite/)](https://www.cloudwego.io/docs/kitex/tutorials/framework-exten/suite/),实现 ConsulClientSuite、ConsulServerSuite; 基于上面实现的方案,写一个简单的例子(Kitex Client & Server),用于展示实际用法; ## 配置存储参考规范 参考[[Consul Api](https://developer.hashicorp.com/consul/api-docs)](https://developer.hashicorp.com/consul/api-docs) 在consul中,配置以Key-Value键值对形式存储,可根据前缀进行分类 consul使用ACL进行数据和接口的保护 | 字段 | 取值 | 说明 | | ----- | ------------------------- | ---------------------------- | | key | string | 键名,url的一部分,放在/kv后 | | value | []byte | 值 | | flag | uint64,默认是0,可自定义 | 用户自定义的某个有意义的值 | ## 客户端配置 ### 超时:Category=rpc_timeout 配置信息格式为 JSON,其 Schema 为 ``` map[string]*rpctimeout.RPCTimeout // 分method指定超时配置 ``` 说明: - rpctimeout.RPCTimeout: https://github.com/cloudwego/kitex/blob/develop/pkg/rpctimeout/item_rpc_timeout.go#L42 - map 的 key 是 methodName,用于分 method 指定超时配置 - 当 methodName = * 时,表示这是默认配置,如果找不到 method 配置,会默认使用这个配置 例如:Echo 方法链接超时 50ms、请求超时 1s,其他方法连接超时 100ms、请求超时 2s ``` { "*": { "conn_timeout_ms": 100, "rpc_timeout_ms": 2000 }, "Echo": { "conn_timeout_ms": 50, "rpc_timeout_ms": 1000 } } ``` 注:Kitex 只区分连接超时和读写超时,因此只需要指定两个字段即可。 ### 重试:Category=retry 配置信息格式为 JSON,其 Schema 为 ``` map[string]*retry.Policy ``` 说明: - retry.Policy: https://github.com/cloudwego/kitex/blob/develop/pkg/retry/policy.go#L63 例如:Echo 方法启用备用请求(200ms后未返回则发出),其他请求都默认失败重试3次 ``` { "*": { "enable": true, "type": 0, // 失败重试(type=0) "failure_policy": { "stop_policy": { "max_retry_times": 3, "max_duration_ms": 2000, "cb_policy": { "error_rate": 0.5 } }, "backoff_policy": { "backoff_type": "fixed", "cfg_items": { "fix_ms": 50 } } } }, "Echo": { "enable": true, "type": 1, // 备用请求(type=1) "backup_policy": { "retry_delay_ms": 200, "stop_policy": { "max_retry_times": 2, "max_duration_ms": 1000, "cb_policy": { "error_rate": 0.3 } } } } } ``` 注:retry.Container 内置支持用 * 通配符指定默认配置(详见 [[getRetryer](https://github.com/cloudwego/kitex/blob/v0.5.1/pkg/retry/retryer.go#L240)](https://github.com/cloudwego/kitex/blob/v0.5.1/pkg/retry/retryer.go#L240) 方法) ### 熔断:Category=circuit_break 配置信息格式为 JSON,其 Schema 为 ``` map[string]*circuitbreak.CBConfigItem ``` 注: - circuitbreak.CBConfigItem: https://github.com/cloudwego/kitex/blob/develop/pkg/circuitbreak/item_circuit_breaker.go#L30 例如:Echo 方法使用下面的配置(0.3、100),其他方法使用全局默认配置(0.5、200) ``` { "Echo": { "enable": true, "err_rate": 0.3, "min_sample": 100 } } ``` 注:kitex 的熔断实现目前不支持修改全局默认配置(详见 [[initServiceCB](https://github.com/cloudwego/kitex/blob/v0.5.1/pkg/circuitbreak/cbsuite.go#L195)](https://github.com/cloudwego/kitex/blob/v0.5.1/pkg/circuitbreak/cbsuite.go#L195)) ## 服务端 ### 限流:Category=limit > Group 里 CallerName 的值留空,表示是服务端配置,与客户端无关 配置信息格式为 JSON,其 Schema 为 [[limiter.LimiterConfig](https://github.com/cloudwego/kitex/blob/develop/pkg/limiter/item_limiter.go#L33)](https://github.com/cloudwego/kitex/blob/develop/pkg/limiter/item_limiter.go#L33) ``` type LimiterConfig struct { ConnectionLimit int64 `json:"connection_limit"` QPSLimit int64 `json:"qps_limit"` } ``` 例如:最大100并发 && 每 100ms 内最大 2000QPS ``` { "connection_limit": 100, "qps_limit": 200 } ``` 注: 1. 限流配置的粒度是 Server 全局,不分 client、method 2. 「未配置」或「取值为 0」表示不开启 3. connection_limit 和 qps_limit 可以独立配置,例如 connection_limit = 100, qps_limit = 0 # 参考