Day09-微服务注册中心(一)ZooKeeper | 青训营笔记

98 阅读3分钟

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

服务注册中心用来实现服务发现和服务的元数据存储。当前rpcx支持多种注册中心, 并且支持进程内的注册中心,方便开发测试。

  1. rpcx会自动将服务的信息比如服务名,监听地址,监听协议,权重等注册到注册中心,同时还会定时的将服务的吞吐率更新到注册中心。
  2. 如果服务意外中断或者宕机,注册中心能够监测到这个事件,它会通知客户端这个服务目前不可用,在服务调用的时候不要再选择这个服务器。
  3. 客户端初始化的时候会从注册中心得到服务器的列表,然后根据不同的路由选择选择合适的服务器进行服务调用。同时注册中心还会通知客户端某个服务暂时不可用,通常客户端会选择一个服务器进行调用。
    本次笔记记录注册中心ZooKeeper的使用和区别:

1、ZooKeeper

  1. ZooKeeper是Apache软件基金会的一个软件项目,他为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper曾经是Hadoop的一个子项目,但现在是一个独立的顶级项目。
  2. ZooKeeper的架构通过冗余服务实现高可用性。因此,如果第一次无应答,客户端就可以询问另一台ZooKeeper主机。
  3. ZooKeeper节点将它们的数据存储于一个分层的命名空间,非常类似于一个文件系统或一个前缀树结构。客户端可以在节点读写,从而以这种方式拥有一个共享的配置服务。更新是全序的。
  4. Zookeeper一个应用场景就是服务发现,在Java生态圈中得到了广泛的应用。Go也可以使用Zookeeper,尤其是在和Java项目混布的情况。

2、ZooKeeper服务器

rpcx 3.0中,对rpcx进行简化, 考虑到了有些用户可能只需要zookeeper的特性,而不需要etcd、consul等特性。解决这个问题的方式就是使用 tag ,需要你在编译的时候指定所需的特性的 tag。加上-tags zookeeper 这个参数, 如果需要多个特性,可以使用 -tags "tag1 tag2 tag3" 这样的参数。

服务端使用Zookeeper唯一的工作就是设置 ZooKeeperRegisterPlugin 这个插件。它主要配置几个参数:

  • ServiceAddress: 本机的监听地址, 这个对外暴露的监听地址, 格式为 tcp@ipaddress:port
  • ZooKeeperServers: Zookeeper集群的地址
  • BasePath: 服务前缀。 如果有多个项目同时使用zookeeper,避免命名冲突,可以设置这个参数,为当前的服务设置命名空间
  • Metrics: 用来更新服务的TPS
  • UpdateInterval: 服务的刷新间隔, 如果在一定间隔内(当前设为2 * UpdateInterval)没有刷新,服务就会从Zookeeper中删除
    配置示例如下:
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.ZooKeeperRegisterPlugin{
        ServiceAddress: "tcp@" + *addr,
        ZooKeeperServers: []string{*zkAddr},
        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 zookeeper server.go

2、客户端

Zookeeper客户端需要设置 ZookeeperDiscovery , 指定 basePathzookeeper集群的地址。示例如下:

d := client.NewZookeeperDiscovery(*basePath, "Arith",[]string{*zkAddr}, nil)
xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()

// go run -tags zookeeper client.go