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