Spring Boot 中注册服务到 Zookeeper 的两种方式详解
前言
服务注册和发现是分布式系统的关键问题之一,Spring Cloud 中采用 Eureka 作为服务注册和发现的组件,但是在 Zookeeper 这种经过时间验证并且稳定可靠的中间件也有许多人选择在使用中心化服务注册时采用它。Spring Boot 通过 spring-cloud-starter-zookeeper-discovery
流行的项目中已经支持到了这个问题。
本篇文章则针对 Spring Boot 项目如何将服务注册到 Zookeeper 作出详细讲解,介绍两种服务注册方式。
方式一:使用 Spring Cloud 去注册服务到 Zookeeper
使用 Spring Cloud 方式需要引用以下的依赖:
<!-- 服务注册到 Zookeeper -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
引入该依赖,spring-boot 项目即开启了注册服务到 Zookeeper 的功能。
在 application.properties
文件中配置 Zookeeper 的地址:
spring.cloud.zookeeper.connect-string=127.0.0.1:2181
在工程启动类上添加 @EnableDiscoveryClient
注解:
@EnableDiscoveryClient
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在配置完成之后,注册到 Zookeeper 的流程就已经自动启动了。但是,这种方式需要使用 Spring Cloud,如果你的项目中没有使用 Spring Cloud,那么可以采用第二种方式来实现 Zookeeper 的服务注册。
方式二:使用 Curator Framework 去注册服务到 Zookeeper
Curator Framework 是 Zookeeper 官方提供的一个客户端库,提供了一系列丰富实用的 API,可以简化 Zookeeper 的操作。所以我们也可以用 Curator 去完成我们的服务注册。
首先,引入依赖:
<!-- Zookeeper 客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
然后加入配置项:
# Zookeeper 地址
zookeeper.host=localhost
zookeeper.port=2181
zookeeper.rootPath=/demo
这样在启动工程后,将会把本服务对外提供的一个完整路径地址,存储到 Zookeeper 上。
这里贴出一个 Curator 服务注册租约示例:
@Service
public class ZookeeperServiceImpl implements ZookeeperService {
private final CuratorFramework client;
@Value("${zookeeper.host}")
private String host;
@Value("${zookeeper.port}")
private String port;
@Value("${zookeeper.rootPath}")
private String rootPath;
public ZookeeperServiceImpl() {
RetryPolicy retryPolicy = new RetryNTimes(5, 5000);
this.client = CuratorFrameworkFactory.newClient(host + ":" + port, retryPolicy);
this.client.start();
}
@Override
public void register(String serviceName, InetAddress serviceAddress, int servicePort) throws Exception {
// 格式化服务根路径
String path = "/" + rootPath + "/" + serviceName + "/" + serviceAddress.getHostAddress() + "_" + servicePort;
// 创建服务临时节点并写入数据
client.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)
.forPath(path, String.format("%s:%d", serviceAddress.getHostAddress(), servicePort).getBytes(Charset.forName("UTF-8")));
}
@Override
public void remove(String serviceName, InetAddress serviceAddress, int servicePort) throws Exception {
// 格式化服务根路径
String path = "/" + rootPath + "/" + serviceName + "/" + serviceAddress.getHostAddress() + "_" + servicePort;
// 删除服务节点
client.delete().guaranteed().forPath(path);
}
@Override
public List<String> listService(String serviceName) throws Exception {
if (client.checkExists().forPath("/" + rootPath + "/" + serviceName) == null) {
throw new Exception(serviceName + " 服务不存在");
}
return client.getChildren().forPath("/" + rootPath + "/" + serviceName);
}
}
总结
以上便是 Spring Boot 注册服务到 Zookeeper 的两种方式:使用 Spring Cloud、使用 Curator Framework,根据不同的场景可以选择不同的方式。这样做能够使你的分布式应用程序更加健壮,更加容易进行管理,需要的同学可以尝试运用在自己的项目中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 注册服务注册中心(zk)的两种方式详解 - Python技术站