1. 概述

本文将带你了解 Zookeeper 及其作为服务发现组件的应用。服务发现本质上是在云环境中集中管理服务信息的机制。

Spring Cloud Zookeeper 通过自动配置和与 Spring 环境的绑定,为 Spring Boot 应用提供 Apache Zookeeper 集成能力。

2. 服务发现架构搭建

我们将构建两个应用:

  • 服务提供者:提供具体服务的应用
  • 服务消费者:调用服务的应用

Apache Zookeeper 在架构中扮演协调者角色。安装指南可参考官方文档

3. 服务提供者注册

通过添加 spring-cloud-starter-zookeeper-discovery 依赖并在主类使用 @EnableDiscoveryClient 注解启用服务注册。下面以返回 "Hello World!" 的 REST 服务为例逐步说明。

3.1. Maven 依赖

pom.xml 中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.1.14.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3.2. 服务提供者注解

主类添加 @EnableDiscoveryClient 使服务可被发现:

@SpringBootApplication
@EnableDiscoveryClient
public class HelloWorldApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }
}

简单控制器实现:

@GetMapping("/helloworld")
public String helloWorld() {
    return "Hello World!";
}

3.3. YAML 配置

创建 application.yml 配置日志和服务发现:

spring:
  application:
    name: HelloWorld
  cloud:
    zookeeper:
      discovery:
        enabled: true
logging:
  level:
    org.apache.zookeeper.ClientCnxn: WARN

⚠️ 注意:应用默认连接本地 2181 端口。若 Zookeeper 在其他位置,需添加:

spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181

4. 服务消费者

创建 REST 服务消费者,使用 Spring Netflix Feign Client 实现服务调用。

4.1. Maven 依赖

添加以下依赖到 pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

4.2. 服务消费者注解

主类同样添加 @EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient
public class GreetingApplication {
    public static void main(String[] args) {
        SpringApplication.run(GreetingApplication.class, args);
    }
}

4.3. 使用 Feign Client 发现服务

Netflix 的 Feign 项目允许声明式定义 REST 客户端。通过 @EnableFeignClients 启用功能:

@Configuration
@EnableFeignClients
@EnableDiscoveryClient
public class HelloWorldClient {
 
    @Autowired
    private TheClient theClient;

    @FeignClient(name = "HelloWorld")
    interface TheClient {
        @RequestMapping(path = "/helloworld", method = RequestMethod.GET)
        @ResponseBody
        String helloWorld();
    }
    
    public String HelloWorld() {
        return theClient.HelloWorld();
    }
}

关键点:

  • @FeignClient(name = "HelloWorld") 指向服务提供者注册的应用名
  • 接口方法定义与服务提供者接口对应

4.4. 控制器类

消费者控制器调用 Feign Client:

@RestController
public class GreetingController {
 
    @Autowired
    private HelloWorldClient helloWorldClient;

    @GetMapping("/get-greeting")
    public String greeting() {
        return helloWorldClient.helloWorld();
    }
}

4.5. YAML 配置

创建 application.yml 配置日志和 Zookeeper 连接:

logging:
  level:
    org.apache.zookeeper.ClientCnxn: WARN

若 Zookeeper 非本地,添加连接配置:

spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181

5. 测试验证

部署后验证流程:

  1. HelloWorld 服务向 Zookeeper 注册
  2. Greeting 服务通过 Feign Client 调用 HelloWorld
  3. 访问 http://localhost:8083/get-greeting 应返回:
    Hello World!
    

6. 总结

本文通过 Spring Cloud Zookeeper 实现了服务发现机制,核心要点:

  • ✅ 服务提供者(HelloWorld)注册到 Zookeeper
  • ✅ 服务消费者(Greeting)通过 Feign Client 调用服务
  • ✅ 无需硬编码服务地址,实现动态服务发现

完整代码示例可在 GitHub 获取。踩坑提醒:确保 Zookeeper 版本与 Spring Cloud 兼容,避免连接问题。


原始标题:An Intro to Spring Cloud Zookeeper | Baeldung