Yuandupier

Yuandupier

使用zookeeper代替eureka

26
0
0
2022-07-13

背景

项目目前使用的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

  1. 下载zookeeper软件包

  2. 上传到服务器并解压

    tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz
    
  3. 进入conf目录,重命名配置文件zoo_sample.cfg为zoo.cfg,并且配置数据目录 在这里插入图片描述

  4. 进入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