Spring Cloud Commons(Greenwich.SR6)
-
- Spring Cloud Commons
- 服務發現
- 服務注冊
- RestTemplate 負載均衡用戶端
- WebClient 負載均衡用戶端
- Spring WebFlux WebClient 負載均衡
- 忽略網絡位址
Spring Cloud Commons
服務發現,負載平衡和電路斷路器等模式将它們帶到一個通用的抽象層,可以由所有Spring Cloud用戶端使用,而與實作無關
服務發現
spring-cloud-commons.jar提供了@EnableDiscoveryClient注解。它将在META-INF/spring.factorie中查找DiscoveryClient的實作類。DiscoveryClient的實作類将一個配置類添加到spring.factories的org.springframework.cloud.client.discovery.EnableDiscoveryClient鍵下。
DiscoveryClient的實作類有:
- Spring Cloud Netflix Eureka
- Spring Cloud Consul Discovery
- Spring Cloud Zookeeper Discovery
@EnableDiscoveryClient注解不是必須的,隻要在類路徑上有DiscoveryClient的實作就足以将本地spring boot注冊到遠端發現伺服器,如eureka的@EnableEurekaServer注解。
服務健康檢查(Health Indicator)
可通過實作 DiscoveryHealthIndicator 接口實作自定義健康檢查
服務注冊
commons提供了一個ServiceRegistry 接口讓使用者自定義服務注冊。
EurekaServiceRegistry,ZookeeperServiceRegistry,ConsulServiceRegistry便是就實作了該接口。
禁用自動注冊的兩種方法:
- @EnableDiscoveryClient注解上加 autoRegister=false
- 設定spring.cloud.service-registry.auto-registration.enabled=false
服務注冊執行器端點
commons提供了一個服務執行器端點 /service-registry,通過GET調用/service-registry/instance-status可以傳回執行器端點的狀态。
RestTemplate 負載均衡用戶端
為了建立一個擁有負載均衡的RestTemplate ,隻需建立一個RestTemplate 的bean并使用@LoadBalanced注解。
@Configuration
public class MyConfiguration {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
public class MyClass {
@Autowired
private RestTemplate restTemplate;
public String doOtherStuff() {
// url必須使用虛拟主機名(即服務名,而不是主機名)
String results = restTemplate.getForObject("http://服務名/上下文路徑/資源位址", String.class);
return results;
}
}
為了使用負載均衡RestTemplate,您需要在類路徑中有一個負載均衡器實作。
推薦的實作是BlockingLoadBalancerClient,需要添加
org.springframework.cloud:spring-cloud-loadbalancer依賴。如果要使用
BlockingLoadBalancerClient,請確定您沒有 RibbonLoadBalancerClient在項目
類路徑中,因為出于向後相容的原因,預設情況下将使用它。
WebClient 負載均衡用戶端
WebClient可以自動配置為使用負載平衡器用戶端。要建立負載均衡的WebClient,請建立一個WebClient.Builder @Bean并使用@LoadBalanced限定符,如以下示例所示:
@Configuration
public class MyConfiguration {
@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
}
public class MyClass {
@Autowired
private WebClient.Builder webClientBuilder;
public Mono<String> doOtherStuff() {
// uri必須使用虛拟主機名(即服務名,而不是主機名)
return webClientBuilder.build().get().uri("http://stores/stores")
.retrieve().bodyToMono(String.class);
}
}
為了使用負載均衡WebClient,您需要在類路徑中有一個負載均衡器實作。建議添加org.springframework.cloud:spring-cloud-loadbalancer依賴。然後ReactiveLoadBalancer将被使用。或者,此功能也可以與spring-cloud-starter-netflix-ribbon一起使用,但該請求會被一個non-reactive的LoadBalancerClient處理。
失敗重試
Spring WebFlux WebClient 負載均衡
public class MyClass {
@Autowired
private ReactorLoadBalancerExchangeFilterFunction lbFunction;
public Mono<String> doOtherStuff() {
return WebClient.builder().baseUrl("http://stores")
.filter(lbFunction)
.build()
.get()
.uri("/stores")
.retrieve()
.bodyToMono(String.class);
}
}
如果包含org.springframework.cloud:spring-cloud-loadbalancer依賴,則ReactorLoadBalancerExchangeFilterFunction将自動配置。如果沒有org.springframework.cloud:spring-cloud-loadbalancer,但包含spring-cloud-starter-netflix-ribbon依賴,則LoadBalancerExchangeFilterFunction 将自動配置。
建議使用具有響應式的負載均衡ReactorLoadBalancerExchangeFilterFunction ,而不建議使用LoadBalancerExchangeFilterFunction。