使用 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 註冊時,它會提供關於自身的 metadata(例如主機和埠、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 Context ID 和 ${server.port}

在 classpath 上擁有 spring-cloud-starter-zookeeper-discovery 會使應用程式同時成為 Zookeeper「服務」(也就是說,它會註冊自身)和「用戶端」(也就是說,它可以查詢 Zookeeper 以尋找其他服務)。

如果您想要停用 Zookeeper Discovery Client,您可以將 spring.cloud.zookeeper.discovery.enabled 設定為 false

使用 DiscoveryClient

Spring Cloud 透過 OpenFeign (REST 用戶端建構器)、RestTemplateWebClientSpring Cloud Loadbalancer 支援,使用邏輯服務名稱而不是實體 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;
}