摘要:通用的抽象服務發現負載均衡和斷路器等模式適用于所有客戶端都可以使用的通用抽象層,獨立于實現例如,使用或發現。重試失敗的請求可以將負載均衡的配置為重試失敗的請求,默認情況下,禁用此邏輯,你可以通過將添加到應用程序的類路徑來啟用它。
Spring Cloud Commons:通用的抽象
服務發現、負載均衡和斷路器等模式適用于所有Spring Cloud客戶端都可以使用的通用抽象層,獨立于實現(例如,使用Eureka或Consul發現)。
@EnableDiscoveryClientSpring Cloud Commons提供@EnableDiscoveryClient注解,這將使用META-INF/spring.factories查找DiscoveryClient接口的實現。Discovery Client的實現將配置類添加到org.springframework.cloud.client.discovery.EnableDiscoveryClient鍵下的spring.factories,DiscoveryClient實現的示例包括Spring Cloud Netflix Eureka,Spring Cloud Consul Discovery和Spring Cloud Zookeeper Discovery。
默認情況下,DiscoveryClient的實現會使用遠程發現服務器自動注冊本地Spring Boot服務器,通過在@EnableDiscoveryClient中設置autoRegister=false可以禁用此行為。
@EnableDiscoveryClient已不再需要,你可以在類路徑上放置DiscoveryClient實現,以使Spring Boot應用程序向服務發現服務器注冊。健康指示器
Commons創建了一個Spring Boot HealthIndicator,DiscoveryClient實現可以通過實現DiscoveryHealthIndicator來參與,要禁用混合HealthIndicator,請設置spring.cloud.discovery.client.composite-indicator.enabled=false。基于DiscoveryClient的通用HealthIndicator是自動配置的(DiscoveryClientHealthIndicator)。要禁用它,請設置spring.cloud.discovery.client.health-indicator.enabled=false,要禁用DiscoveryClientHealthIndicator的description字段,請設置spring.cloud.discovery.client.health-indicator.include-description=false,否則,它可能會像卷起的HealthIndicator的description一樣冒出來。
排序DiscoveryClient實例DiscoveryClient接口擴展了Ordered,這在使用多個發現客戶端時很有用,因為它允許你定義返回的發現客戶端的順序,類似于你可以如何排序Spring應用程序加載的bean。默認情況下,任何DiscoveryClient的順序都設置為0,如果要為自定義DiscoveryClient實現設置不同的順序,只需重寫getOrder()方法,以便它返回適合你的設置的值。除此之外,你還可以使用屬性來設置Spring Cloud提供的DiscoveryClient實現的順序,其中包括ConsulDiscoveryClient,EurekaDiscoveryClient和ZookeeperDiscoveryClient,為此,你只需將spring.cloud.{clientIdentifier}.discovery.order(或Eureka的eureka.client.order)屬性設置為所需的值。
ServiceRegistryCommons現在提供一個ServiceRegistry接口,提供register(Registration)和deregister(Registration)等方法,讓你提供自定義注冊服務,Registration是一個標記接口。
以下示例顯示ServiceRegistry的使用:
@Configuration @EnableDiscoveryClient(autoRegister=false) public class MyConfiguration { private ServiceRegistry registry; public MyConfiguration(ServiceRegistry registry) { this.registry = registry; } // called through some external process, such as an event or a custom actuator endpoint public void register() { Registration registration = constructRegistration(); this.registry.register(registration); } }
每個ServiceRegistry實現都有自己的Registry實現。
ZookeeperRegistration與ZookeeperServiceRegistry一起使用
EurekaRegistration與EurekaServiceRegistry一起使用
ConsulRegistration與ConsulServiceRegistry一起使用
如果你使用的是ServiceRegistry接口,則需要為正在使用的ServiceRegistry實現傳遞正確的Registry實現。
ServiceRegistry自動注冊默認情況下,ServiceRegistry實現會自動注冊正在運行的服務,要禁用該行為,你可以設置: @EnableDiscoveryClient(autoRegister=false)永久禁用自動注冊, spring.cloud.service-registry.auto-registration.enabled=false通過配置禁用行為。
ServiceRegistry自動注冊事件當服務自動注冊時,將觸發兩個事件,第一個事件名為InstancePreRegisteredEvent,在注冊服務之前觸發,第二個事件名為InstanceRegisteredEvent,在注冊服務后觸發,你可以注冊一個ApplicationListener來監聽并響應這些事件。
如果spring.cloud.service-registry.auto-registration.enabled設置為false,則不會觸發這些事件。Service Registry Actuator端點
Spring Cloud Commons提供/service-registry執行器端點,此端點依賴于Spring Application Context中的Registration bean,使用GET調用/service-registry返回Registration的狀態,將POST用于具有JSON體的同一端點會將當前Registration的狀態更改為新值,JSON體必須包含具有首選值的status字段。在更新狀態和為狀態返回的值時,請參閱用于允許值的ServiceRegistry實現的文檔,例如,Eureka支持的狀態是UP、DOWN、OUT_OF_SERVICE和UNKNOWN。
Spring RestTemplate作為負載均衡客戶端RestTemplate可以自動配置為使用ribbon,要創建負載均衡的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() { String results = restTemplate.getForObject("http://stores/stores", String.class); return results; } }
不再通過自動配置創建RestTemplate bean,單個應用程序必須創建它。
URI需要使用虛擬主機名(即服務名稱,而不是主機名),Ribbon客戶端用于創建完整的物理地址,有關如何設置RestTemplate的詳細信息,請參見RibbonAutoConfiguration。
Spring WebClient作為負載均衡客戶端WebClient可以自動配置為使用LoadBalancerClient,要創建負載均衡的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 MonodoOtherStuff() { return webClientBuilder.build().get().uri("http://stores/stores") .retrieve().bodyToMono(String.class); } }
URI需要使用虛擬主機名(即服務名稱,而不是主機名),Ribbon客戶端用于創建完整的物理地址。
重試失敗的請求可以將負載均衡的RestTemplate配置為重試失敗的請求,默認情況下,禁用此邏輯,你可以通過將Spring Retry添加到應用程序的類路徑來啟用它。負載均衡的RestTemplate支持與重試失敗的請求相關的一些Ribbon配置值,你可以使用client.ribbon.MaxAutoRetries、client.ribbon.MaxAutoRetriesNextServer和client.ribbon.OkToRetryOnAllOperations屬性,如果要在類路徑上使用Spring Retry禁用重試邏輯,可以設置spring.cloud.loadbalancer.retry.enabled=false,有關這些屬性的說明,請參閱Ribbon文檔。
如果要在重試中實現BackOffPolicy,則需要創建LoadBalancedRetryFactory類型的bean并覆蓋createBackOffPolicy方法:
@Configuration public class MyConfiguration { @Bean LoadBalancedRetryFactory retryFactory() { return new LoadBalancedRetryFactory() { @Override public BackOffPolicy createBackOffPolicy(String service) { return new ExponentialBackOffPolicy(); } }; } }
前面示例中的client應替換為你的Ribbon客戶端的名稱。
如果要將一個或多個RetryListener實現添加到重試功能中,你需要創建一個類型為LoadBalancedRetryListenerFactory的bean并返回你要用于給定服務的RetryListener數組,如以下示例所示:
@Configuration public class MyConfiguration { @Bean LoadBalancedRetryListenerFactory retryListenerFactory() { return new LoadBalancedRetryListenerFactory() { @Override public RetryListener[] createRetryListeners(String service) { return new RetryListener[]{new RetryListener() { @Override public多個RestTemplate對象boolean open(RetryContext context, RetryCallback callback) { //TODO Do you business... return true; } @Override public void close(RetryContext context, RetryCallback callback, Throwable throwable) { //TODO Do you business... } @Override public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { //TODO Do you business... } }}; } }; } }
如果你想要一個非負載均衡的RestTemplate,請創建一個RestTemplate bean并將其注入,要訪問負載均衡的RestTemplate,請在創建@Bean時使用@LoadBalanced限定符,如以下示例所示:
@Configuration public class MyConfiguration { @LoadBalanced @Bean RestTemplate loadBalanced() { return new RestTemplate(); } @Primary @Bean RestTemplate restTemplate() { return new RestTemplate(); } } public class MyClass { @Autowired private RestTemplate restTemplate; @Autowired @LoadBalanced private RestTemplate loadBalanced; public String doOtherStuff() { return loadBalanced.getForObject("http://stores/stores", String.class); } public String doStuff() { return restTemplate.getForObject("http://example.com", String.class); } }
請注意在前面示例中的普通RestTemplate聲明中使用@Primary注解來消除無條件的@Autowired注入的歧義。
如果你看到java.lang.IllegalArgumentException: Can not set org.springframework.web.client.RestTemplate field com.my.app.Foo.restTemplate to com.sun.proxy.$Proxy89,嘗試注入RestOperations或設置spring.aop.proxyTargetClass=true。Spring WebFlux WebClient作為負載均衡客戶端
可以將WebClient配置為使用LoadBalancerClient,如果spring-webflux位于類路徑上,則自動配置LoadBalancerExchangeFilterFunction,以下示例顯示如何配置WebClient以使用負載均衡:
public class MyClass { @Autowired private LoadBalancerExchangeFilterFunction lbFunction; public MonodoOtherStuff() { return WebClient.builder().baseUrl("http://stores") .filter(lbFunction) .build() .get() .uri("/stores") .retrieve() .bodyToMono(String.class); } }
URI需要使用虛擬主機名(即服務名稱,而不是主機名),LoadBalancerClient用于創建完整的物理地址。
忽略網絡接口有時,忽略某些命名的網絡接口以便從Service Discovery注冊中排除它們(例如,在Docker容器中運行時)是有用的,可以設置正則表達式列表以使所需的網絡接口被忽略,以下配置忽略docker0接口和以veth開頭的所有接口:
application.yml
spring: cloud: inetutils: ignoredInterfaces: - docker0 - veth.*
你還可以使用正則表達式列表強制僅使用指定的網絡地址,如以下示例所示:
bootstrap.yml
spring: cloud: inetutils: preferredNetworks: - 192.168 - 10.0
你還可以強制僅使用站點本地地址,如以下示例所示:
application.yml
spring: cloud: inetutils: useOnlySiteLocalInterfaces: true
有關構成站點本地地址的更多詳細信息,請參閱Inet4Address.html.isSiteLocalAddress()。
HTTP客戶端工廠Spring Cloud Commons提供用于創建Apache HTTP客戶端(ApacheHttpClientFactory)和OK HTTP客戶端(OkHttpClientFactory)的bean,僅當OK HTTP jar位于類路徑上時,才會創建OkHttpClientFactory bean。此外,Spring Cloud Commons提供了創建用于兩個客戶端使用的連接管理器的bean:Apache HTTP客戶端的ApacheHttpClientConnectionManagerFactory和OK HTTP客戶端的OkHttpClientConnectionPoolFactory。如果要自定義在下游項目中創建HTTP客戶端的方式,可以提供自己的這些bean實現,此外,如果你提供類型為HttpClientBuilder或OkHttpClient.Builder的bean,則默認工廠使用這些構建器作為返回到下游項目的構建器的基礎,你還可以通過將spring.cloud.httpclientfactories.apache.enabled或spring.cloud.httpclientfactories.ok.enabled設置為false來禁用這些bean的創建。
啟用特性Spring Cloud Commons提供/features執行器端點,此端點返回類路徑上可用的特性以及它們是否已啟用,返回的信息包括特性類型、名稱、版本和供應商。
特性類型有兩種類型的"特性":抽象和命名。
抽象特性是定義接口或抽象類并創建實現(如DiscoveryClient、LoadBalancerClient或LockService)的特性,抽象類或接口用于在上下文中查找該類型的bean,顯示的版本是bean.getClass().getPackage().getImplementationVersion()。
命名特性是沒有他們實現的特定類的特性,例如“斷路器”,“API網關”,“Spring Cloud Bus”等,這些特性需要名稱和bean類型。
聲明特性任何模塊都可以聲明任意數量的HasFeature bean,如以下示例所示:
@Bean public HasFeatures commonsFeatures() { return HasFeatures.abstractFeatures(DiscoveryClient.class, LoadBalancerClient.class); } @Bean public HasFeatures consulFeatures() { return HasFeatures.namedFeatures( new NamedFeature("Spring Cloud Bus", ConsulBusAutoConfiguration.class), new NamedFeature("Circuit Breaker", HystrixCommandAspect.class)); } @Bean HasFeatures localFeatures() { return HasFeatures.builder() .abstractFeature(Foo.class) .namedFeature(new NamedFeature("Bar Feature", Bar.class)) .abstractFeature(Baz.class) .build(); }
這些bean中的每一個都應該放在一個受到適當保護的@Configuration中。
Spring Cloud兼容性驗證由于某些用戶在設置Spring Cloud應用程序時遇到問題,因此決定添加兼容性驗證機制,如果你當前的設置與Spring Cloud要求不兼容,并且報告顯示出現了什么問題,它將會中斷。
目前我們驗證哪個版本的Spring Boot被添加到你的類路徑中。
報告示例
*************************** APPLICATION FAILED TO START *************************** Description: Your project setup is incompatible with our requirements due to following reasons: - Spring Boot [2.1.0.RELEASE] is not compatible with this Spring Cloud release train Action: Consider applying the following actions: - Change Spring Boot version to one of the following versions [1.2.x, 1.3.x] . You can find the latest Spring Boot versions here [https://spring.io/projects/spring-boot#learn]. If you want to learn more about the Spring Cloud Release train compatibility, you can visit this page [https://spring.io/projects/spring-cloud#overview] and check the [Release Trains] section.
要禁用此功能,請將spring.cloud.compatibility-verifier.enabled設置為false,如果要覆蓋兼容的Spring Boot版本,只需使用逗號分隔的兼容Spring Boot版本列表設置spring.cloud.compatibility-verifier.compatible-boot-versions屬性。
上一篇:Spring Cloud Context:應用程序上下文服務 下一篇:Spring Cloud Config快速入門文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77560.html
摘要:快速入門這個快速入門使用的服務器和客戶端。屬性在端點中顯示為高優先級屬性源,如以下示例所示。名為的屬性源包含值為且具有最高優先級的屬性。屬性源名稱中的是存儲庫,而不是配置服務器。 Spring Cloud Config快速入門 這個快速入門使用Spring Cloud Config Server的服務器和客戶端。 首先,啟動服務器,如下所示: $ cd spring-cloud-con...
摘要:下一篇介紹基于的服務注冊與調用。服務提供者工程配置這里服務提供者是使用之前進階教程第三篇整合連接池以及監控改造而來,這里一樣的部分就不再重復說明,下面將說明新增的部分。 Spring Cloud簡介 Spring Cloud是一個基于Spring Boot實現的云應用開發工具,它為基于JVM的云應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分...
摘要:它們的優先級低于或以及作為創建應用程序過程的正常部分添加到子級的任何其他屬性源。為引導配置類使用單獨的包名稱,并確保或注解的配置類尚未涵蓋該名稱。在這種情況下,它會在刷新時重建,并重新注入其依賴項,此時,它們將從刷新的重新初始化。 Spring Cloud Context:應用程序上下文服務 Spring Boot有一個關于如何使用Spring構建應用程序的主見,例如,它具有通用配置文...
閱讀 3595·2021-11-04 16:06
閱讀 3590·2021-09-09 11:56
閱讀 855·2021-09-01 11:39
閱讀 906·2019-08-29 15:28
閱讀 2301·2019-08-29 15:18
閱讀 837·2019-08-29 13:26
閱讀 3339·2019-08-29 13:22
閱讀 1053·2019-08-29 12:18