摘要:客戶端負(fù)載均衡器是一個客戶端負(fù)載均衡器,可以讓你對和客戶端的行為進(jìn)行大量控制,已經(jīng)使用了,因此,如果你使用,此部分也適用。
客戶端負(fù)載均衡器:Ribbon
Ribbon是一個客戶端負(fù)載均衡器,可以讓你對HTTP和TCP客戶端的行為進(jìn)行大量控制,F(xiàn)eign已經(jīng)使用了Ribbon,因此,如果你使用@FeignClient,此部分也適用。
Ribbon中的一個核心概念是命名客戶端,每個負(fù)載均衡器都是一組組件的一部分,這些組件一起工作以按需聯(lián)系遠(yuǎn)程服務(wù)器,并且該集合具有你作為應(yīng)用程序開發(fā)人員提供的名稱(例如,通過使用@FeignClient注解)。根據(jù)需要,Spring Cloud通過使用RibbonClientConfiguration為每個命名客戶端創(chuàng)建一個新的集合作為ApplicationContext,這包含(除其他外)ILoadBalancer、RestClient和ServerListFilter。
如何包含Ribbon要在項(xiàng)目中包含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中用于主應(yīng)用程序上下文,否則,它由所有@RibbonClients共享。如果使用@ComponentScan(或@SpringBootApplication),則需要采取措施以避免包含它(例如,你可以將其放在多帶帶的非重疊包中,或指定要在@ComponentScan中顯式掃描的包)。
下表顯示了Spring Cloud Netflix默認(rèn)為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 |
創(chuàng)建其中一種類型的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客戶端的默認(rèn)值可以使用@RibbonClients注解并注冊默認(rèn)配置為所有Ribbon客戶端提供默認(rèn)配置,如以下示例所示:
@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通過設(shè)置屬性自定義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現(xiàn)在支持通過將屬性設(shè)置為與Ribbon文檔兼容來自定義Ribbon客戶端。
這使你可以在不同環(huán)境中啟動時更改行為。
以下列表顯示了支持的屬性:
這些屬性中定義的類優(yōu)先于使用@RibbonClient(configuration=MyRibbonConfig.class)定義的bean以及Spring Cloud Netflix提供的默認(rèn)值。
要為名為users的服務(wù)名稱設(shè)置IRule,你可以設(shè)置以下屬性:
application.yml
users: ribbon: NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
有關(guān)Ribbon提供的實(shí)現(xiàn),請參閱Ribbon文檔。
使用Ribbon與Eureka當(dāng)Eureka與Ribbon一起使用時(即兩者都在類路徑上),ribbonServerList被DiscoveryEnabledNIWSServerList的擴(kuò)展覆蓋,該擴(kuò)展填充Eureka的服務(wù)器列表,它還用NIWSDiscoveryPing替換IPing接口,它委托Eureka確定服務(wù)器是否啟動,默認(rèn)情況下安裝的ServerList是DomainExtractingServerList,其目的是在不使用AWS AMI元數(shù)據(jù)的情況下使負(fù)載均衡器可以使用元數(shù)據(jù)(這是Netflix所依賴的)。默認(rèn)情況下,服務(wù)器列表使用“zone”信息構(gòu)建,如實(shí)例元數(shù)據(jù)中所提供的(因此,在遠(yuǎn)程客戶端上,設(shè)置eureka.instance.metadataMap.zone)。如果缺少該標(biāo)志并且設(shè)置了approximateZoneFromHostname標(biāo)志,則可以使用服務(wù)器主機(jī)名中的域名作為區(qū)域的代理,區(qū)域信息可用后,可以在ServerListFilter中使用。默認(rèn)情況下,它用于在與客戶端相同的區(qū)域中查找服務(wù)器,因?yàn)槟J(rèn)值為ZonePreferenceServerListFilter,默認(rèn)情況下,客戶端區(qū)域的確定方式與遠(yuǎn)程實(shí)例相同(即通過eureka.instance.metadataMap.zone)。
設(shè)置客戶端區(qū)域的傳統(tǒng)“archaius”方法是通過名為“@zone”的配置屬性,如果可用,Spring Cloud優(yōu)先于所有其他設(shè)置使用它(請注意,必須在YAML配置中引用該鍵)。
如果沒有其他區(qū)域數(shù)據(jù)源,則根據(jù)客戶端配置進(jìn)行猜測(與實(shí)例配置相反),獲取eureka.client.availabilityZones,它是從region名稱到zone列表的映射,并為實(shí)例自己的region 拉出第一個zone(即eureka.client.region,默認(rèn)為“us-east-1”,以便與原生Netflix兼容)。示例:如何在沒有Eureka的情況下使用Ribbon
Eureka是一種抽象遠(yuǎn)程服務(wù)器發(fā)現(xiàn)的便捷方式,因此你無需在客戶端中對其URL進(jìn)行硬編碼,但是,如果你不想使用Eureka,Ribbon和Feign也可以使用。假設(shè)你已為“stores”聲明了@RibbonClient,并且未使用Eureka(甚至在類路徑中也沒有),Ribbon客戶端默認(rèn)為已配置的服務(wù)器列表,你可以按如下方式提供配置:
application.yml
stores: ribbon: listOfServers: example.com,google.com示例:禁用在Ribbon中使用Eureka
將ribbon.eureka.enabled屬性設(shè)置為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維護(hù)的相應(yīng)子應(yīng)用程序上下文,在對命名客戶端的第一次請求上延遲加載此應(yīng)用程序上下文,通過指定Ribbon客戶端的名稱,可以將此延遲加載行為更改為在啟動時急切地加載這些子應(yīng)用程序上下文,如以下示例所示:
application.yml
ribbon: eager-load: enabled: true clients: client1, client2, client3如何配置Hystrix線程池
如果將zuul.ribbonIsolationStrategy更改為THREAD,則Hystrix的線程隔離策略將用于所有路由,在這種情況下,HystrixThreadPoolKey設(shè)置為RibbonCommand作為默認(rèn)值,這意味著所有路由的HystrixCommands都在同一個Hystrix線程池中執(zhí)行,可以使用以下配置更改此行為:
application.yml
zuul: threadPool: useSeparateThreadPools: true
前面的示例導(dǎo)致每個路由都在Hystrix線程池中執(zhí)行HystrixCommands。
在這種情況下,默認(rèn)HystrixThreadPoolKey與每個路由的服務(wù)ID相同,要向HystrixThreadPoolKey添加前綴,請將zuul.threadPool.threadPoolKeyPrefix設(shè)置為要添加的值,如以下示例所示:
application.yml
zuul: threadPool: useSeparateThreadPools: true threadPoolKeyPrefix: zuulgw如何為Ribbon的IRule提供一個鍵
如果你需要提供自己的IRule實(shí)現(xiàn)來處理特殊的路由要求,如“canary”測試,請將一些信息傳遞給IRule的choose方法。
com.netflix.loadbalancer.IRule.java
public interface IRule{ public Server choose(Object key); :
你可以提供IRule實(shí)現(xiàn)用于選擇目標(biāo)服務(wù)器的一些信息,如以下示例所示:
RequestContext.getCurrentContext() .set(FilterConstants.LOAD_BALANCER_KEY, "canary-test");
如果使用FilterConstants.LOAD_BALANCER_KEY的鍵將任何對象放入RequestContext,則會將其傳遞給IRule實(shí)現(xiàn)的choose方法,必須在執(zhí)行RibbonRoutingFilter之前執(zhí)行前面示例中顯示的代碼,Zuul的預(yù)過濾器是最好的選擇。你可以通過預(yù)過濾器中的RequestContext訪問HTTP headers和查詢參數(shù),因此可以用它來確定傳遞給Ribbon的LOAD_BALANCER_KEY,如果未在RequestContext中為LOAD_BALANCER_KEY設(shè)置任何值,則將null作為choose方法的參數(shù)傳遞。
上一篇:Hystrix超時和Ribbon客戶端 下一篇:外部配置:Archaius文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74273.html
摘要:概要什么是實(shí)戰(zhàn)整合實(shí)現(xiàn)負(fù)載均衡是什么是一個客戶端負(fù)載均衡的組件什么是負(fù)載均衡負(fù)載均衡就是分發(fā)請求流量到不同的服務(wù)器目前的實(shí)現(xiàn)有軟件和硬件負(fù)載均衡分為兩種服務(wù)器端負(fù)載均衡如上圖所示服務(wù)器端負(fù)載均衡是對客戶透明的用戶請求到服務(wù)器真正的服務(wù)器是由 概要 什么是Spring Cloud Netflix Ribbon? 實(shí)戰(zhàn):整合Ribbon實(shí)現(xiàn)負(fù)載均衡 Spring Cloud Netfl...
摘要:通用的抽象服務(wù)發(fā)現(xiàn)負(fù)載均衡和斷路器等模式適用于所有客戶端都可以使用的通用抽象層,獨(dú)立于實(shí)現(xiàn)例如,使用或發(fā)現(xiàn)。重試失敗的請求可以將負(fù)載均衡的配置為重試失敗的請求,默認(rèn)情況下,禁用此邏輯,你可以通過將添加到應(yīng)用程序的類路徑來啟用它。 Spring Cloud Commons:通用的抽象 服務(wù)發(fā)現(xiàn)、負(fù)載均衡和斷路器等模式適用于所有Spring Cloud客戶端都可以使用的通用抽象層,獨(dú)立于實(shí)...
摘要:當(dāng)存在時,負(fù)載均衡的和會自動重試任何失敗的請求假設(shè)你的配置允許這樣做。啟用包括重試請求,由于請求的緩沖,請求會對服務(wù)器的資源產(chǎn)生影響。 重試失敗的請求 Spring Cloud Netflix提供了多種方式來發(fā)出HTTP請求,你可以使用負(fù)載均衡的RestTemplate、Ribbon或Feign。無論你如何選擇創(chuàng)建HTTP請求,總是有可能請求失敗,請求失敗時,你可能希望自動重試請求,要...
摘要:集群系統(tǒng)中的單個計算機(jī)通常稱為節(jié)點(diǎn),通常通過局域網(wǎng)連接,但也有其它的可能連接方式。這樣就高興了,可以專心寫自己的,前端就專門交由小周負(fù)責(zé)了。于是,小周和就變成了協(xié)作開發(fā)。都是為了項(xiàng)目正常運(yùn)行以及迭代。 一、前言 只有光頭才能變強(qiáng) 認(rèn)識我的朋友可能都知道我這陣子去實(shí)習(xí)啦,去的公司說是用SpringCloud(但我覺得使用的力度并不大啊~~)... 所以,這篇主要來講講SpringClou...
閱讀 1756·2021-11-25 09:43
閱讀 1792·2021-11-24 10:41
閱讀 3111·2021-09-27 13:36
閱讀 818·2019-08-30 15:53
閱讀 3575·2019-08-30 15:44
閱讀 871·2019-08-30 14:03
閱讀 2581·2019-08-29 16:38
閱讀 1005·2019-08-29 13:23