客戶端負(fù)載平衡器:Ribbon

Ribbon是一個客戶端負(fù)載均衡器,它可以很好地控制HTTP和TCP客戶端的行為。Feign已經(jīng)使用Ribbon,所以如果您使用@FeignClient,則本節(jié)也適用。

Ribbon中的中心概念是指定客戶端的概念。每個負(fù)載平衡器是組合的組合的一部分,它們一起工作以根據(jù)需要聯(lián)系遠(yuǎn)程服務(wù)器,并且集合具有您將其作為應(yīng)用程序開發(fā)人員(例如使用@FeignClient注釋)的名稱。Spring Cloud使用RibbonClientConfiguration為每個命名的客戶端根據(jù)需要創(chuàng)建一個新的合奏作為ApplicationContext。這包含(除其他外)ILoadBalancer,RestClient和ServerListFilter。

如何加入Ribbon

要在項目中包含Ribbon,請使用組org.springframework.cloud和工件IDspring-cloud-starter-ribbon的起始器。有關(guān)使用當(dāng)前的Spring Cloud發(fā)布列表設(shè)置構(gòu)建系統(tǒng)的詳細(xì)信息,請參閱Spring Cloud項目頁面

自定義Ribbon客戶端

您可以使用<client>.ribbon.*中的外部屬性來配置Ribbon客戶端的某些位,這與使用Netflix API本身沒有什么不同,只能使用Spring Boot配置文件。本機(jī)選項可以在CommonClientConfigKey(功能區(qū)內(nèi)核心部分)中作為靜態(tài)字段進(jìn)行檢查。

Spring Cloud還允許您通過使用@RibbonClient聲明其他配置(位于RibbonClientConfiguration之上)來完全控制客戶端。例:

@Configuration

@RibbonClient(name = "foo", configuration = FooConfiguration.class)

public class TestConfiguration {

}

在這種情況下,客戶端由RibbonClientConfiguration中已經(jīng)存在的組件與FooConfiguration中的任何組件組成(后者通常會覆蓋前者)。

警告FooConfiguration必須是@Configuration,但請注意,它不在主應(yīng)用程序上下文的@ComponentScan中,否則將由所有@RibbonClients共享。如果您使用@ComponentScan(或@SpringBootApplication),則需要采取措施避免包含(例如將其放在一個單獨的,不重疊的包中,或者指定要在@ComponentScan)。

Spring Cloud Netflix默認(rèn)情況下為Ribbon(BeanTypebeanName:ClassName)提供以下bean:

IClientConfigribbonClientConfig:DefaultClientConfigImpl

IRuleribbonRule:ZoneAvoidanceRule

IPingribbonPing:NoOpPing

ServerList<Server>ribbonServerList:ConfigurationBasedServerList

ServerListFilter<Server>ribbonServerListFilter:ZonePreferenceServerListFilter

ILoadBalancerribbonLoadBalancer:ZoneAwareLoadBalancer

ServerListUpdaterribbonServerListUpdater:PollingServerListUpdater

創(chuàng)建一個類型的bean并將其放置在@RibbonClient配置(例如上面的FooConfiguration)中)允許您覆蓋所描述的每個bean。例:

@Configuration

public class FooConfiguration {

? ? @Bean

? ? public IPing ribbonPing(IClientConfig config) {

? ? ? ? return new PingUrl();

? ? }

}

這用PingUrl代替NoOpPing。

使用屬性自定義Ribbon客戶端

從版本1.2.0開始,Spring Cloud Netflix現(xiàn)在支持使用屬性與Ribbon文檔兼容來自定義Ribbon客戶端。

這允許您在不同環(huán)境中更改啟動時的行為。

支持的屬性如下所示,應(yīng)以<clientName>.ribbon.為前綴:

NFLoadBalancerClassName:應(yīng)實施ILoadBalancer

NFLoadBalancerRuleClassName:應(yīng)實施IRule

NFLoadBalancerPingClassName:應(yīng)實施IPing

