摘要:客戶端負載均衡器是一個客戶端負載均衡器,可以讓你對和客戶端的行為進行大量控制,已經使用了,因此,如果你使用,此部分也適用。
客戶端負載均衡器:Ribbon
Ribbon是一個客戶端負載均衡器,可以讓你對HTTP和TCP客戶端的行為進行大量控制,Feign已經使用了Ribbon,因此,如果你使用@FeignClient,此部分也適用。
Ribbon中的一個核心概念是命名客戶端,每個負載均衡器都是一組組件的一部分,這些組件一起工作以按需聯系遠程服務器,并且該集合具有你作為應用程序開發人員提供的名稱(例如,通過使用@FeignClient注解)。根據需要,Spring Cloud通過使用RibbonClientConfiguration為每個命名客戶端創建一個新的集合作為ApplicationContext,這包含(除其他外)ILoadBalancer、RestClient和ServerListFilter。
如何包含Ribbon要在項目中包含Ribbon,使用組ID為org.springframework.cloud和工件ID為spring-cloud-starter-netflix-ribbon。
自定義Ribbon客戶端你可以使用
Spring Cloud還允許你通過使用@RibbonClient聲明其他配置(在RibbonClientConfiguration之上)來完全控制客戶端,如以下示例所示:
@Configuration @RibbonClient(name = "custom", configuration = CustomConfiguration.class) public class TestConfiguration { }
在這種情況下,客戶端由RibbonClientConfiguration中已有的組件以及CustomConfiguration(后者通常覆蓋前者)中的任何組件組成。
CustomConfiguration類必須是@Configuration類,但要注意它不在@ComponentScan中用于主應用程序上下文,否則,它由所有@RibbonClients共享。如果使用@ComponentScan(或@SpringBootApplication),則需要采取措施以避免包含它(例如,你可以將其放在多帶帶的非重疊包中,或指定要在@ComponentScan中顯式掃描的包)。
下表顯示了Spring Cloud Netflix默認為Ribbon提供的bean:
Bean類型 | Bean名稱 | 類名稱 |
---|---|---|
IClientConfig | ribbonClientConfig | DefaultClientConfigImpl |
IRule | ribbonRule | ZoneAvoidanceRule |
IPing | ribbonPing | DummyPing |
ServerList |
ribbonServerList | ConfigurationBasedServerList |
ServerListFilter |
ribbonServerListFilter | ZonePreferenceServerListFilter |
ILoadBalancer | ribbonLoadBalancer | ZoneAwareLoadBalancer |
ServerListUpdater | ribbonServerListUpdater | PollingServerListUpdater |
創建其中一種類型的bean并將其置于@RibbonClient配置(例如下面的FooConfiguration)中,可以覆蓋所描述的每個bean,如以下示例所示:
@Configuration protected static class FooConfiguration { @Bean public ZonePreferenceServerListFilter serverListFilter() { ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter(); filter.setZone("myTestZone"); return filter; } @Bean public IPing ribbonPing() { return new PingUrl(); } }
前面示例中的語句將NoOpPing替換為PingUrl,并提供自定義serverListFilter。
自定義所有Ribbon客戶端的默認值可以使用@RibbonClients注解并注冊默認配置為所有Ribbon客戶端提供默認配置,如以下示例所示:
@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class) public class RibbonClientDefaultConfigurationTestsConfig { public static class BazServiceList extends ConfigurationBasedServerList { public BazServiceList(IClientConfig config) { super.initWithNiwsConfig(config); } } } @Configuration class DefaultRibbonConfig { @Bean public IRule ribbonRule() { return new BestAvailableRule(); } @Bean public IPing ribbonPing() { return new PingUrl(); } @Bean public ServerList通過設置屬性自定義Ribbon客戶端ribbonServerList(IClientConfig config) { return new RibbonClientDefaultConfigurationTestsConfig.BazServiceList(config); } @Bean public ServerListSubsetFilter serverListFilter() { ServerListSubsetFilter filter = new ServerListSubsetFilter(); return filter; } }
從版本1.2.0開始,Spring Cloud Netflix現在支持通過將屬性設置為與Ribbon文檔兼容來自定義Ribbon客戶端。
這使你可以在不同環境中啟動時更改行為。
以下列表顯示了支持的屬性:
這些屬性中定義的類優先于使用@RibbonClient(configuration=MyRibbonConfig.class)定義的bean以及Spring Cloud Netflix提供的默認值。
要為名為users的服務名稱設置IRule,你可以設置以下屬性:
application.yml
users: ribbon: NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
有關Ribbon提供的實現,請參閱Ribbon文檔。
使用Ribbon與Eureka當Eureka與Ribbon一起使用時(即兩者都在類路徑上),ribbonServerList被DiscoveryEnabledNIWSServerList的擴展覆蓋,該擴展填充Eureka的服務器列表,它還用NIWSDiscoveryPing替換IPing接口,它委托Eureka確定服務器是否啟動,默認情況下安裝的ServerList是DomainExtractingServerList,其目的是在不使用AWS AMI元數據的情況下使負載均衡器可以使用元數據(這是Netflix所依賴的)。默認情況下,服務器列表使用“zone”信息構建,如實例元數據中所提供的(因此,在遠程客戶端上,設置eureka.instance.metadataMap.zone)。如果缺少該標志并且設置了approximateZoneFromHostname標志,則可以使用服務器主機名中的域名作為區域的代理,區域信息可用后,可以在ServerListFilter中使用。默認情況下,它用于在與客戶端相同的區域中查找服務器,因為默認值為ZonePreferenceServerListFilter,默認情況下,客戶端區域的確定方式與遠程實例相同(即通過eureka.instance.metadataMap.zone)。
設置客戶端區域的傳統“archaius”方法是通過名為“@zone”的配置屬性,如果可用,Spring Cloud優先于所有其他設置使用它(請注意,必須在YAML配置中引用該鍵)。
如果沒有其他區域數據源,則根據客戶端配置進行猜測(與實例配置相反),獲取eureka.client.availabilityZones,它是從region名稱到zone列表的映射,并為實例自己的region 拉出第一個zone(即eureka.client.region,默認為“us-east-1”,以便與原生Netflix兼容)。示例:如何在沒有Eureka的情況下使用Ribbon
Eureka是一種抽象遠程服務器發現的便捷方式,因此你無需在客戶端中對其URL進行硬編碼,但是,如果你不想使用Eureka,Ribbon和Feign也可以使用。假設你已為“stores”聲明了@RibbonClient,并且未使用Eureka(甚至在類路徑中也沒有),Ribbon客戶端默認為已配置的服務器列表,你可以按如下方式提供配置:
application.yml
stores: ribbon: listOfServers: example.com,google.com示例:禁用在Ribbon中使用Eureka
將ribbon.eureka.enabled屬性設置為false會顯式禁用在Ribbon中使用Eureka,如以下示例所示:
application.yml
ribbon: eureka: enabled: false直接使用Ribbon API
你也可以直接使用LoadBalancerClient,如以下示例所示:
public class MyClass { @Autowired private LoadBalancerClient loadBalancer; public void doStuff() { ServiceInstance instance = loadBalancer.choose("stores"); URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort())); // ... do something with the URI } }Ribbon配置的緩存
每個Ribbon命名客戶端都有一個Spring Cloud維護的相應子應用程序上下文,在對命名客戶端的第一次請求上延遲加載此應用程序上下文,通過指定Ribbon客戶端的名稱,可以將此延遲加載行為更改為在啟動時急切地加載這些子應用程序上下文,如以下示例所示:
application.yml
ribbon: eager-load: enabled: true clients: client1, client2, client3如何配置Hystrix線程池
如果將zuul.ribbonIsolationStrategy更改為THREAD,則Hystrix的線程隔離策略將用于所有路由,在這種情況下,HystrixThreadPoolKey設置為RibbonCommand作為默認值,這意味著所有路由的HystrixCommands都在同一個Hystrix線程池中執行,可以使用以下配置更改此行為:
application.yml
zuul: threadPool: useSeparateThreadPools: true
前面的示例導致每個路由都在Hystrix線程池中執行HystrixCommands。
在這種情況下,默認HystrixThreadPoolKey與每個路由的服務ID相同,要向HystrixThreadPoolKey添加前綴,請將zuul.threadPool.threadPoolKeyPrefix設置為要添加的值,如以下示例所示:
application.yml
zuul: threadPool: useSeparateThreadPools: true threadPoolKeyPrefix: zuulgw如何為Ribbon的IRule提供一個鍵
如果你需要提供自己的IRule實現來處理特殊的路由要求,如“canary”測試,請將一些信息傳遞給IRule的choose方法。
com.netflix.loadbalancer.IRule.java
public interface IRule{ public Server choose(Object key); :
你可以提供IRule實現用于選擇目標服務器的一些信息,如以下示例所示:
RequestContext.getCurrentContext() .set(FilterConstants.LOAD_BALANCER_KEY, "canary-test");
如果使用FilterConstants.LOAD_BALANCER_KEY的鍵將任何對象放入RequestContext,則會將其傳遞給IRule實現的choose方法,必須在執行RibbonRoutingFilter之前執行前面示例中顯示的代碼,Zuul的預過濾器是最好的選擇。你可以通過預過濾器中的RequestContext訪問HTTP headers和查詢參數,因此可以用它來確定傳遞給Ribbon的LOAD_BALANCER_KEY,如果未在RequestContext中為LOAD_BALANCER_KEY設置任何值,則將null作為choose方法的參數傳遞。
上一篇:Hystrix超時和Ribbon客戶端 下一篇:外部配置:Archaius文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74273.html
摘要:概要什么是實戰整合實現負載均衡是什么是一個客戶端負載均衡的組件什么是負載均衡負載均衡就是分發請求流量到不同的服務器目前的實現有軟件和硬件負載均衡分為兩種服務器端負載均衡如上圖所示服務器端負載均衡是對客戶透明的用戶請求到服務器真正的服務器是由 概要 什么是Spring Cloud Netflix Ribbon? 實戰:整合Ribbon實現負載均衡 Spring Cloud Netfl...
摘要:通用的抽象服務發現負載均衡和斷路器等模式適用于所有客戶端都可以使用的通用抽象層,獨立于實現例如,使用或發現。重試失敗的請求可以將負載均衡的配置為重試失敗的請求,默認情況下,禁用此邏輯,你可以通過將添加到應用程序的類路徑來啟用它。 Spring Cloud Commons:通用的抽象 服務發現、負載均衡和斷路器等模式適用于所有Spring Cloud客戶端都可以使用的通用抽象層,獨立于實...
摘要:當存在時,負載均衡的和會自動重試任何失敗的請求假設你的配置允許這樣做。啟用包括重試請求,由于請求的緩沖,請求會對服務器的資源產生影響。 重試失敗的請求 Spring Cloud Netflix提供了多種方式來發出HTTP請求,你可以使用負載均衡的RestTemplate、Ribbon或Feign。無論你如何選擇創建HTTP請求,總是有可能請求失敗,請求失敗時,你可能希望自動重試請求,要...
摘要:集群系統中的單個計算機通常稱為節點,通常通過局域網連接,但也有其它的可能連接方式。這樣就高興了,可以專心寫自己的,前端就專門交由小周負責了。于是,小周和就變成了協作開發。都是為了項目正常運行以及迭代。 一、前言 只有光頭才能變強 認識我的朋友可能都知道我這陣子去實習啦,去的公司說是用SpringCloud(但我覺得使用的力度并不大啊~~)... 所以,這篇主要來講講SpringClou...
閱讀 1740·2021-11-25 09:43
閱讀 1785·2021-11-24 10:41
閱讀 3105·2021-09-27 13:36
閱讀 811·2019-08-30 15:53
閱讀 3567·2019-08-30 15:44
閱讀 866·2019-08-30 14:03
閱讀 2572·2019-08-29 16:38
閱讀 996·2019-08-29 13:23