天天看點

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

上篇:

Gavin:Consul服務注冊與發現​zhuanlan.zhihu.com

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

檢查啟動環境

按順序執行:
EurekaMain7001、PaymentMain8001、 OrderMain80、PaymentMain8002、EurekaMain7002主程式
ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

通路測試:http://eureka7001.com:7001/

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

一、概述

1、是什麼?

Spring Cloud Ribbon是基于Netfilx Ribbon實作一套 用戶端負載均衡的工具 。簡單的說,Ribbon是Netfilx 釋出的開源項目,主要功能是提供 用戶端的軟體負載均衡算法和服務調用

。Ribbon用戶端元件提供一系列完善的配置項,如:連接配接逾時、重試等。

簡單的說,就是在配置檔案列出Load Balancer(簡稱LB)後面所有的機器,Ribbon會自動的幫助你基于某種規則(如:簡單輪詢、随機連接配接等)去連接配接這些機器。

我們很容易使用Ribbon實作自定義負載均衡算法。

2、官網資料

https://github.com/Netflix/ribbon/wiki/Getting-Started

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用
ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

code

3、能幹嘛

(1)

LB(負載均衡) 集中式LB
即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬體,如F5,可以是軟體,如nginx),由該實施負責把通路請求通過某種政策轉發至服務的提供方
程序内LB
将LB邏輯內建到消費方,消費方從服務注冊中心獲知有哪些位址可用,然後自己再從這些位址中選擇出一個合适的伺服器。 Ribbon就屬于程序内LB ,它隻是一個類庫,內建于消費方程序,消費方通過它來擷取服務提供方的位址

(2)

80通過輪詢負載通路8001/8002

(3)一句話:負載均衡+RestTemplate調用

二、Ribbon負載均衡示範

1、架構說明

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

架構說明

Ribbon工作時分為2步:

(1)先選擇Eureka Server,它優先選擇在同一個區域内負載較少的Server。

(2)再根據使用者指定的政策,再從Server取到的服務注冊清單中選擇一個位址。其中Ribbon提供了多種政策:比如輪詢、随機和根據響應時間權重。

思考:我們沒有引入Ribbon,為何有負載均衡的作用?

原因:我們的新版本釋出後,我們在引入這個pom檔案:

<!--
           

自帶負載均衡,檢視maven檔案,一目了然。(添加了Ribbon)

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

pom檔案檢視

2、二說RestTemplate的使用

(1)官網:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

(2)

getForObject方法/getForEntity方法
cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudcontrollerOrderController.java
@GetMapping
           

如圖所示:

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

重新開機微服務工程“cloud-consumer-order80”的主程式類“OrderMain80”

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

測試:http://localhost/consumer/payment/get/31 (查詢資料)

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

三、Ribbon核心元件IRule

思考:

除了用過Ribbon輪詢算法還有沒有用過其他?

檢視源碼:ctrl+n(快捷鍵)

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

1

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

2

落地實作

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

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)

注意配置細節
ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

1

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

2

(2)在微服務"

cloud-consumer-order80

"工程下,建立package

cloud2020cloud-consumer-order80srcmainjavacomstudymyruleMySelfRule.java
package 
           

在微服務"

cloud-consumer-order80

"工程下,在主啟動類"OrderMain80"下,添加一個注解"

@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration= MySelfRule.class)

",表示把

輪詢

改為

随機
ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

(3)啟動微服務"

cloud-consumer-order80

"工程,啟動類"OrderMain80"

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

(4)url通路測試:http://localhost/consumer/payment/get/31 (随機算法--替換負載均衡)

知乎視訊​www.zhihu.com

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

四、Ribbon負載均衡算法

1、原理

負載均衡算法:

rest接口第幾次請求數 % 伺服器叢集總數量 = 實際調用伺服器位置下标,每次服務重新開機後rest接口計數從1開始。
ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

2、RoundRobinRule源碼

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

1

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

2

底層源碼:

/*
           

3、手寫輪詢算法

(1)在微服務"cloud-provider-payment8001"工程下,PaymentController基礎上添加一行代碼:

cloud2020cloud-provider-payment8001srcmainjavacomstudyspringcloudcontrollerPaymentController.java
@GetMapping
           

如圖所示:

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

(2)同理,在微服務"cloud-provider-payment8002"工程下,PaymentController基礎上添加一行代碼:

cloud2020cloud-provider-payment8002srcmainjavacomstudyspringcloudcontrollerPaymentController.java
@GetMapping
           

如圖所示:

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

另,在微服務"cloud-consumer-order80"工程下,ApplicationContextConfig類的"

@LoadBalanced",注釋掉,如圖所示:
ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

現在開始手寫輪詢算法

(1)建立一個lb包,LoadBalancer接口

cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudlbLoadBalancer.java
package 
           

實作類

cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudlbMyLB.java
package 
           

另防止出錯,在test檔案目錄下建立T類,測試以下,如圖所示:

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

代碼:

cloud2020cloud-consumer-order80srctestjavaT.java
public 
           

啟動T程式,控制台列印輸出:

整型最大值
ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

(2)在微服務"cloud-consumer-order80"工程下,在"OrderController"類,引入LoadBalancer類:

cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudcontrollerOrderController.java
@Resource
 
           

如圖所示:

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

另:繼續在目前類寫代碼:

cloud2020cloud-consumer-order80srcmainjavacomstudyspringcloudcontrollerOrderController.java
//編寫服務消費者方法,記得注釋 @LoadBalanced 注解,否則不生效
           

完整代碼:

package 
           

(3)啟動微服務"cloud-consumer-order80"工程的OrderMain80主程式類

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

(4)測試通路:http://localhost/consumer/payment/lb (Web頁面重新整理,背景列印輸出),示範如下:

知乎視訊​www.zhihu.com

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

如圖所示:

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

前台通路重新整理

ribbon 預設負載均衡 是什麼_Ribbon負載均衡調用

控制台列印輸出