1. 程式人生 > >spring cloud (四) 服務端客戶端負載均衡(Ribbon)

spring cloud (四) 服務端客戶端負載均衡(Ribbon)

概述

Ribbon是一個客戶端負載均衡器, 它可以讓您對HTTP和TCP客戶端的行為有很大的控制權。

   Feign已經使用Ribbon,所以如果您使用的是@FeignClient, 那麼這個部分也適用。 

     Ribbon中一個重要的概念是named client。

    Spring Cloud使用RibbonClientConfiguration根據需要為每個named client建立一個新的集合作為ApplicationContext,

    這包含(除其他外)ILoadBalancer,RestClient和ServerListFilter。

如何引入ribbon

pom.xml

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

自定義Ribbon Client

你可以使用<client>.ribbon.*屬性來配置ribbon client。

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

@RibbonClient(name = "user-server", configuration = RibbonConfig.class)
public class TestConfiguration {
}

在這種情況下,ribbon client由已經在RibbonClientConfiguration中的元件和RibbonConfig

中的任何元件(後者通常會覆蓋前者)

組成。

(備註:使用RibbonClientConfiguration中的Bean和自定義的RibbonConfig中的Bean來配置ribbon client, 

RibbonConfig中的Bean會覆蓋RibbonClientConfiguration中的Bean)

注意: 

上面的RibbonConfig必須用@Configuration,但是注意它不能在應用上下文被@ComponentScan掃描到,

否則它將被所有@RibbonClient所共享。如果你使用@ComponentScan或者@SpringBootApplication,你需要避免它被包括在內

(例如:把它放在一個單獨的,不重疊的包或者在@ComponentScan

中明確指定要掃描的包)。

(備註:我是在src/main/java下新建一個package,將自定義的RibbonConfiguration配置Bean放在這個包下)

Spring Cloud Netflix預設給ribbon提供以下的bean(BeanType beanName: ClassName):

  • 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配置Bean(例如上面的RibbonConfig)中,可以覆蓋所描述的每個bean。例:

@Configuration
public class RibbonConfig {

    @Bean
    public IPing ribbonPing(){
        return new PingUrl();
    }
}

這將用PingUrl代替NoOpPing

使用properties來自定義Ribbon Client

Spring Cloud Netflix現在支援使用properties來定製Ribbon client,以便與Ribbon文件相容。

這使你可以在不同的環境啟動時更改行為。

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

  • NFLoadBalancerClassName: should implement ILoadBalancer
  • NFLoadBalancerRuleClassName: should implement IRule
  • NFLoadBalancerPingClassName: should implement IPing
  • NIWSServerListClassName: should implement ServerList
  • NIWSServerListFilterClassName: should implement ServerListFilter

提示: 在這些屬性中定義的類優先於使用@RibbonClient(configuration=MyRibbonConfig.class)

定義的bean和Spring Cloud Netflix提供的預設類。

要為一個名為user-server的服務設定IRule,可以如下設定:

user-server:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

Ribbon和Eureka一起使用

當Eureka和Ribbon一起使用(例如,二者都在classpath), ribbonServerListDiscoveryEnabledNIWSServerList的一個擴充套件覆蓋了,

該擴充套件的server list來自於Eureka。

同時用NIWSDiscoveryPing替代IPing,通過Eureka來判斷服務狀態是否為UP。

預設安裝的ServerList是一個DomainExtractingServerList,

這樣做的目的是在不使用AWS AMI metadata(這是Netflix所依賴的)的情況下為負載均衡器提供物理metadata。

預設情況下,server list將使用例項metadata中提供的“zone”資訊構建(所以在遠端客戶端上設定eureka.instance.metadataMap.zone),如果沒有設定zone,可以使用伺服器hostname的域名作為zone的代理(如果設定了標誌approximateZoneFromHostname)。

一旦zone資訊可用,就可以在ServerListFilter中使用。

預設情況下,它將用於定位與client位於同一個zone的server,因為預設值是ZonePreferenceServerListFilter

預設地client的zone的確定方式與遠端例項相同,即通過eureka.instance.metadataMap.zone

提示:

 如果沒有設定zone資料,則根據client配置(而不是例項配置)進行猜測。

我們把eureka.client.availabilityZones(這是一個從region名稱到zone列表的map),

並取出例項所在region的第一個zone(即eureka.client.region,預設為“us-east-1“,為了與本地Netflix的相容性)。

Ribbon不和Eureka一起使用

