客戶端負(fù)載均衡器,控制HTTP和TCP客戶端。Feign用Ribbon,用@FeignClient適用。
中心概念:指定客戶端的概念。每個(gè)負(fù)載平衡器是組合的組合的一部分,一起工作,根據(jù)需要聯(lián)系遠(yuǎn)程服務(wù)器,@FeignClient注釋,RibbonClientConfiguration為每個(gè)命名客戶端創(chuàng)建新合奏作為ApplicationContext。包含ILoadBalancer,RestClient和ServerListFilter。
一、如何加入Ribbon
org.springframework.cloud和工件ID?spring-cloud-starter-ribbon
二、自定義Ribbon客戶端
用<client>.ribbon.*中外部屬性配置Ribbon客戶端的某些位,與Netflix API相同,用Spring Boot配置文件。本機(jī)選項(xiàng)可在CommonClientConfigKey(功能區(qū)內(nèi)核心部分)中作為靜態(tài)字段檢查
@RibbonClient聲明其他配置(RibbonClientConfiguration之上)完全控制客戶端。例:

客戶端由RibbonClientConfiguration中已經(jīng)存在的組件與FooConfiguration中任何組件組成(后通常覆蓋前)。
FooConfiguration必須是@Configuration,不在主應(yīng)用程序上下文@ComponentScan中,否則將由@RibbonClients共享。
如用@ComponentScan(或@SpringBootApplication),需采取措施避免包含(例如將其放在一個(gè)單獨(dú)的,不重疊的包中,或者指定要在@ComponentScan)。
Spring Cloud Netflix默認(rèn)Ribbon(BeanType?beanName:ClassName)提供以下bean:
IClientConfig?ribbonClientConfig:DefaultClientConfigImpl
IRule?ribbonRule:ZoneAvoidanceRule
IPing?ribbonPing:NoOpPing
ServerList<Server>?ribbonServerList:ConfigurationBasedServerList
ServerListFilter<Server>?ribbonServerListFilter:ZonePreferenceServerListFilter
ILoadBalancer?ribbonLoadBalancer:ZoneAwareLoadBalancer
ServerListUpdater?ribbonServerListUpdater:PollingServerListUpdater
創(chuàng)建一個(gè)類型bean并將其放置@RibbonClient配置(如上面FooConfiguration中)允許覆蓋所描述每個(gè)bean。

PingUrl代替NoOpPing
三、使用屬性自定義Ribbon客戶端
Spring Cloud Netflix支持使用屬性與Ribbon文檔兼容來(lái)自定義Ribbon客戶端。
不同環(huán)境中更改啟動(dòng)時(shí)的行為。<clientName>.ribbon.為前綴:
NFLoadBalancerClassName:應(yīng)實(shí)施ILoadBalancer
NFLoadBalancerRuleClassName:應(yīng)實(shí)施IRule
NFLoadBalancerPingClassName:應(yīng)實(shí)施IPing
NIWSServerListClassName:應(yīng)實(shí)施ServerList
NIWSServerListFilterClassName應(yīng)實(shí)施ServerListFilter
屬性中定義類優(yōu)先于使用@RibbonClient(configuration=MyRibbonConfig.class)定義的bean和由Spring Cloud Netflix提供的默認(rèn)值。
設(shè)置服務(wù)名稱users的IRule,您可以設(shè)置以下內(nèi)容:

有關(guān)Ribbon提供的實(shí)現(xiàn),請(qǐng)參閱Ribbon文檔。
四、在Eureka中使用Ribbon
ribbonServerList擴(kuò)展為DiscoveryEnabledNIWSServerList,擴(kuò)展名為Eureka服務(wù)器列表。用NIWSDiscoveryPing替換IPing接口,代理Eureka確定服務(wù)器是否啟動(dòng)。默認(rèn)安裝的ServerList是一個(gè)DomainExtractingServerList,使物理元數(shù)據(jù)可用于負(fù)載平衡器,不使用AWS AMI元數(shù)據(jù)(Netflix依賴)。
服務(wù)器列表默認(rèn)用實(shí)例元數(shù)據(jù)(如遠(yuǎn)程客戶端集合eureka.instance.metadataMap.zone)中提供的“區(qū)域”信息構(gòu)建,如缺少,則可用服務(wù)器主機(jī)名中的域名作為代理用于區(qū)域(如果設(shè)置了標(biāo)志approximateZoneFromHostname)。區(qū)域信息可用,可在ServerListFilter中使用。
定位與客戶端相同區(qū)域服務(wù)器,默認(rèn)值ZonePreferenceServerListFilter??蛻舳伺c遠(yuǎn)程方式相同eureka.instance.metadataMap.zone
ps1:設(shè)置客戶端區(qū)域的正統(tǒng)“archaius”方式是通過(guò)一個(gè)名為“@zone”的配置屬性,如可用,Spring Cloud優(yōu)先用所有其他設(shè)置(該鍵必須被引用)YAML配置中)。
ps2:如沒(méi)有其他區(qū)域數(shù)據(jù)源,則基于客戶端配置(與實(shí)例配置相反)進(jìn)行猜測(cè)。我們將eureka.client.availabilityZones(從區(qū)域名稱映射到區(qū)域列表),并將實(shí)例自己的區(qū)域的第一個(gè)區(qū)域(即eureka.client.region,其默認(rèn)為“us-east-1”為與本機(jī)Netflix的兼容性)。
五、示例:如何使用Ribbon不使用Eureka
方便抽象遠(yuǎn)程服務(wù)器發(fā)現(xiàn),不必在客戶端中對(duì)URL硬編碼,不想使用它,Ribbon和Feign仍適用。假設(shè)已經(jīng)為“商店”申請(qǐng)@RibbonClient,Eureka未被使用(甚至不在類路徑上)。Ribbon客戶端默認(rèn)為已配置的服務(wù)器列表

六、示例:在Ribbon中禁用Eureka使用
ribbon.eureka.enabled = false

七、直接使用Ribbon API
您也可以直接使用LoadBalancerClient。例:

八、緩存Ribbon配置
Ribbon命名客戶端都有相應(yīng)子應(yīng)用程序上下文,Spring Cloud維護(hù),上下文第一個(gè)請(qǐng)求中被延遲加載到命名的客戶端。通過(guò)指定Ribbon客戶端名稱,啟動(dòng)時(shí)更改延遲加載,饑餓加載上下文
application.yml
ribbon:
? eager-load:
? ? enabled: true
? ? clients: client1, client2, client3