使用Zookeeper進行服務發現

服務發現是基於微服務架構的關鍵原則之一。手動配置每個客戶端或使用某種約定可能很困難且脆弱。Curator(一個用於Zookeeper的Java庫)透過其服務發現擴充套件提供了服務發現功能。Spring Cloud 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 客戶端構建器)、RestTemplateWebClient,使用邏輯服務名稱代替物理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;
}