Eureka是一個遠端服務發現的一個簡便實現,所以你不需要在client端硬編碼url,

但是如果你不喜歡使用eureka,Ribbon和Feign仍然很合適。假設你已經為“stores”聲明瞭@RibbonClient, 並且沒有使用eureka。

Ribbon client預設使用一個配置的server list,你可以像這樣提供配置:

application.yml

user-server:
  ribbon:
    listOfServers: xphsc:8002

在Ribbon中禁用Eureka

設定屬性ribbon.eureka.enabled = false將明確禁止在Ribbon中使用Eureka。

application.yml

ribbon:
  eureka:
   enabled: false

直接使用Ribbon API

你可以直接使用LoadBalancerClient,例如:

@RestController
public class UserLoadBalancerController {
    @Autowired
    private LoadBalancerClient loadBalancer;

    @GetMapping("/getloadBalancer")
    public Object getloadBalancer() {
        ServiceInstance instance = loadBalancer.choose("user-server");
              URI userUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
              // 列印當前選擇的是哪點節點
              System.out.println("列印當前選擇的是哪點節點:{}"+userUri);
              // ... do something with the URI
              return userUri;
    }

}

Ribbon的快取配置

每個named client的Ribbon都有一個Spring Cloud維護的對應子應用程式上下文,這個應用程式的上下文是當對named client第一次請求時懶載入的。可以將此延遲載入行為更改為在啟動時立即載入這些子應用程式上下文,通過指定Ribbon client的名稱來配置。

application.yml

ribbon:
  eager-load:
    enabled: true
    clients: client1, client2, client3

相關推薦

spring cloud () 服務客戶負載均衡Ribbon

概述Ribbon是一個客戶端負載均衡器, 它可以讓您對HTTP和TCP客戶端的行為有很大的控制權。   Feign已經使用Ribbon,所以如果您使用的是@FeignClient, 那麼這個部分也適用。      Ribbon中一個重要的概念是named client。    Spring Cloud使用Ri

Spring cloud服務客戶負載均衡 Ribbon

    在我們已經有了服務註冊中心和服務提供者(這裡為了節省時間,此專案即是服務提供者,也是服務消費者),下面就嘗試建立服務消費者,它主要完成兩個目標,發現服務和消費服務。其中發現服務由 Eureak 的客戶端完成,而服務消費的任務由 Ribbon 完成。Ribbon 是一個

SpringCloud教程(Finchley版本)-03:負載均衡Ribbon

Spring Cloud Ribbon是一個基於Http和TCP的客服端負載均衡工具,它是基於Netflix Ribbon實現的。它是一個工具類框架,不像服務註冊中心、配置中心、API閘道器那樣獨立部署,但是它幾乎存在於每個微服務的基礎設施中。微服務間的呼叫,API閘道器的請求轉發等,都

使用Spring Cloud Feign作為HTTP客戶調用遠程HTTP服務

技術 private 最大的 alt face class extends 使用 依賴 如果你的項目使用了SpringCloud微服務技術,那麽你就可以使用Feign來作為http客戶端來調用遠程的http服務。當然,如果你不想使用Feign作為http客戶端,也可以使用比

Spring Cloud Ribbon(客戶負載均衡)2

1.引數配置 對於Ribbon的引數配置通常有兩種方式:全域性配置以及指定客戶端配置: 全域性配置:ribbon.<key>=<value>格式進行配置即可。<key>代表了Ribbon客戶端配置的引數名,<value>代表了對應引數值。比

使用Spring Cloud Feign作為HTTP客戶呼叫遠端HTTP服務

在Spring Cloud Netflix棧中,各個微服務都是以HTTP介面的形式暴露自身服務的,因此在呼叫遠端服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的非同步HTTP Client,

spring cloud 宣告式rest客戶feign呼叫遠端http服務

在Spring Cloud Netflix棧中,各個微服務都是以HTTP介面的形式暴露自身服務的,因此在呼叫遠端服務時就必須使用HTTP客戶端。Feign就是Spring Cloud提供的一種宣告式REST客戶端。可以通過Feign訪問呼叫遠端微服務提供的REST介面。現在我們就用Feign來呼叫S

Spring Cloud Feign作為HTTP客戶呼叫遠端HTTP服務,feign熔斷器

在Spring Cloud Netflix棧中,各個微服務都是以HTTP介面的形式暴露自身服務的,因此在呼叫遠端服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的非同步HTTP Clie

Spring Cloud】原始碼-Eureka客戶如何載入Eureka服務註冊中心列表

