服务发现与Zookeeper
优质
小牛编辑
133浏览
2023-12-01
服务发现是基于微服务架构的关键原则之一。尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱。策展人(一个用于Zookeeper的java库)通过服务发现扩展提供服务发现服务。Spring Cloud Zookeeper利用此扩展功能进行服务注册和发现。
如何激活
包括对org.springframework.cloud:spring-cloud-starter-zookeeper-discovery
的依赖将启用将设置Spring Cloud Zookeeper发现的自动配置。
注意 | 您仍然需要包含org.springframework.boot:spring-boot-starter-web 的网页功能。 |
注册Zookeeper
当客户端注册Zookeeper时,它提供有关自身的元数据,如主机和端口,ID和名称。
示例Zookeeper客户端:
@SpringBootApplication
@EnableDiscoveryClient
@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
以外的地方,则需要配置来定位服务器。例:
spring: cloud: zookeeper: connect-string: localhost:2181
警告 | 如果您使用Spring Cloud Zookeeper配置,上述值将需要放置在bootstrap.yml 而不是application.yml 中。 |
来自Environment
的默认服务名称,实例ID和端口分别为${spring.application.name}
,Spring上下文ID和${server.port}
。
@EnableDiscoveryClient
将应用程序同时进入Zookeeper“服务”(即注册自己)和“客户端”(即可以查询Zookeeper查找其他服务)。
使用DiscoveryClient
Spring Cloud支持Feign(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;
}