使用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 客户端构建器)、RestTemplate
和 WebClient
,使用逻辑服务名称代替物理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;
}