1. 程式人生 > >SpringCloud Ribbon

SpringCloud Ribbon

客戶端負載均衡器:Ribbon

 

Ribbon是一個客戶端負載平衡器,它可以很好地控制HTTP和TCP客戶端的行為。Feign已經使用Ribbon,所以如果你使用@FeignClient,那麼這一節也適用。

Ribbon中的中心概念是命名客戶端的概念。每個負載平衡器是組合的組合的一部分,它們一起工作以根據需要聯絡遠端伺服器,並且集合具有您將其作為應用程式開發人員(例如使用@FeignClient註釋)的名稱。Spring Cloud使用RibbonClientConfiguration為每個命名的客戶端根據需要建立一個新的集合,作為ApplicationContext。這包含(除其他外)ILoadBalancer

RestClientServerListFilter

如何加入Ribbon

要在專案中包含Ribbon,請使用組org.springframework.cloud和artifact id spring-cloud-starter-ribbon的啟動器。有關 使用當前的Spring Cloud釋出列表設定構建系統的詳細資訊,請參閱Spring Cloud專案頁面

自定義Ribbon客戶端

您可以使用<client>.ribbon.*中的外部屬性來配置Ribbon客戶端的某些位,這與使用Netflix API本身沒有什麼不同,只能使用Spring Boot配置檔案。本機選項可以在CommonClientConfigKey

(功能區核心心部分)中作為靜態欄位進行檢查。

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

@Configuration
@RibbonClient(name = "foo", configuration = FooConfiguration.class)
public class TestConfiguration {
}

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

警告

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

Spring Cloud Netflix預設提供以下功能區(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

建立一個型別的bean並將其放置在@RibbonClient配置(例如上面的FooConfiguration)中)允許您覆蓋所描述的每個bean。例:

@Configuration
public class FooConfiguration {
    @Bean
    public IPing ribbonPing(IClientConfig config) {
        return new PingUrl();
    }
}

這將PingUrl替換為PingUrl

使用屬性自定義Ribbon客戶端

從版本1.2.0開始,Spring Cloud Netflix現在支援使用屬性與Ribbon文件相容來自定義Ribbon客戶端。

這允許您在不同環境中更改啟動時的行為。

支援的屬性如下所示,應以<clientName>.ribbon.為字首:

  • NFLoadBalancerClassName:應實施ILoadBalancer

  • NFLoadBalancerRuleClassName:應實施IRule

  • NFLoadBalancerPingClassName:應實施IPing

  • NIWSServerListClassName:應實施ServerList

  • NIWSServerListFilterClassName應實施ServerListFilter

注意

在這些屬性中定義的類優先於使用@RibbonClient(configuration=MyRibbonConfig.class)定義的bean和由Spring Cloud Netflix提供的預設值。

要設定服務名稱usersIRule,您可以設定以下內容:

application.yml

users:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

有關Ribbon提供的實現,請參閱Ribbon文件

使用Ribbon與Eureka

當Eureka與Ribbon結合使用(即兩者都在類路徑上)時,ribbonServerList將被擴充套件為DiscoveryEnabledNIWSServerList,副檔名為Eureka的伺服器列表。它還用NIWSDiscoveryPing替換IPing介面,代理到Eureka以確定伺服器是否啟動。預設情況下安裝的ServerList是一個DomainExtractingServerList,其目的是使物理元資料可用於負載平衡器,而不使用AWS AMI元資料(Netflix依賴的是)。預設情況下,伺服器列表將使用例項元資料(如遠端客戶機集eureka.instance.metadataMap.zone)中提供的“區域”資訊構建,如果缺少,則可以使用伺服器主機名中的域名作為代理對於區域(如果設定了標誌approximateZoneFromHostname)。一旦區域資訊可用,它可以在ServerListFilter中使用。預設情況下,它將用於定位與客戶端相同區域的伺服器,因為預設值為ZonePreferenceServerListFilter。預設情況下,即通過eureka.instance.metadataMap.zone,客戶端的區域與遠端例項的方式相同。

注意

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

注意

如果沒有其他的區域資料來源,則基於客戶端配置(與例項配置相反)進行猜測。我們將eureka.client.availabilityZones,它是從區域名稱到區域列表的地圖,並拉出例項本身區域的第一個區域(即eureka.client.region,預設為“us-east-1”,為與本機Netflix的相容性)。

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

Eureka是抽象遠端伺服器發現的一種方便的方式,因此您不必在客戶端中對其URL進行硬編碼,但如果您不想使用它,Ribbon和Feign仍然很適用的。假設你已經為“store”聲明瞭一個@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