知道Feign組件,肯定知道還有一個Ribbon組件,我們來看一下這兩個的區(qū)別拥峦。
-
Ribbon和Feign簡單介紹
spring cloud的 Netflix 中提供了兩個組件實現(xiàn)軟負載均衡調用:ribbon 和 feign运怖。
Ribbon
是一個基于 HTTP 和 TCP 客戶端 的負載均衡的工具。
它可以 在客戶端 配置 RibbonServerList(服務端列表)搀矫,使用 HttpClient 或 Sprig的RestTemplate模擬http請求抹沪,就跟我們平常調用hhtp接口的操作比較相似。Ribbon在調取服務的過程瓤球,使用的http的服務地址是注冊中心的服務地址融欧,多個相同的服務在注冊中心注冊,通過Ribbon卦羡,就可以實現(xiàn)對相同服務的負載均衡噪馏。Feign
Feign是在 Ribbon的基礎上進行了一次改進升級麦到,是一個使用起來更加方便的 HTTP 客戶端。
其采用接口的方式欠肾, `只需要創(chuàng)建一個接口瓶颠,在接口上面添加@FeignClient注解并指明要調取的服務提供者mingc,然后在接口方法上通過@RequestMapping注解加上服務提供者的接口地址刺桃,即可實現(xiàn)服務的調用 粹淋,將需要調用的其他服務的方法定義成抽象方法即可,不需要自己構建http請求瑟慈,通過接口抽象桃移,使項目看起來層次比較清晰明了,所以大家一般都選擇Feign是在葛碧。因為Feign本身里面就包含有了Ribbon借杰,因為ribbon具有負載均衡功能,所以feign也繼承了此功能进泼。
-
負載均衡的實現(xiàn)
在上篇博客中第步,最后我們已經(jīng)實現(xiàn)了Feign的負載均衡。
項目模塊結構圖
通過在cloud-consumer模塊中加入負載均衡bean配置缘琅,即可實現(xiàn)默認的輪訓負載均衡機制粘都。
package com.consumer.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @author: yhl * @DateTime: 2019/12/9 13:37 * @Description: */ @Configuration public class ConfigBean { /** * 默認按順序輪詢 * @return */ @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
我們重點說一下負載均衡均衡策略的切換。
-
復雜均衡策略的切換
先了解一下Ribbon中實現(xiàn)了那幾種負載均衡算法刷袍。
我們先看一下翩隧,Ribbon負載均衡設計類結構,首先在idea中找到抽象類AbstractLoadBalancerRule.java
在類中的類名上右鍵選擇查看類圖
結構如下呻纹,可以看出是實現(xiàn)了兩個規(guī)范接口堆生。
我們繼續(xù)查看AbstractLoadBalancerRule.java的實現(xiàn)類,在上面的類圖AbstractLoadBalancerRule的框上鼠標右鍵雷酪,選擇show implmentations淑仆,出現(xiàn)如下內(nèi)容:
我們可以看出AbstractLoadBalancerRule有這么多實現(xiàn)類,通過類名哥力,我們就可以看出這是負載均衡實現(xiàn)的算法類蔗怠。
介紹一下 Ribbon的幾個比較常用的負載均衡實現(xiàn)
策略類 命名 說明 RandomRule 隨機策略 隨機選擇 Server RoundRobinRule 輪訓策略 按順序循環(huán)選擇 Server RetryRule 重試策略 在一個配置時問段內(nèi)當選擇 Server 不成功,則一直嘗試選擇一個可用的 Server BestAvailableRule 最低并發(fā)策略 逐個考察 Server吩跋,如果 Server 斷路器打開寞射,則忽略,再選擇其中并發(fā)連接最低的 Server AvailabilityFilteringRule 可用過濾策略 過濾掉一直連接失敗并被標記為 circuit tripped
的 Server锌钮,過濾掉那些高并發(fā)連接的 Server(active connections 超過配置的網(wǎng)值)ResponseTimeWeightedRule 響應時間加權策略 根據(jù) Server 的響應時間分配權重桥温。響應時間越長,權重越低梁丘,被選擇到的概率就越低侵浸;響應時間越短旺韭,權重越高,被選擇到的概率就越高掏觉。這個策略很貼切茂翔,綜合了各種因素,如:網(wǎng)絡履腋、磁盤珊燎、IO等,這些因素直接影響著響應時間 ZoneAvoidanceRule 區(qū)域權衡策略 綜合判斷 Server 所在區(qū)域的性能和 Server 的可用性輪詢選擇 Server遵湖,并且判定一個 AWS Zone 的運行性能是否可用悔政,剔除不可用的 Zone 中的所有 Server 具體可參考:http://www.reibang.com/p/186b4ceea6fc, 感謝作者延旧。
Ribbon默認使用的是RoundRobinRule輪訓策略谋国。
那么在我們在項目中到底如何切換自己想要的均衡策略模式呢?我們嘗試實現(xiàn)其中的一種
在cloud-consumer模塊中的application.文件中加入如下配置:
cloud-service: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
cloud-service為服務提供者在注冊中心的服務名稱迁沫。參數(shù)value為復雜均衡實現(xiàn)類在Ribbon包中的路徑芦瘾,如RandomRule隨機策略的類路徑類為:com.netflix.loadbalancer.RandomRule。切換的話只需要更改其他的算法實現(xiàn)類的類路徑集畅。(個人覺得這個方法好蹩腳近弟,必須知道負載均衡相關的算法類)
還有其他的配置方式,具體的請參考:https://blog.csdn.net/wo18237095579/article/details/83384134挺智,
感謝作者祷愉。 -
實現(xiàn)自定義負載均衡策
創(chuàng)建自定義策略類,繼承抽象類AbstractLoadBalancerRule赦颇,重寫choose方法為自己的負載均衡邏輯二鳄,在配置類中添加下bean配置。
@Bean public IRule myRule() { return new CustomeRule(); //自定義負載均衡規(guī)則 }
具體可參考:https://www.cnblogs.com/yufeng218/p/10952724.html媒怯,感謝作者订讼。