使用 Zookeeper 进行服务发现

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

激活

包含 org.springframework.cloud:spring-cloud-starter-zookeeper-discovery 的依赖项将启用自动配置,该自动配置会设置 Spring Cloud Zookeeper Discovery。

对于 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 Discovery 客户端,可以将 spring.cloud.zookeeper.discovery.enabled 设置为 false

使用 DiscoveryClient

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

您还可以使用 org.springframework.cloud.client.discovery.DiscoveryClient,它为发现客户端提供了不特定于 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;
}
© . This site is unofficial and not affiliated with VMware.