5.Ribbon
通過上面的學習,我們知道eureka可以實現(xiàn)多服務之間的相互注冊調用但是多個"相同服務"之間又該怎么管理呢?
經過以上的學習,已經實現(xiàn)了服務的注冊和服務發(fā)現(xiàn)。當啟動某個服務的時候,可以通過HTTP的形式
將信息注冊到注冊中心,并且可以通過SpringCloud提供的工具獲取注冊中心的服務列表。但是服務之
間的調用還存在很多的問題,如何更加方便的調用微服務,多個微服務的提供者如何選擇,如何負載均
衡等。
Ribbon概述
什么是Ribbon
是 Netflflixfa 發(fā)布的一個負載均衡器,有助于控制 HTTP 和 TCP客戶端行為。在 SpringCloud 中,
Eureka一般配合Ribbon進行使用,Ribbon提供了客戶端負載均衡的功能,Ribbon利用從Eureka中讀
取到的服務信息,在調用服務節(jié)點提供的服務時,會合理的進行負載。
在SpringCloud中可以將注冊中心和Ribbon配合使用,Ribbon自動的從注冊中心中獲取服務提供者的
列表信息,并基于內置的負載均衡算法,請求服務
Ribbon的主要作用
(1)服務調用
基于Ribbon實現(xiàn)服務調用, 是通過拉取到的所有服務列表組成(服務名-請求路徑的)映射關系。借助
RestTemplate 最終進行調用
(2)負載均衡
當有多個服務提供者時,Ribbon可以根據負載均衡的算法自動的選擇需要調用的服務地址

基于Ribbon實現(xiàn)訂單調用商品服務
不論是基于Eureka的注冊中心還是基于Consul的注冊中心,SpringCloudRibbon統(tǒng)一進行了封裝,所
以對于服務調用,兩者的方式是一樣的。
坐標依賴
在springcloud提供的服務發(fā)現(xiàn)(eureka)的jar中以及包含了Ribbon的依賴。所以這里不需要導入任何額外的坐標
工程改造
(1) 服務消費者
修改服務消費者 order_service模塊中的啟動類OrderApplication ,在創(chuàng)建RestTemplate方法
上添加 @LoadBalanced 注解 :
修改controller代碼:
/** * 基于Ribbon的形式調用遠程微服務 * 1.在啟動類里面使用@LoadBalanced聲明RestTemplate * 2.使用服務名替換IP地址 */ @RequestMapping(value = "/buybuybuy/{id}", method = RequestMethod.GET) public Product findById3(@PathVariable Long id) { // Product product = restTemplate.getForObject("http://127.0.0.1:9001/product/findById/1", Product.class); Product product = restTemplate.getForObject("http://service-product/product/findById/1", Product.class); return product; }
服務調用Ribbon高級
負載均衡概述
在搭建網站時,如果單節(jié)點的 web服務性能和可靠性都無法達到要求;或者是在使用外網服務時,經常
擔心被人攻破,一不小心就會有打開外網端口的情況,通常這個時候加入負載均衡就能有效解決服務問
題。
負載均衡是一種基礎的網絡服務,其原理是通過運行在前面的負載均衡服務,按照指定的負載均衡算
法,將流量分配到后端服務集群上,從而為系統(tǒng)提供并行擴展的能力。
負載均衡的應用場景包括流量包、轉發(fā)規(guī)則以及后端服務,由于該服務有內外網個例、健康檢查等功
能,能夠有效提供系統(tǒng)的安全性和可用性
客戶端負載均衡與服務端負載均衡
服務端負載均衡
先發(fā)送請求到負載均衡服務器或者軟件,然后通過負載均衡算法,在多個服務器之間選擇一個進行訪
問;即在服務器端再進行負載均衡算法分配
客戶端負載均衡
客戶端會有一個服務器地址列表,在發(fā)送請求前通過負載均衡算法選擇一個服務器,然后進行訪問,這
是客戶端負載均衡;即在客戶端就進行負載均衡算法分配
基于Ribbon實現(xiàn)負載均衡(客戶端負載均衡)
Ribbon是一個典型的客戶端負載均衡器,Ribbon會獲取服務的所有地址,根據內部的負載均衡算法,獲取本次請求的有效地址
搭建多服務實例:
1.建立兩個商品服務9001,9011;

2.在訂單服務中以負載均衡的方式調用商品服務
@RequestMapping(value = "/buybuybuy/{id}", method = RequestMethod.GET)
public Product findById3(@PathVariable Long id) {
// Product product = restTemplate.getForObject("http://127.0.0.1:9001/product/findById/1", Product.class);
Product product = restTemplate.getForObject("http://service-product/product/findById/1", Product.class);//ribbon已經默認開啟負載均衡訪問
return product;
}
3.通過訂單服務訪問商品服務:


通過上面我們可以發(fā)現(xiàn),ribbon默認會對多個服務進行輪詢訪問
ribbon負載均衡策略
Ribbon內置了多種負載均衡策略,內部負責復雜均衡的頂級接口為
com.netflix.loadbalancer.IRule ,實現(xiàn)方式如下

com.netflix.loadbalancer.RoundRobinRule :以輪詢的方式進行負載均衡。(默認)
com.netflix.loadbalancer.RandomRule :隨機策略
com.netflix.loadbalancer.RetryRule :重試策略。
com.netflix.loadbalancer.WeightedResponseTimeRule :權重策略。會計算每個服務的權
重,越高的被調用的可能性越大。
com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍歷所有的服務實例,過濾掉
故障實例,并返回請求數最小的實例返回。
com.netflix.loadbalancer.AvailabilityFilteringRule :可用過濾策略。過濾掉故障和請
求數超過閾值的服務實例,再從剩下的實力中輪詢調用。
在服務消費者的application.yml配置文件中修改負載均衡策略 :
##需要調用的微服務名稱 service-product: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
策略選擇:
1、如果每個機器配置一樣,則建議不修改策略 (推薦)
2、如果部分機器配置強部分配置低,則可以改為 WeightedResponseTimeRule
ribbon請求重試
在負載均衡的時候訪問某個服務,如果在指定時間內沒有獲得響應,那么ribbon會立即重試訪問其他節(jié)點:

重試配置:
1.消費者引入spring重試依賴
2.在消費者yml文件里對ribbon進行重試配置
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
#ribbon重試機制配置
service-product:
ribbon:
ConnectTimeout: 250 # Ribbon的連接超時時間(毫秒)
ReadTimeout: 1000 # Ribbon的數據讀取超時時間(毫秒)
OkToRetryOnAllOperations: true # 是否對所有操作都進行重試
MaxAutoRetriesNextServer: 1 # 切換實例的重試次數
MaxAutoRetries: 1 # 對當前(失敗)實例的重試次數

浙公網安備 33010602011771號