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

激活

包括对 enables 的依赖 设置 Spring Cloud Zookeeper Discovery 的自动配置。org.springframework.cloud:spring-cloud-starter-zookeeper-discoverySpring中文文档

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

向 Zookeeper 注册

当客户端向 Zookeeper 注册时,它会提供元数据(例如主机和端口、ID、 和名字)关于它自己。Spring中文文档

以下示例显示了 Zookeeper 客户端:Spring中文文档

@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:2181Spring中文文档

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

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

在类路径上使应用程序同时成为 一个 Zookeeper“服务”(即它自己注册)和一个“客户端”(即它可以 查询 Zookeeper 以查找其他服务)。spring-cloud-starter-zookeeper-discoverySpring中文文档

如果要禁用 Zookeeper 发现客户端,可以设置为 。spring.cloud.zookeeper.discovery.enabledfalseSpring中文文档

前面的示例是一个普通的 Spring Boot 应用程序。
如果使用 Spring Cloud Zookeeper Config,则 前面示例中显示的值需要为 in,而不是 。bootstrap.ymlapplication.yml

使用 DiscoveryClient

Spring Cloud 支持 OpenFeign(REST 客户端构建器),并通过 Spring Cloud Loadbalancer,使用逻辑服务名称而不是物理 URL。RestTemplateWebClientSpring中文文档

您还可以使用 ,其中 为发现客户端提供了一个简单的 API,该 API 并非特定于 Netflix 的,如 以下示例:org.springframework.cloud.client.discovery.DiscoveryClientSpring中文文档

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