<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # 簡介 Ribbon客戶端啟動時,從注冊中心獲取服務實例列表并初始化, 對獲取的服務實例列表根據指定的算法進行過濾 定時更新服務實例列表的狀態 Ribbon客戶端要訪問`http://authority/api/xxx` 根據算法從服務實例列表中選擇一個服務實例 使用服務實例真實的IP和端口并替換authority部分 向真正的服務發送請求,并完成請求 ~~~ <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> ~~~ ~~~ @Autowired private LoadBalancerClient loadBalancerClient; ~~~ ~~~ //讓負載均衡器找 ServiceInstance serviceInstance = loadBalancerClient.choose("user-service"); String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/user/" + id; ~~~ 讓負載均衡器攔截整個 ~~~ public class ConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } ~~~ 直接在上面加注解,然后 ~~~ @Autowired private RestTemplate restTemplate; ~~~ 這樣就全局用,都是負載均衡幫你攔截了,這邊只能用服務的名稱了 ~~~ String url = "http://user-service/user/" + id; String user = restTemplate.getForObject(url, String.class); ~~~ springboot也為我們提供了修改負載均衡規則的配置入口 格式是:`{服務名稱}.ribbon.NPLoadBalancerRuleclassName`,值就是IRule的實現類 ~~~ user-service: ribbon: NPLoadBalancerRuleclassName: com.netflix.loadbalancer.RandomRule ~~~ # 主要組件 * ServerList:定義獲取服務器列表 * ServerListFilter:對ServerList服務器列表進行二次過濾 * ServerListUpdater: 定義服務更新策略 * IPing: 檢查服務列表是否存活 * IRule :根據算法中從服務列表中選取一個要訪問的服務 * ILoadBalancer:軟件負載平衡器入口,整合以上所有的組件實現負載功能 **Ribbon組件之間的關系簡單整理如下:** ServerList和ServerListFilter生成客戶端可以訪問的服務列表 ServerListUpdater和IPing:根據服務的狀態更新服務列表 IRule:服務的選擇策略 ILoadBalancer:將以上組件組合到這個類中一起工作 ## ServerList: 獲取服務器列表 > 存儲服務列表。分為靜態和動態。如果是動態的,后臺有個線程會定時刷新和過濾服務列表 常用的規則有以下幾種: * ConfigurationBasedServerList > 從配置文件中獲取所有服務列表,配置舉例: ~~~ sample-client: ribbon.listOfServers: www.microsoft.com:80,www.yahoo.com:80,www.google.com:80 ~~~ * DiscoveryEnabledNIWSServerList > 從Eureka Client中獲取服務列表 ~~~ myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList # the server must register itself with Eureka server with VipAddress "myservice" myClient.ribbon.DeploymentContextBasedVipAddresses=myservice ~~~ * DomainExtractingServerList > 代理類,根據 ServerList 的值實現具體的邏輯 ## IPing : 檢查服務列表是否存活 > 在后臺運行的一個組件,用于檢查服務列表是否存活 這里也有不同的策略,分別有以下策略: * NIWSDiscoveryPing > 不執行真正的ping。如果服務實例在本地的Eureka緩存中存在,則返回true(默認配置)。ribbon-eureka包中提供的類,結合eureka使用時,如果Discovery Client在線,則認為心跳檢測通過 * PingUrl > ribbon-httpclient包中提供的類,采用此方式,會使用httpclient調用服務的一個url,如果調用成功則認為本次心跳檢測通過,即服務存活可用 * NoOpPing > 什么都不做,永遠返回true,即認為服務永遠活著 * DummyPing > 默認實現,默認返回true,即認為服務永遠活著 * PingConstant > 通過配置參數設置指定服務器存活狀態 ## ServerListFilter: 對ServerList服務器列表進行二次過濾 > 該接口允許過濾配置或動態獲取的具有所需特性的服務器列表。ServerListFilter 是 DynamicServerListLoadBalancer 用于過濾從 ServerList 實現返回的服務器的組件。 > 常用 ServerListFilter 實現有以下幾種: * ZoneAffinityServerListFilter > 過濾掉所有的不和客戶端在相同zone的服務,如果和客戶端相同的zone不存在,才不過濾不同zone有服務。 ~~~ myclient.ribbon.EnableZoneAffinity=true ~~~ * ServerListSubsetFilter > ZoneAffinityServerListFilter的子類。此過濾器確保客戶端僅看到由ServerList實現返回的整個服務器的固定子集。 它還可以定期用新服務器替代可用性差的子集中的服務器 ~~~ myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList # 指定要負載均衡服務實例的服務應用名稱 myClient.ribbon.DeploymentContextBasedVipAddresses=myservice myClient.ribbon.NIWSServerListFilterClassName=com.netflix.loadbalancer.ServerListSubsetFilter # 指定返回服務器子集的數量,默認20 myClient.ribbon.ServerListSubsetFilter.size=5 ~~~ * ZonePreferenceServerListFilter > ZoneAffinityServerListFilter的子類。和ZoneAffinityServerListFilter相似,但是比較的zone是發布環境里面的zone。根據消費者配置預設的區域Zone來進行過濾(默認配置). 過濾掉所有和客戶端環境里的配置的zone的不同的服務,如果和客戶端相同的zone不存在,才不進行過濾。 ## ServerListUpdater : 定義服務更新策略 > 被DynamicServerListLoadBalancer用于動態的更新服務列表。 * PollingServerListUpdater > 默認的實現策略。此對象會啟動一個定時線程池,定時執行更新策略 * EurekaNotificationServerListUpdater > 當收到緩存刷新的通知,會更新服務列表,由Eureka的事件監聽來驅動服務列表的更新操作 * * * ## IClientConfig > 定義各種配置信息,用來初始化ribbon客戶端和負載均衡器 > 常用IClientConfig實現有以下幾種: * DefaultClientConfigImpl > IClientConfig的默認實現,配置文件里的部分值為ribbon ## IRule :根據算法中從服務列表中選取一個要訪問的服務 一共有7種負載均衡策略: ![](https://img.kancloud.cn/14/41/1441839138e44fcc95972f1ddb22556b_1009x967.png) * RandomRule:隨機,使用Random對象從服務列表中隨機選擇一個服務 * RoundRobinRule:輪訓策略。默認策略,同時也是更高級rules的回退策略 * RetryRule: 輪詢 + 重試 先使用RoundRobinRule進行服務實例選擇,如果選擇服務實例失敗,則在指定時間不斷進行重試直至找到服務或超時 * WeightedResponseTimeRule: 優先選擇響應時間快 此策略會根據每個實例的平均響應時間,計算出每個服務的權重,響應時間越快,服務權重越重、被選中的概率越高。此類有個DynamicServerWeightTask的定時任務,默認情況下每隔30秒會計算一次各個服務實例的權重。 剛啟動時,如果統計信息不足,則使用RoundRobinRule策略,等統計信息足夠,會切換到WeightedResponseTimeRule。 * BestAvailableRule: 優先選擇并發請求最小的 先過濾到斷路器處于打開的服務,然后選擇并發請求最小的服務實例來使用。 剛啟動時,如果統計信息不足,則使用RoundRobinRule策略,等統計信息足夠,會切換到BestAvailableRule。 * PredicateBasedRule 抽象類。 PredicateBasedRule是ClientConfigEnabledRoundRobinRule的一個子類,它先通過內部定義的一個過濾器過濾出一部分服務實例清單,然后再采用輪詢的方式從過濾出來的結果中選取一個服務實例 * AvailabilityFilteringRule: (默認實現) 這個負載均衡器規則,會先過濾掉以下服務: a. 由于多次訪問故障而處于斷路器打開的服務 b. 并發的連接數量超過閾值 然后對剩余的服務列表按照RoundRobinRule策略進行訪問 如果RestClient最近3次連接服務實例都失敗,則對應的服務的斷路器打開。斷路器打開的狀態默認會持續30s,然后再關閉。如果再次連接又失敗,則斷路器又打開,并且等待的時間隨著連續失敗的次數,成指數值增加,但是等待的時間不能超過最長的等待時間 * ZoneAvoidanceRule 根據以下的規則過濾服務: a. 如果一個ZONE不可用,則丟棄這個zone里的所有服務實例 b. 過濾以下服務實例:”由于多次訪問故障而處于斷路器打開的服務”和”并發的連接數量超過閾值”然后再使用輪詢從過濾后的服務列表中選擇一個服務 **配置舉例:** 服務名開頭 ~~~ users: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule ~~~ ## ILoadBalancer:將以上組件組合到這個類中一起工作 > 定義軟件負載平衡器操作的接口。動態更新一組服務列表及根據指定算法從現有服務器列表中選擇一個服務。 * DynamicServerListLoadBalancer > DynamicServerListLoadBalancer組合Rule、IPing、ServerList、ServerListFilter、ServerListUpdater 實現類,實現動態更新和過濾更新服務列表.是BaseLoadBalancer的一個子類,對基礎負載均衡器的功能做了進一步的擴展。增加了服務實例列表動態更新的功能,同時增加對服務實例列表過濾的功能,此類內部依靠DomainExtractingServerList從EurekaClient從注冊中心獲取服務實例列表,將狀態為UP的服務實例組成新的服務列表,使用ZoneAffinityServerListFilter再對這個列表進行過濾。此類內部默認使用PollingServerListUpdater對服務實例列表進行定時更新,保證服務的有效性. * ZoneAwareLoadBalancer > 默認,這是DynamicServerListLoadBalancer的子類,主要加入zone的因素。統計每個zone的平均請求的情況,保證從所有zone選取對當前客戶端服務最好的服務組列表.DynamicServerListLoadBalancer默認使用輪詢策略,但是此策略在進行跨區域調用時,可能會產生高延遲。此類使用ZoneStats存儲每個Zone的狀態和平均請求情況,當一個zone的平均請求達到閾值或請求超時的比例達到閾值或zone不可用,則將該zone的服務實例中刪除。此類使用AvailabilityFilteringRule選擇一個服務實例。 * NoOpLoadBalancer > 什么都沒做 * BaseLoadBalancer > 負載均衡器的基本實現。 > 此類內部維護一個存儲所有服務實例列表和一個當前活著的服務實例列表。默認使用輪詢策略選擇一個服務實例做為請求對象。定義一個定時器,根據IPingStrategy定時輪詢ping服務實例,用于判斷服務列表是否活著。默認的ping策略為SerialPingStrategy ## Springcloud中的以上組件的默認配置 ~~~ # 負載均衡類,默認為om.netflix.loadbalancer.ZoneAwareLoadBalance NFLoadBalancerClassName=ZoneAwareLoadBalancer # 負載均衡規則類,默認為com.netflix.loadbalancer.AvailabilityFilteringRule NFLoadBalancerRuleClassName=AvailabilityFilteringRule # 心跳檢測類,ribbon默認為com.netflix.loadbalancer.DummyPing,結合eureka使用時默認值為NIWSDiscoveryPing NFLoadBalancerPingClassName=NIWSDiscoveryPing # 服務列表類,ribbon默認為com.netflix.loadbalancer.ConfigurationBasedServerList,結合eureka使用時默認值為com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList NIWSServerListClassName=DiscoveryEnabledNIWSServerList # 服務過濾類,ribbon默認為com.netflix.loadbalancer.ZoneAffinityServerListFilter。結合spring cloud eureka使用時默認為org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter NIWSServerListFilterClassName=ZonePreferenceServerListFilter ~~~ # 屬性配置 配置的位置: Ribbon屬性可以定義在屬性文件中,也可以定義在系統變量(system properties)中 屬性格式: ~~~ <clientName>.<nameSpace>.<propertyName>=<value> ~~~ 說明: ~~~ clientName :ribbon的客戶端的名稱。如果此值為沒有配置,則此條屬性會作用到所有的客戶端 nameSpace:ribbon的命令空間,默認值為ribbon,一般不建議修改 propertyName:屬性命令。所有的可用的屬性都在com.netflix.client.conf.CommonClientConfigKey類中定義。若屬性沒有配置,則會使用DefaultClientConfigImpl類中的默認配置 ~~~ **配置文件demo** 除了第一個是配置為全局屬性外,其他的屬性都是為一個名稱為”sample-client”的ribbon客戶端配置的屬性 ~~~ # 設置全局默認的ribbon的連接超時 ribbon.ConnectionTimeout=500 # 設置全局默認的ribbon的讀超時 ribbon.ReadTimeout=1000 # 同一服務器上重試的最大次數(不包括第一次嘗試) sample-client.ribbon.MaxAutoRetries=1 # 要重試的下一個服務器的最大數量(不包括第一個服務器) sample-client.ribbon.MaxAutoRetriesNextServer=1 # 是否可以為此客戶端重試所有操作 sample-client.ribbon.OkToRetryOnAllOperations=true # 從源刷新服務器列表的時間間隔 sample-client.ribbon.ServerListRefreshInterval=2000 # Apache HttpClient使用的連接超時 sample-client.ribbon.ConnectTimeout=3000 # 讀取Apache HttpClient使用的超時 sample-client.ribbon.ReadTimeout=3000 # 服務器的初始列表,可以在運行時通過Archaius動態屬性進行更改 sample-client.ribbon.listOfServers=www.microsoft.com:80,www.yahoo.com:80,www.google.com:80 ~~~ # 自定義RibbonClient 如何為服務消費者自定義Ribbon?Client? ①?代碼自定義RibbonClient 所謂的自定義Ribbon?Client的主要作用就是使用自定義配置替代Ribbon默認的負載均衡策略,注意:自定義的Ribbon?Client是有針對性的,一般一個自定義的Ribbon?Client是對一個服務提供者(包括服務名相同的一系列副本)而言的。自定義了一個Ribbon?Client?它所設定的負載均衡策略只對某一特定服務名的服務提供者有效,但不能影響服務消費者與別的服務提供者通信所使用的策略。根據官方文檔的意思,推薦在?springboot主程序掃描的包范圍之外進行自定義配置類。其實純代碼自定義RibbonClient的話有兩種方式: 方式一:在springboot主程序掃描的包外定義配置類,然后為springboot主程序添加@RibbonClient注解引入配置類? ~~~ @Configuration public class TestConfiguration { @Autowired private IClientConfig config; @Bean public IRule ribbonRule(IClientConfig config) { // 自定義為隨機規則 return new RandomRule(); } } ~~~ 注意:@RibbonClient注解中的name屬性是指服務提供者的服務名(即當前消費者使用自定義配置與其通信的服務提供者的spring.application.name的屬性) ~~~ @RibbonClient(name = "microservice-provider-user",configuration = TestConfiguration.class) ~~~ 方式二:在與springboot主程序的同一級目錄新建RibbonClient的配置類,但是必須在springboot掃描的包范圍內排除掉,方法是自定義注解標識配置類,然后在springboot的添加@ComponentScan根據自定義注解類型過濾掉配置類 自定義注解 ~~~ public @interface ExcludeFromComponentScan { } ~~~ 自定義配置類 ~~~ @Configuration @ExcludeFromComponentScan public class TestConfiguration1 { @Autowired private IClientConfig config; @Bean public IRule ribbonRule(IClientConfig config) { // 自定義為隨機規則 return new RandomRule(); } } ~~~ 在springboot主程序上添加注解 ~~~ @RibbonClient(name = "microservice-provider-user",configuration = TestConfiguration1.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = ExcludeFromComponentScan.class)}) ~~~ ②? 通過配置文件自定義RibbonClient 官方文檔地址:`http://cloud.spring.io/spring-cloud-static/Camden.SR7/#_customizing_the_ribbon_client_using_properties` 意思就是:配置RibbonClient規則是? `<服務名>.ribbon.<類型>=與類型對應的類名(也可以自定義)?` 類型可以為一下幾個:? ~~~ NFLoadBalancerClassName:?應該實現 ILoadBalancer接口 NFLoadBalancerRuleClassName:?應該實現 IRule接口 NFLoadBalancerPingClassName:?應該實現 IPing接口 NIWSServerListClassName:?應該實現ServerList接口 NIWSServerListFilterClassName:?應該實現ServerListFilter接口 ~~~ # Ribbon脫離Eureka使用 官方描述地址:`http://cloud.spring.io/spring-cloud-static/Camden.SR7/#spring-cloud-ribbon-without-eureka` Eureka是用于服務發現和服務注冊、以及使用服務名來解決服務消費者和服務提供者通信時地址的硬編碼問題的。如果Ribbon脫離了Eureka,那么在服務消費者端就無法根據服務名通過心跳機制從EurekaServer端獲取對應服務提供者的IP以及端口號。這時就需要在服務消費者端配置對應服務提供者的地址列表,然后Ribbon才能通過配置文件或者自定義的RibbonClient或者默認的配置獲取負載均衡的輪詢策略進行請求分發。 配置方式: 第一步:檢查是否引入了Eureka。如果服務在依賴中添加了spring-cloud-starter-eureka,這種情況下如果想使Ribbon脫離Eureka使用的話就需要將Eureka禁用掉。僅僅需要添加以下配置,如果沒有引入Eureka就不需要禁用。? ~~~ ribbon: eureka: enabled: false ~~~ 第二步:配置某服務提供者的地址列表以及均衡策略(默認是輪詢) ~~~ <服務提供者名稱>: ribbon: listOfServers: localhost:7901,localhost:7902 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule ~~~ 因為我的Demo中引入了Eureka,所以我的配置如下所示: ~~~ ribbon: eureka: enabled: false microservice-provider-user: ribbon: listOfServers: localhost:7901,localhost:7902 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看