Spring Cloud - Ribbon客戶端的使用
從版本1.2.0開始,Spring Cloud Netflix現在支持使用屬性與Ribbon文檔兼容來自定義Ribbon客戶端。
這允許您在不同環境中更改啟動時的行為。
支持的屬性如下所示,應以<clientName>.ribbon.
為前綴:
-
NFLoadBalancerClassName
:應實施ILoadBalancer
-
NFLoadBalancerRuleClassName
:應實施IRule
-
NFLoadBalancerPingClassName
:應實施IPing
-
NIWSServerListClassName
:應實施ServerList
-
NIWSServerListFilterClassName
ServerListFilter
要設置服務名稱
application.ymlusers
的IRule
,您可以設置以下內容:users: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
當Eureka與Ribbon結合使用(即兩者都在類路徑上)時,
ribbonServerList
將被擴展為DiscoveryEnabledNIWSServerList
,擴展名為Eureka的服務器列表。它還用NIWSDiscoveryPing
替換IPing
接口,代理到Eureka以確定服務器是否啟動。ServerList
是一個DomainExtractingServerList
,其目的是使物理元數據可用於負載平衡器,而不使用AWS AMI元數據(這是Netflix依賴的)。默認情況下,服務器列表將使用實例元數據(如遠程客戶端集合eureka.instance.metadataMap.zone
)中提供的“區域”信息構建,如果缺少,則可以使用服務器主機名中的域名作為代理用於區域(如果設置了標誌approximateZoneFromHostname
)。一旦區域信息可用,它可以在ServerListFilter
中使用。默認情況下,它將用於定位與客戶端相同區域的服務器,因為默認值為ZonePreferenceServerListFilter
eureka.instance.metadataMap.zone
。Eureka是一種方便的方式來抽象遠程服務器的發現,因此您不必在客戶端中對其URL進行硬編碼,但如果您不想使用它,Ribbon和Feign仍然是適用的。假設您已經為“商店”申請了
application.yml@RibbonClient
,並且Eureka未被使用(甚至不在類路徑上)。Ribbon客戶端默認為已配置的服務器列表,您可以提供這樣的配置stores: ribbon: listOfServers: example.com,google.com
設置屬性
application.ymlribbon.eureka.enabled = false
將明確禁用在Ribbon中使用Eureka。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 } }
Spring Cloud - Ribbon客戶端的使用