73. 使用 Zookeeper 进行服务发现
Service Discovery 是基于微服务的 architecture 的 key 原则之一。尝试 hand-configure 每个 client 或某种形式的约定可能很难做到并且可能很脆弱。 馆长(Zookeeper 的 Java library)通过服务发现扩展提供服务发现。 Spring Cloud Zookeeper 使用此扩展进行服务注册和发现。
73.1 激活
包含对org.springframework.cloud:spring-cloud-starter-zookeeper-discovery
的依赖启用自动配置_set Spring Cloud Zookeeper Discovery。
对于 web 功能,您仍需要包含
org.springframework.boot:spring-boot-starter-web
。
使用 Zookeeper 的 version 3.4 时,您需要更改包含依赖关系的方式,如这里所述。
73.2 注册 Zookeeper
当 client 向 Zookeeper 注册时,它会提供有关自身的元数据(例如 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);
}
}
前面的 example 是一个普通的 Spring Boot application。
如果 Zookeeper 位于localhost:2181
以外的其他位置,则 configuration 必须提供服务器的位置,如下面的 example 所示:
application.yml.
spring:
cloud:
zookeeper:
connect-string: localhost:2181
如果使用Spring Cloud Zookeeper 配置,则前面的 example 中显示的值必须是
bootstrap.yml
而不是application.yml
。
默认服务 name,实例 ID 和 port(取自Environment
)分别是${spring.application.name}
,Spring Context ID 和${server.port}
。
classpath 上有spring-cloud-starter-zookeeper-discovery
使应用程序成为 Zookeeper“服务”(即,它自己注册)和“client”(也就是说,它可以查询 Zookeeper 以查找其他服务)。
如果要禁用 Zookeeper Discovery Client,可以将spring.cloud.zookeeper.discovery.enabled
设置为false
。
73.3 使用 DiscoveryClient
Spring Cloud 支持假装(REST 客户端构建器)和Spring RestTemplate,使用逻辑服务名称而不是物理 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;
}