![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN3UzY4AjN0QDMhNTMzIzN1ATNwEzNjVmMlZjYzITN28CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
上篇:
Gavin:Consul服務注冊與發現zhuanlan.zhihu.com
檢查啟動環境
按順序執行:EurekaMain7001、PaymentMain8001、 OrderMain80、PaymentMain8002、EurekaMain7002主程式
通路測試:http://eureka7001.com:7001/
一、概述
1、是什麼?
Spring Cloud Ribbon是基于Netfilx Ribbon實作一套 用戶端負載均衡的工具 。簡單的說,Ribbon是Netfilx 釋出的開源項目,主要功能是提供 用戶端的軟體負載均衡算法和服務調用。Ribbon用戶端元件提供一系列完善的配置項,如:連接配接逾時、重試等。
簡單的說,就是在配置檔案列出Load Balancer(簡稱LB)後面所有的機器,Ribbon會自動的幫助你基于某種規則(如:簡單輪詢、随機連接配接等)去連接配接這些機器。
我們很容易使用Ribbon實作自定義負載均衡算法。
2、官網資料
https://github.com/Netflix/ribbon/wiki/Getting-Started
code
3、能幹嘛
(1)
LB(負載均衡) 集中式LB即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬體,如F5,可以是軟體,如nginx),由該實施負責把通路請求通過某種政策轉發至服務的提供方程序内LB
将LB邏輯內建到消費方,消費方從服務注冊中心獲知有哪些位址可用,然後自己再從這些位址中選擇出一個合适的伺服器。 Ribbon就屬于程序内LB ,它隻是一個類庫,內建于消費方程序,消費方通過它來擷取服務提供方的位址
(2)
80通過輪詢負載通路8001/8002(3)一句話:負載均衡+RestTemplate調用
二、Ribbon負載均衡示範
1、架構說明
架構說明
Ribbon工作時分為2步:
(1)先選擇Eureka Server,它優先選擇在同一個區域内負載較少的Server。
(2)再根據使用者指定的政策,再從Server取到的服務注冊清單中選擇一個位址。其中Ribbon提供了多種政策:比如輪詢、随機和根據響應時間權重。
思考:我們沒有引入Ribbon,為何有負載均衡的作用?
原因:我們的新版本釋出後,我們在引入這個pom檔案:
<!--
自帶負載均衡,檢視maven檔案,一目了然。(添加了Ribbon)
pom檔案檢視
2、二說RestTemplate的使用
(1)官網:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html
(2)
getForObject方法/getForEntity方法cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudcontrollerOrderController.java
@GetMapping
如圖所示:
重新開機微服務工程“cloud-consumer-order80”的主程式類“OrderMain80”
測試:http://localhost/consumer/payment/get/31 (查詢資料)
三、Ribbon核心元件IRule
思考:
除了用過Ribbon輪詢算法還有沒有用過其他?檢視源碼:ctrl+n(快捷鍵)
1
2
落地實作
1、IRule: 根據特定算法從服務清單中選取一個要通路的服務
(1) com.netflix.loadbalancer.RoundRobinRule【輪詢】
(2)
com.netflix.loadbalancer.RandomRule【随機】
(3)
com.netflix.loadbalancer.RetryRule【先按照RoundRobinRule的政策擷取服務,如果擷取服務失敗則在指定時間内進行重試,擷取可用的服務】
(4)
WeightedResponseTimeRule【對RoundRobinRule的擴充,響應速度越快的執行個體選擇權重越多大,越容易被選擇】
(5)
BestAvailableRule【會先過濾掉由于多次通路故障而處于斷路器跳閘狀态的服務,然後選擇一個并發量最小的服務】
(6)
AvailabilityFilteringRule【先過濾掉故障執行個體,再選擇并發較小的執行個體】
(7)
ZoneAvoidanceRule 【預設規則,複合判斷server所在區域的性能和server的可用性選擇伺服器】
2、如何替換
(1)
注意配置細節1
2
(2)在微服務"
cloud-consumer-order80"工程下,建立package
cloud2020cloud-consumer-order80srcmainjavacomstudymyruleMySelfRule.java
package
在微服務"
cloud-consumer-order80"工程下,在主啟動類"OrderMain80"下,添加一個注解"
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration= MySelfRule.class)",表示把
輪詢改為
随機(3)啟動微服務"
cloud-consumer-order80"工程,啟動類"OrderMain80"
(4)url通路測試:http://localhost/consumer/payment/get/31 (随機算法--替換負載均衡)
知乎視訊www.zhihu.com
四、Ribbon負載均衡算法
1、原理
負載均衡算法:
rest接口第幾次請求數 % 伺服器叢集總數量 = 實際調用伺服器位置下标,每次服務重新開機後rest接口計數從1開始。2、RoundRobinRule源碼
1
2
底層源碼:
/*
3、手寫輪詢算法
(1)在微服務"cloud-provider-payment8001"工程下,PaymentController基礎上添加一行代碼:
cloud2020cloud-provider-payment8001srcmainjavacomstudyspringcloudcontrollerPaymentController.java
@GetMapping
如圖所示:
(2)同理,在微服務"cloud-provider-payment8002"工程下,PaymentController基礎上添加一行代碼:
cloud2020cloud-provider-payment8002srcmainjavacomstudyspringcloudcontrollerPaymentController.java
@GetMapping
如圖所示:
另,在微服務"cloud-consumer-order80"工程下,ApplicationContextConfig類的"
@LoadBalanced",注釋掉,如圖所示:現在開始手寫輪詢算法
(1)建立一個lb包,LoadBalancer接口
cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudlbLoadBalancer.java
package
實作類
cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudlbMyLB.java
package
另防止出錯,在test檔案目錄下建立T類,測試以下,如圖所示:
代碼:
cloud2020cloud-consumer-order80srctestjavaT.java
public
啟動T程式,控制台列印輸出:
整型最大值(2)在微服務"cloud-consumer-order80"工程下,在"OrderController"類,引入LoadBalancer類:
cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudcontrollerOrderController.java
@Resource
如圖所示:
另:繼續在目前類寫代碼:
cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudcontrollerOrderController.java
//編寫服務消費者方法,記得注釋 @LoadBalanced 注解,否則不生效
完整代碼:
package
(3)啟動微服務"cloud-consumer-order80"工程的OrderMain80主程式類
(4)測試通路:http://localhost/consumer/payment/lb (Web頁面重新整理,背景列印輸出),示範如下:
知乎視訊www.zhihu.com
如圖所示:
前台通路重新整理
控制台列印輸出