NIWSServerListClassName:應(yīng)實施ServerList

NIWSServerListFilterClassName應(yīng)實施ServerListFilter

注意在這些屬性中定義的類優(yōu)先于使用@RibbonClient(configuration=MyRibbonConfig.class)定義的bean和由Spring Cloud Netflix提供的默認(rèn)值。

要設(shè)置服務(wù)名稱users的IRule,您可以設(shè)置以下內(nèi)容:

application.yml

users:

? ribbon:

? ? NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

有關(guān)Ribbon提供的實現(xiàn),請參閱Ribbon文檔

在Eureka中使用Ribbon

當(dāng)Eureka與Ribbon結(jié)合使用(即兩者都在類路徑上)時,ribbonServerList將被擴(kuò)展為DiscoveryEnabledNIWSServerList,擴(kuò)展名為Eureka的服務(wù)器列表。它還用NIWSDiscoveryPing替換IPing接口,代理到Eureka以確定服務(wù)器是否啟動。默認(rèn)情況下安裝的ServerList是一個DomainExtractingServerList,其目的是使物理元數(shù)據(jù)可用于負(fù)載平衡器,而不使用AWS AMI元數(shù)據(jù)(這是Netflix依賴的)。默認(rèn)情況下,服務(wù)器列表將使用實例元數(shù)據(jù)(如遠(yuǎn)程客戶端集合eureka.instance.metadataMap.zone)中提供的“區(qū)域”信息構(gòu)建,如果缺少,則可以使用服務(wù)器主機(jī)名中的域名作為代理用于區(qū)域(如果設(shè)置了標(biāo)志approximateZoneFromHostname)。一旦區(qū)域信息可用,它可以在ServerListFilter中使用。默認(rèn)情況下,它將用于定位與客戶端相同區(qū)域的服務(wù)器,因為默認(rèn)值為ZonePreferenceServerListFilter。默認(rèn)情況下,客戶端的區(qū)域與遠(yuǎn)程實例的方式相同,即通過eureka.instance.metadataMap.zone。

注意設(shè)置客戶端區(qū)域的正統(tǒng)“archaius”方式是通過一個名為“@zone”的配置屬性,如果可用,Spring Cloud將優(yōu)先使用所有其他設(shè)置(請注意,該鍵必須被引用)在YAML配置中)。

注意如果沒有其他的區(qū)域數(shù)據(jù)源,則基于客戶端配置(與實例配置相反)進(jìn)行猜測。我們將eureka.client.availabilityZones(從區(qū)域名稱映射到區(qū)域列表),并將實例自己的區(qū)域的第一個區(qū)域(即eureka.client.region,其默認(rèn)為“us-east-1”為與本機(jī)Netflix的兼容性)。

示例:如何使用Ribbon不使用Eureka

Eureka是一種方便的方式來抽象遠(yuǎn)程服務(wù)器的發(fā)現(xiàn),因此您不必在客戶端中對其URL進(jìn)行硬編碼,但如果您不想使用它,Ribbon和Feign仍然是適用的。假設(shè)您已經(jīng)為“商店”申請了@RibbonClient,并且Eureka未被使用(甚至不在類路徑上)。Ribbon客戶端默認(rèn)為已配置的服務(wù)器列表,您可以提供這樣的配置

application.yml

stores:

? ribbon:

? ? listOfServers: example.com,google.com

示例:在Ribbon中禁用Eureka使用

設(shè)置屬性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命名的客戶端都有一個相應(yīng)的子應(yīng)用程序上下文,Spring Cloud維護(hù),這個應(yīng)用程序上下文在第一個請求中被延遲加載到命名的客戶端??梢酝ㄟ^指定Ribbon客戶端的名稱,在啟動時,可以更改此延遲加載行為,從而熱切加載這些子應(yīng)用程序上下文。

application.yml

ribbon:

? eager-load:

? ? enabled: true

? ? clients: client1, client2, client3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容