Kitex-Etcd 拓展 | 青训营笔记

210 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

前言

etcd 是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁,leader 选举和写屏障 (write barriers) 来实现可靠的分布式协作。etcd 集群是为高可用,持久性数据存储和检索而准备。

我们大项目用 Etcd 作为服务发现:

服务发现要解决的也是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口,并且通过名字就可以查找和连接。

Pasted image 20230221203609.png 图片来自李文周老师的博客

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 发送请求的时候报找不到服务的错误,改成正确的名字就可以成功发起调用并返回请求了。

参考资料