使用zookeeper代替eureka
背景
项目目前使用的eureka版本是1.10.17,该版本是目前最新的版本,这个版本是2021年9月份发布的,到现在也已经快一年没有更新过了。而且eureka2.x版本也停止了开发,所以需要寻找eureka的替换组件。本文就简单梳理下在Spring Cloud中使用zookeeper来替代eureka作为服务注册中心。
软件版本
本次使用的软件版本如下:
zookeeper 3.8.0
Spring Cloud 2021.0.2
Spring Boot 2.6.7
部署zookeeper
-
下载zookeeper软件包
-
上传到服务器并解压
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz
-
进入conf目录,重命名配置文件zoo_sample.cfg为zoo.cfg,并且配置数据目录
-
进入bin目录,执行zkServer.sh脚本,启动zookeeper
sh zkServer.sh start
Spring Cloud Zookeeper配置
Spring Cloud中提供了zookeeper的集成,其实只要修改依赖和配置文件,就可以完成eureka的替换。下面整理了如何使用zookeeper来替换eureka中提供的能力。
本次测试的工程如下,提供一个客户端和一个服务端。
服务注册发现
添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-all</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
启动类上添加@EnableDiscoveryClient,这边还是和eureka一样:
/**
* 客户端
*
* @author yuanzhihao
* @since 2022/7/13
*/
@RequestMapping("/zk-client")
@RestController
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients("com.yzh.zookeeper.feign")
@Slf4j
public class ClientApplication {}
配置文件中添加zookeeper连接的信息:
spring:
application:
name: zookeeper-client
cloud:
zookeeper:
connect-string: 10.211.55.3:2181
启动服务,然后在zookeeper中就可以看见服务已经注册到了services节点下:
获取node节点信息:
关闭服务,对应节点也会被删除,同时,服务的根节点也可以通过配置spring.cloud.zookeeper.discovery.root进行修改,默认为services:
spring:
application:
name: zookeeper-server
cloud:
zookeeper:
connect-string: 10.211.55.3:2181
discovery:
root: /yzh-services # 设置服务发现的root节点
客户端负载均衡
负载均衡和eureka作为服务注册中心使用一样,通过@LoadBalanced注解,在使用RestTemplate访问其他微服务时,可以用微服务的注册名称。具体代码:
RestTemplate restTemplate;
@Bean
@LoadBalanced
RestTemplate restTemplate() {
this.restTemplate = new RestTemplateBuilder().build();
return this.restTemplate;
}
@GetMapping("/hello/rst")
public String helloByRestTemplate() {
String result = restTemplate.getForObject("http://zookeeper-server/hello", String.class);
return "rst " + result;
}
请求验证ok:
对Spring Cloud OpenFeign的支持
OpenFeign也可以通过微服务的注册名称实现服务间的访问,使用方法和之前也一致。
添加feign接口:
@FeignClient(value = "zookeeper-server")
public interface ZkServerFeign {
@RequestMapping(value = "zk-server/hello", method = RequestMethod.GET)
String hello();
}
添加@EnableFeignClients注解指定扫描的包:
@EnableFeignClients("com.yzh.zookeeper.feign")
注入feign客户端,验证请求ok:
@Autowired
private ZkServerFeign serverFeign;
@GetMapping("/hello/feign")
public String helloByFeign() {
String result = serverFeign.hello();
return "feign " + result;
}
结语
Spring Cloud对zookeeper的适配并不像eureka那么完整,比如ssl,鉴权等等,对于一些安全整改可能要自己做一部分适配。也有一些其他的替换方案,比如nacos,consul,大家可以对比参考下。
参考:
https://docs.spring.io/spring-cloud-zookeeper/docs/current/reference/html/
代码地址:
https://github.com/yzh19961031/SpringCloudDemo/tree/main/zookeeper-client
https://github.com/yzh19961031/SpringCloudDemo/tree/main/zookeeper-server