这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
前言
etcd 是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁,leader 选举和写屏障 (write barriers) 来实现可靠的分布式协作。etcd 集群是为高可用,持久性数据存储和检索而准备。
我们大项目用 Etcd 作为服务发现:
服务发现要解决的也是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口,并且通过名字就可以查找和连接。
图片来自李文周老师的博客
Kitex-Etcd 拓展
Kitex 框架支持 Etcd 拓展,应用在大项目中就比较方便。下面是一个简单的示例:
Kitex 服务端:
import (
...
"github.com/cloudwego/kitex/pkg/rpcinfo"
"github.com/cloudwego/kitex/server"
etcd "github.com/kitex-contrib/registry-etcd"
...
)
func main() {
...
r, err := etcd.NewEtcdRegistry([]string{"127.0.0.1:2379"}) // r should not be reused.
if err != nil {
log.Fatal(err)
}
// https://www.cloudwego.io/docs/tutorials/framework-exten/registry/#integrate-into-kitex
server, err := echo.NewServer(new(EchoImpl),
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "echo"}),
server.WithRegistry(r))
if err != nil {
log.Fatal(err)
}
err = server.Run()
if err != nil {
log.Fatal(err)
}
...
}
Kitex 客户端:
import (
...
"github.com/cloudwego/kitex/client"
etcd "github.com/kitex-contrib/registry-etcd"
...
)
func main() {
...
r, err := etcd.NewEtcdResolver([]string{"127.0.0.1:2379"})
if err != nil {
log.Fatal(err)
}
client, err := echo.NewClient("echo", client.WithResolver(r))
if err != nil {
log.Fatal(err)
}
...
}
然后注意我踩了一个坑就是,我在服务端注册的时候把 ServiceName 写错了,导致用 Apifox 发送请求的时候报找不到服务的错误,改成正确的名字就可以成功发起调用并返回请求了。