详解 ZooKeeper 在微服务注册中心的应用
本文分享自华为云社区《SpringCloud ZooKeeper 详解,以及与Go、Rust等非Java服务的集成》,作者: 张俭。
ZooKeeper,是一个开源的分布式协调服务,不仅支持分布式选举、任务分配,还可以用于微服务的注册中心和配置中心。本文,我们将深入探讨 ZooKeeper 用做微服务注册中心的场景。
ZooKeeper 中的服务注册路径
SpringCloud ZooKeeper 遵循特定的路径结构进行服务注册
示例:
/services 和/${spring.application.name}是 ZooKeeper 中的永久节点,/${serviceId}是临时节点,当服务下线时,ZooKeeper 会自动删除该节点。
注:当微服务的最后一个实例下线时,SpringCloud ZooKeeper 框架会删除/${spring.application.name}节点。
ZooKeeper 中的服务注册数据
下面是一个典型的服务注册内容示例:
其中,address、port 和 uriSpec 是最核心的数据。uriSpec 中的 parts 区分了哪些内容是可变的,哪些是固定的。
SpringCloud 服务使用 OpenFeign 互相调用
一旦两个微服务都注册到了 ZooKeeper,那么它们就可以通过 OpenFeign 互相调用了。简单的示例如下
服务提供者
创建 SpringBoot 项目
创建 SpringBoot 项目,并添加 spring-cloud-starter-zookeeper-discovery 和 spring-boot-starter-web 依赖。
配置 application.yaml
注册到 ZooKeeper
在启动类上添加 @EnableDiscoveryClient 注解。
创建一个简单的 REST 接口
服务消费者
创建 SpringBoot 项目
创建 SpringBoot 项目,并添加 spring-cloud-starter-zookeeper-discovery、spring-cloud-starter-openfeign 和 spring-boot-starter-web 依赖。
配置 application.yaml
注册到 ZooKeeper
在启动类上添加 @EnableDiscoveryClient 注解。
创建一个 REST 接口,通过 OpenFeign 调用服务提供者
运行效果
非 Java 服务在 SpringCloud ZooKeeper 中注册
可能有些读者乍一看觉得有点奇怪,为什么要在 SpringCloud ZooKeeper 中注册非 Java 服务呢?没有这个应用场景。
当然,这样的场景比较少,常见于大部分项目都是用 SpringCloud 开发,但有少部分项目因为种种原因,不得不使用其他语言开发,比如 Go、Rust 等。这时候,我们就需要在 SpringCloud ZooKeeper 中注册非 Java 服务了。
对于非 JVM 语言开发的服务,只需确保它们提供了 Rest/HTTP 接口并正确地注册到 ZooKeeper,就可以被 SpringCloud 的 Feign 客户端所调用。
Go 服务在 SpringCloud ZooKeeper
example 代码组织:
Go 服务提供者在 SpringCloud ZooKeeper
注:该代码的质量为 demo 级别,实际生产环境需要更加严谨的代码,如重连机制、超时机制、更优秀的服务 ID 生成算法等。
调用效果
Go 服务消费者在 SpringCloud ZooKeeper
Rust 服务在 SpringCloud ZooKeeper
example 代码组织:
Rust 服务提供者在 SpringCloud ZooKeeper
Rust 服务消费者在 SpringCloud ZooKeeper
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/5cfea7998022c4ac8165e7835】。文章转载请联系作者。
评论