Service Discovery with Zookeeper

服务发现是基于微服务的体系结构的关键原则之一。尝试手动配置每个客户端或某种形式的约定可能会很困难且脆弱。 Curator(用于 Zookeeper 的 Java 库)通过 Service Discovery Extension 提供服务发现。Spring Cloud Zookeeper 使用此扩展进行服务注册和发现。

Activating

依赖 org.springframework.cloud:spring-cloud-starter-zookeeper-discovery 可以启用自动配置,以设置 Spring Cloud Zookeeper Discovery。

针对 Web 功能性,您仍需要包含`org.springframework.boot:spring-boot-starter-web`。

在使用 Zookeeper 版本 3.4 时,您需要按照 here 中的说明更改包含依赖项的方式。

Registering with 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` 之外的其他位置,配置必须提供服务器的位置,如下例所示:

application.yml
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 “service”(也就是说它将注册自身)和 “client”(也就是说它可以查询 Zookeeper 来找到其他服务)。

如果你想禁用 Zookeeper Discovery Client,你可以将`spring.cloud.zookeeper.discovery.enabled` 设置为 false

Using the DiscoveryClient

Spring Cloud 通过 Spring Cloud Loadbalancer,使用逻辑服务名称而非物理 URL,对 OpenFeign(REST 客户端生成器)、`RestTemplate`和 `WebClient`提供支持。

你还可以使用 org.springframework.cloud.client.discovery.DiscoveryClient,该 API 为与 Netflix 无关的发现客户端提供了一个简单的 API,如下例所示:

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