kitex Etcd配置中心
Etcd配置中心
安装
Suite
etcd 的配置中心适配器,kitex 通过 WithSuite 将 etcd 中的配置转换为 kitex 的治理特性配置。
suite结构体
type EtcdServerSuite struct {
uid int64
etcdClient etcd.Client // config-etcd 中的 etcd client
service string
opts utils.Options
}
函数签名:
func NewSuite(service string, cli etcd.Client, opts …utils.Option,) *EtcdServerSuite
服务端代码
package main
import "C"
import (
"github.com/cloudwego/kitex/pkg/rpcinfo"
"github.com/cloudwego/kitex/server"
etcd_c "github.com/kitex-contrib/config-etcd/etcd"
etcdServer "github.com/kitex-contrib/config-etcd/server"
etcd_r "github.com/kitex-contrib/registry-etcd"
"log"
"mykitex/kitex_gen/example/shop/item/itemservice"
"net"
)
func main() {
// 设置服务注册,使用时请传入真实 etcd 的服务地址,本例中为 127.0.0.1:2379
r, err := etcd_r.NewEtcdRegistry([]string{"127.0.0.1:2379"})
// 从指定的etcd服务器中建立连接
etcdClient, _ := etcd_c.NewClient(etcd_c.Options{})
if err != nil {
log.Fatal(err)
}
addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8890")
svr := itemservice.NewServer(new(ItemServiceImpl),
server.WithServiceAddr(addr),
// 指定 Registry 与服务基本信息
server.WithRegistry(r),
server.WithServerBasicInfo(
&rpcinfo.EndpointBasicInfo{
ServiceName: "example.shop.item",
},
),
server.WithSuite(etcdServer.NewSuite("example.shop.item", etcdClient)),
)
err = svr.Run()
if err != nil {
log.Println(err.Error())
}
}
客户端代码
package main
import (
"context"
"log"
"mykitex/kitex_gen/example/shop/item"
"mykitex/kitex_gen/example/shop/item/itemservice"
"time"
"github.com/cloudwego/kitex/client"
etcdclient "github.com/kitex-contrib/config-etcd/client"
"github.com/kitex-contrib/config-etcd/etcd"
)
func main() {
etcdClient, err := etcd.NewClient(etcd.Options{})
if err != nil {
panic(err)
}
serviceName := "example.shop.item" // 你的服务端名称
clientName := "ClientName" // 你的客户端名称
cl, err := itemservice.NewClient(
serviceName,
client.WithHostPorts("0.0.0.0:8888"),
client.WithSuite(etcdclient.NewSuite(serviceName, clientName, etcdClient)),
)
for {
if err != nil {
log.Println("发现服务失败")
}
p, _ := cl.GetItem(context.Background(), &item.GetItemReq{Id: 1})
log.Println(p)
time.Sleep(time.Second)
}
}
代码解析
etcdClient, err := etcd.NewClient(etcd.Options{})
首先我们调用以上代码与服务与用于配置中心的etcd建立连接,系统默认的是连接路径是http://127.0.0.1:2379。
然后使用以下代码,把我们的配置注入新生成的客户端中
client.WithSuite(etcdclient.NewSuite(serviceName, clientName, etcdClient))
在说明访问路径之前我们首先要说明options结构体
options
type Options struct {
Node []string
Prefix string
ServerPathFormat string
ClientPathFormat string
Timeout time.Duration
LoggerConfig *zap.Config
ConfigParser ConfigParser
}
etcd 中的 key 由 prefix 和 path 组成,prefix 为前缀,path 为路径。
参数 | 变量默认值 | 作用 |
---|---|---|
Node | 127.0.0.1:2379 | Etcd 服务器节点 |
Prefix | /KitexConfig | Etcd 中的 prefix |
ClientPathFormat | {{.ClientServiceName}}/{{.ServerServiceName}}/{{.Category}} | 使用 go template 语法渲染生成对应的 ID, 使用 ClientServiceName ServiceName Category 三个元数据,用于和 Prefix 组成 etcd 中配置的 key |
ServerPathFormat | {{.ServerServiceName}}/{{.Category}} | 使用 go template 语法渲染生成对应的 ID, 使用 ServiceName Category 两个元数据,用于和 Prefix 组成 etcd 中配置的 key |
Timeout 5 * time.Second 五秒超时时间 | ||
LoggerConfig | NULL | 默认日志 |
ConfigParser | defaultConfigParser | 默认解析器,默认为解析 json 格式的数据 |
其中的Category的值不需要我们指定,他们有自己的常量值,客户端中有三种,类型种类如下,更多配置请参考https://www.cloudwego.io/zh/docs/kitex/tutorials/service-governance/config-center/etcd/#options-%E9%BB%98%E8%AE%A4%E5%80%BC 系统自动开启,如果配置中心有数据便会加载,配置的数据,注意默认情况下我们的解析器是json解析器,只能解析json格式的数据。
const (
retryConfigName = "retry" // 重试
rpcTimeoutConfigName = "rpc_timeout" // rpc_timeout
circuitBreakerConfigName = "circuit_break" //circuit_break
)
接下来回到我们加载数据的过程,以以下代码为例
serviceName := "example.shop.item" // 你的服务端名称
clientName := "ClientName" // 你的客户端名称
cl, err := itemservice.NewClient(
serviceName,
client.WithHostPorts("0.0.0.0:8888"),
client.WithSuite(etcdclient.NewSuite(serviceName, clientName, etcdClient)),
)
这样我们访问的路径为以下三个
127.0.0.1:2379/KitexConfig/example.shop.item/ClientName/retry
127.0.0.1:2379/KitexConfig/example.shop.item/ClientName/rpc_timeout
127.0.0.1:2379/KitexConfig/example.shop.item/ClientName/circuit_break
- 点赞
- 收藏
- 关注作者
评论(0)