kitex Etcd配置中心

举报
未来日记 发表于 2024/03/31 15:56:32 2024/03/31
【摘要】 Etcd配置中心 安装go get github.com/kitex-contrib/config-etcd Suiteetcd 的配置中心适配器,kitex 通过 WithSuite 将 etcd 中的配置转换为 kitex 的治理特性配置。 suite结构体type EtcdServerSuite struct { uid int64 etcdClient e...

Etcd配置中心

安装

go get github.com/kitex-contrib/config-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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。