这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
服务注册中心用来实现服务发现和服务的元数据存储。当前rpcx支持多种注册中心, 并且支持进程内的注册中心,方便开发测试。
- rpcx会自动将服务的信息比如服务名,监听地址,监听协议,权重等注册到注册中心,同时还会定时的将服务的吞吐率更新到注册中心。
- 如果服务意外中断或者宕机,注册中心能够监测到这个事件,它会通知客户端这个服务目前不可用,在服务调用的时候不要再选择这个服务器。
- 客户端初始化的时候会从注册中心得到服务器的列表,然后根据不同的路由选择选择合适的服务器进行服务调用。同时注册中心还会通知客户端某个服务暂时不可用,通常客户端会选择一个服务器进行调用。
本次笔记记录注册中心Consul的使用:
1、Consul
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。Consul是分布式的、高可用的、 可横向扩展的。它具备以下特性:
- 服务发现:
Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。 - 健康检测:
Consul的Client提供了健康检查的机制,可以通过用来避免流量被转发到有故障的服务上。 - Key/Value存储: 应用程序可以根据自己的需要使用
Consul提供的Key/Value存储。Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。 - 多数据中心:
Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。 - Consul也是使用Go开发的,在Go生态圈也被广泛应用。使用
consul需要添加consul tag
2、Consul 服务器
服务器端的开发和zookeeper、etcd类似。需要配置 ConsulRegisterPlugin 插件。它主要配置几个参数:
ServiceAddress: 本机的监听地址, 这个对外暴露的监听地址,格式为tcp@ipaddress:portConsulServers:consul集群的地址BasePath: 服务前缀。 如果有多个项目同时使用consul,避免命名冲突,可以设置这个参数,为当前的服务设置命名空间Metrics: 用来更新服务的TPSUpdateInterval: 服务的刷新间隔, 如果在一定间隔内(当前设为2 * UpdateInterval)没有刷新,服务就会从consul中删除
配置示例如下:
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.ConsulRegisterPlugin{
ServiceAddress: "tcp@" + *addr,
ConsulServers: []string{*consulAddr},
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 consul server.go
3、Consul客户端
Consul配置 ConsulDiscovery ,使用 basepath 和consul的地址。示例如下:
d := client.NewConsulDiscovery(*basePath, "Arith",[]string{*consulAddr}, nil)
xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()