跳到主要内容

使用 ZooKeeper 进行服务发现

TranslateGemma 中英对照 Service Discovery with Zookeeper

服务发现是基于微服务架构的关键要素之一。手动配置每个客户端或采用某种约定方法可能既困难又容易出错。Curator(一个用于 Zookeeper 的 Java 库)通过服务发现扩展提供服务发现功能。Spring Cloud Zookeeper 使用此扩展来进行服务注册和发现。

激活​

包含对 org.springframework.cloud:spring-cloud-starter-zookeeper-discovery 的依赖项,可启用自动配置,从而设置 Spring Cloud Zookeeper Discovery。

备注

为了实现 Web 功能,您仍然需要包含 org.springframework.boot:spring-boot-starter-web。

警告

在使用 Zookeeper 3.4 版本时,你需要更改添加依赖项的方式,具体方法请参见此处。

在 ZooKeeper 中注册​

当客户端向 Zookeeper 注册时,它会提供关于自身的元数据(例如主机和端口、ID 和名称)。

以下示例展示了一个 Zookeeper 客户端:

@SpringBootApplication
@RestController
public class Application {

@RequestMapping("/")
public String home() {
return "Hello world";
}

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}

}
备注

前面的示例是一个标准的 Spring Boot 应用程序。

如果 ZooKeeper 的位置不是 localhost:2181,则配置中必须提供服务器的位置,如下例所示:

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

如果您使用Spring Cloud Zookeeper Config,则上述示例中显示的值需要放在 bootstrap.yml 文件中,而不是 application.yml 文件中。

默认的服务名称、实例 ID 和端口(分别从 Environment 中获取)为 ${spring.application.name}、Spring 上下文 ID 和 ${server.port}。

在类路径中包含 spring-cloud-starter-zookeeper-discovery 会使应用程序既成为 Zookeeper “服务”(即,它会注册自身),又成为“客户端”(即,它可以查询 Zookeeper 来定位其他服务)。

如果您想禁用 ZooKeeper Discovery Client,可以将 spring.cloud.zookeeper.discovery.enabled 设置为 false。

使用 DiscoveryClient​

Spring Cloud 支持使用 OpenFeign(一个 REST 客户端构建器)、RestTemplate 和 WebClient,并通过 Spring Cloud Loadbalancer 使用逻辑服务名称而不是物理 URL。

您还可以使用 org.springframework.cloud.client.discovery.DiscoveryClient,它为发现客户端提供了一个简单的 API,该 API 不特定于 Netflix,如以下示例所示:

@Autowired
private DiscoveryClient discoveryClient;

public String serviceUrl() {
List<ServiceInstance> list = discoveryClient.getInstances("STORES");
if (list != null && list.size() > 0 ) {
return list.get(0).getUri().toString();
}
return null;
}