此版本仍在开发中,尚未被视为稳定版本。如需最新的稳定版本,请使用 Spring Cloud Zookeeper 4.2.0spring-doc.cadn.net.cn

使用 Zookeeper 进行服务发现

服务发现是基于微服务的架构的关键原则之一。正在尝试 手动配置每个客户端或某种形式的约定可能很难做到,而且可能 脆。Curator(Zookeeper 的 Java 库)提供服务 通过服务发现进行发现 扩展。Spring Cloud Zookeeper 使用此扩展进行服务注册,并且 发现。spring-doc.cadn.net.cn

激活

包括 对org.springframework.cloud:spring-cloud-starter-zookeeper-discovery使 auto配置来设置 Spring Cloud Zookeeper Discovery。spring-doc.cadn.net.cn

对于 Web 功能,您仍然需要包括org.springframework.boot:spring-boot-starter-web.
使用 Zookeeper 版本 3.4 时,您需要更改 此处所述的包含依赖项的方式。

向 Zookeeper 注册

当客户端向 Zookeeper 注册时,它会提供元数据(例如主机和端口、ID、 和名称)来了解自身。spring-doc.cadn.net.cn

以下示例显示了一个 Zookeeper 客户端:spring-doc.cadn.net.cn

@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-doc.cadn.net.cn

application.yml
spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181
如果您使用 Spring Cloud Zookeeper Config,则 前面示例中显示的值需要为bootstrap.yml而不是application.yml.

默认服务名称、实例 ID 和端口(取自Environment) 是${spring.application.name}、Spring Context ID 和${server.port}分别。spring-doc.cadn.net.cn

拥有spring-cloud-starter-zookeeper-discovery在 Classpath 中,将 app 同时转换为 一个 Zookeeper “服务”(即它注册自己)和一个“客户端”(即它可以 查询 Zookeeper 以查找其他服务)。spring-doc.cadn.net.cn

如果要禁用 Zookeeper Discovery Client,可以将spring.cloud.zookeeper.discovery.enabledfalse.spring-doc.cadn.net.cn

使用 DiscoveryClient

Spring Cloud 支持 OpenFeign(REST 客户端构建器),RestTemplateWebClient通过 Spring Cloud Loadbalancer,使用逻辑服务名称而不是物理 URL。spring-doc.cadn.net.cn

您还可以使用org.springframework.cloud.client.discovery.DiscoveryClient哪 为发现客户端提供了一个简单的 API,该 API 并非特定于 Netflix,如 以下示例:spring-doc.cadn.net.cn

@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;
}