69. 使用 Zookeeper 进行服务发现

Service Discovery 是基于微服务的 architecture 的 key 原则之一。尝试手动配置每个 client 或某种形式的约定可能非常难以做到并且可能非常脆弱。 馆长(Zookeeper 的 java library)通过服务发现扩展提供服务发现服务。 Spring Cloud Zookeeper 利用此扩展进行服务注册和发现。

69.1 如何激活

包含对org.springframework.cloud:spring-cloud-starter-zookeeper-discovery的依赖将启用 auto-configuration,它将设置 Spring Cloud Zookeeper Discovery。

您仍需要为 web 功能包含org.springframework.boot:spring-boot-starter-web

69.2 注册 Zookeeper

当 client 向 Zookeeper 注册时,它提供 meta-data 关于自身,例如 host 和 port,id 和 name。

Example Zookeeper client:

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

}

(i.e.完全正常 Spring Boot 应用程序)。如果 Zookeeper 位于localhost:2181以外的其他位置,则需要 configuration 来定位服务器。 例:

application.yml.

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

如果使用Spring Cloud Zookeeper 配置,则需要将上述值放在bootstrap.yml而不是application.yml中。

Environment获取的默认服务 name,instance id 和 port 分别是${spring.application.name},Spring Context ID 和${server.port}

在 classpath 上有spring-cloud-starter-zookeeper-discovery使应用程序成为 Zookeeper“服务”(i.e.它自己注册)和“client”(i.e.它可以查询 Zookeeper 以查找其他服务)。

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

69.3 使用 DiscoveryClient

Spring Cloud 支持假装(REST client 构建器),并且Spring RestTemplate使用逻辑服务名称而不是物理 URL。

您还可以使用org.springframework.cloud.client.discovery.DiscoveryClient为发现客户端提供一个简单的 API,该 API 不是特定于 Netflix,e.g.

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