使用Zookeeper进行服务发现

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

激活

引入对 org.springframework.cloud:spring-cloud-starter-zookeeper-discovery 的依赖会启用自动配置,从而设置 Spring Cloud Zookeeper 服务发现。

对于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,配置必须提供服务器位置,如下例所示

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 “服务”(即自身进行注册)和 “客户端”(即可以查询 Zookeeper 来查找其他服务)。

如果您想禁用 Zookeeper 服务发现客户端,可以将 spring.cloud.zookeeper.discovery.enabled 设置为 false

使用DiscoveryClient

Spring Cloud 通过 Spring Cloud Loadbalancer 支持 OpenFeign(一个 REST 客户端构建器)、RestTemplateWebClient,使用逻辑服务名称代替物理URL。

您也可以使用 org.springframework.cloud.client.discovery.DiscoveryClient,它为服务发现客户端提供了一个简单的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;
}