服务发现与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以外的地方,则需要配置来定位服务器。例:

application.yml
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;
}