这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
服务注册中心用来实现服务发现和服务的元数据存储。当前rpcx支持多种注册中心, 并且支持进程内的注册中心,方便开发测试。
- rpcx会自动将服务的信息比如服务名,监听地址,监听协议,权重等注册到注册中心,同时还会定时的将服务的吞吐率更新到注册中心。
- 如果服务意外中断或者宕机,注册中心能够监测到这个事件,它会通知客户端这个服务目前不可用,在服务调用的时候不要再选择这个服务器。
- 客户端初始化的时候会从注册中心得到服务器的列表,然后根据不同的路由选择选择合适的服务器进行服务调用。同时注册中心还会通知客户端某个服务暂时不可用,通常客户端会选择一个服务器进行调用。
本次笔记记录注册中心Etcd的使用和区别:
1、Etcd
etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现。,在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。CoreOS 项目就希望基于 etcd 来解决这一问题。
因为是用Go开发的,在Go的生态圈中得到广泛的应用。当然,因为etcd提供了RESTful的接口,其它语言也可以使用。
2、Etcd 服务器
etcd 注册使用和zookeeper非常相像。编译的时候需要加上 etcd tag。服务器需要增加 EtcdRegisterPlugin 插件, 配置参数和Zookeeper的插件相同,它主要配置以下几个参数:
ServiceAddress: 本机的监听地址, 这个对外暴露的监听地址, 格式为tcp@ipaddress:portEtcdServers:etcd集群的地址BasePath: 服务前缀。 如果有多个项目同时使用zookeeper,避免命名冲突,可以设置这个参数,为当前的服务设置命名空间Metrics: 用来更新服务的TPSUpdateInterval: 服务的刷新间隔, 如果在一定间隔内(当前设为2 * UpdateInterval)没有刷新,服务就会从etcd中删除
配置示例如下:
func main() {
flag.Parse()
s := server.NewServer()
addRegistryPlugin(s)
s.RegisterName("Arith", new(example.Arith), "")
s.Serve("tcp", *addr)
}
func addRegistryPlugin(s *server.Server) {
r := &serverplugin.EtcdRegisterPlugin{
ServiceAddress: "tcp@" + *addr,
EtcdServers: []string{*etcdAddr},
BasePath: *basePath,
Metrics: metrics.NewRegistry(),
UpdateInterval: time.Minute,
}
err := r.Start()
if err != nil {
log.Fatal(err)
}
s.Plugins.Add(r)
}
//插件必须在注册服务之前添加到Server中,否则插件没有办法获取注册的服务的信息。
// go run -tags etcd server.go
3、Etcd 客户端
Etcd客户端需要设置 EtcdDiscovery 插件,设置basepath和etcd集群的地址。示例如下:
d := client.NewEtcdDiscovery(*basePath, "Arith",[]string{*etcdAddr}, nil)
xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()
// go run -tags etcd client.go