使用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;
}