cloudwego / kitex

Go RPC framework with high-performance and strong-extensibility for building micro-services.
https://www.cloudwego.io
Apache License 2.0
6.94k stars 807 forks source link

Proposal: 对接 Consul 配置中心 | Consul As Config Center #1135

Closed hiahia12 closed 7 months ago

hiahia12 commented 12 months ago

背景

https://github.com/cloudwego/kitex/issues/973

目标

基于本文描述的配置存储参考规范: 按 Kitex 的 Suite 扩展规范,实现 ConsulClientSuite、ConsulServerSuite; 基于上面实现的方案,写一个简单的例子(Kitex Client & Server),用于展示实际用法;

配置存储参考规范

参考Consul Api

在consul中,配置以Key-Value键值对形式存储,可根据前缀进行分类

consul使用ACL进行数据和接口的保护

字段 | 取值 | 说明 -- | -- | -- key | string | 键名,url的一部分,放在/kv后 value | []byte,大小不能超过512kb | 值 flag | uint64,默认是0,可自定义 | 用户自定义的某个有意义的值 sessionId||

客户端配置

超时:Category=rpc_timeout

配置信息格式为 JSON,其 Schema 为

map[string]*rpctimeout.RPCTimeout // 分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

说明:

例如: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 方法)

熔断:Category=circuit_break

配置信息格式为 JSON,其 Schema 为

map[string]*circuitbreak.CBConfigItem

注:

例如:Echo 方法使用下面的配置(0.3、100),其他方法使用全局默认配置(0.5、200)

{
"Echo": {
  "enable": true,
  "err_rate": 0.3,
  "min_sample": 100
}
}

注:kitex 的熔断实现目前不支持修改全局默认配置(详见 initServiceCB

服务端

限流:Category=limit

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
}

注:

  1. 限流配置的粒度是 Server 全局,不分 client、method

  2. 「未配置」或「取值为 0」表示不开启

  3. 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 # 参考
felix021 commented 11 months ago

麻烦再细化一点说明一下配置在 consul 中的存储结构

hiahia12 commented 11 months ago

麻烦再细化一点说明一下配置在 consul 中的存储结构

现在在外面,约四五天后我会继续细化

felix021 commented 11 months ago

可以加入我们的 飞书专项群 ,方便沟通