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. 测试验证
部署后验证流程:
- HelloWorld 服务向 Zookeeper 注册
- Greeting 服务通过 Feign Client 调用 HelloWorld
- 访问
http://localhost:8083/get-greeting
应返回:Hello World!
6. 总结
本文通过 Spring Cloud Zookeeper 实现了服务发现机制,核心要点:
- ✅ 服务提供者(HelloWorld)注册到 Zookeeper
- ✅ 服务消费者(Greeting)通过 Feign Client 调用服务
- ✅ 无需硬编码服务地址,实现动态服务发现
完整代码示例可在 GitHub 获取。踩坑提醒:确保 Zookeeper 版本与 Spring Cloud 兼容,避免连接问题。