這部分原始碼涉及到兩個類: 1. com.netflix.discovery.endpoint.EndpointUtils 2.  org.springframework.cloud.netflix.eureka.EurekaClientConfigBean 我

spring cloud,用feign客戶呼叫服務hystrix不能生效的問題

最近在照著網上的貼子做spring cloud ,用feign客戶端呼叫 服務時發現hystrix不起作用,當時我的配置檔案是application.yml,當配置 feign:   hystrix:     enabled: true idea提示unknow prope

Spring Cloud ---- 服務消費與負載均衡feign

req 啟動文件 創建 code cli 負載均衡。 auto request 文件   feign是一個聲明式的偽客戶端,只需要創建一個接口並且註解,它具有可插拔的特性。feign集合了Ribbon,再與Eurake結合實現服務的註冊發現與負載均衡。結合Hystrix,具

spring cloud()-服務閘道器Zuul-過濾器

前言 一般許可權控制,登入控制可以加到閘道器過濾器中。 1、過濾器的實現 繼承ZuulFilter,重寫4個方法filterType、filterOrder、shouldFilter 、run。 fil

spring cloud快速入門教程程序間呼叫和微服務負載均衡Feign

RestTemplate是不是很簡單粗暴呢?還有更粗暴的,那就是Feign,很多人都用過Dubbo,Feign的用法跟他類似。 我們複用userService那個module去呼叫productService微服務中的getProduct介面,引入Feign的依賴包: &

Spring Cloud:配置中心服務化和高可用08

在前兩篇的介紹中,客戶端都是直接呼叫配置中心的server端來獲取配置檔案資訊。這樣就存在了一個問題,客戶端和服務端的耦合性太高,如果server端要做叢集,客戶端只能通過原始的方式來路由,server端改變IP地址的時候,客戶端也需要修改配置,不符合springcloud服務治理的理念。sprin

Spring Cloud:配置中心svn示例和refresh07

上一篇springcloud(六):配置中心git示例留了一個小問題,當重新修改配置檔案提交後,客戶端獲取的仍然是修改前的資訊,這個問題我們先放下,待會再講。國內很多公司都使用的svn來做程式碼的版本控制,我們先介紹以下如何使用svn+Spring Cloud Config來做配置中心。 &nb

Spring Cloud:熔斷監控Hystrix Dashboard和Turbine05

Hystrix-dashboard是一款針對Hystrix進行實時監控的工具,通過Hystrix Dashboard我們可以在直觀地看到各Hystrix Command的請求響應時間, 請求成功率等資料。但是隻使用Hystrix Dashboard的話, 你只能看到單個應用內的服務資訊, 這明顯不夠

Spring Cloud Stream消費失敗後的處理策略:自動重試

之前寫了幾篇關於Spring Cloud Stream使用中的常見問題,比如: 如何處理訊息重複消費 如何消費自己生產的訊息 下面幾天就集中來詳細聊聊,當訊息消費失敗之後該如何處理的幾種方式。不過不論哪種方式,都需要與具體業務結合,解決不同業務場景可能出現的問題。 今天第一節,介紹一下Spring Clo

Spring Cloud Stream消費失敗後的處理策略:自定義錯誤處理邏輯

應用場景 上一篇《Spring Cloud Stream消費失敗後的處理策略(一):自動重試》介紹了預設就會生效的訊息重試功能。對於一些因環境原因、網路抖動等不穩定因素引發的問題可以起到比較好的作用。但是對於諸如程式碼本身存在的邏輯錯誤等,無論重試多少次都不可能成功的問題,是無法修復的。對於這樣的情況,前文

Spring Cloud Stream消費失敗後的處理策略:使用DLQ佇列RabbitMQ

應用場景 前兩天我們已經介紹了兩種Spring Cloud Stream對訊息失敗的處理策略: 自動重試:對於一些因環境原因(如:網路抖動等不穩定因素)引發的問題可以起到比較好的作用,提高訊息處理的成功率。 自定義錯誤處理邏輯:如果業務上,訊息處理失敗之後有明確的降級邏輯可以彌補的,可以採用這種

Spring Cloud Stream消費失敗後的處理策略:使用DLQ隊列RabbitMQ

messages tap ica hello 方式 應用 manage oot 輸入 應用場景 前兩天我們已經介紹了兩種Spring Cloud Stream對消息失敗的處理策略: 自動重試:對於一些因環境原因(如:網絡抖動等不穩定因素)引發的問題可以起到比較好的作用,提