Spring Cloud Ribbon 是Spring Cloud Netflix 子項目的核心元件之一,主要給服務間調用及API網關轉發提供負載均衡的功能,本文将對其用法進行詳細介紹。
在微服務架構中,很多服務都會部署多個,其他服務去調用該服務的時候,如何保證負載均衡是個不得不去考慮的問題。負載均衡可以增加系統的可用性和擴充性,當我們使用RestTemplate來調用其他服務時,Ribbon可以很友善的實作負載均衡功能。
RestTemplate是一個HTTP用戶端,使用它我們可以友善的調用HTTP接口,支援GET、POST、PUT、DELETE等方法。
傳回對象為響應體中資料轉化成的對象,舉例如下:
傳回對象為ResponseEntity對象,包含了響應中的一些重要資訊,比如響應頭、響應狀态碼、響應體等,舉例如下:
首先我們建立一個user-service,用于給Ribbon提供服務調用。
主要是配置了端口和注冊中心位址。
UserController類定義了對User對象常見的CRUD接口。
這裡我們建立一個ribbon-service子產品來調用user-service子產品示範負載均衡的服務調用。
主要是配置了端口、注冊中心位址及user-service的調用路徑。
可以看出使用Ribbon的負載均衡功能非常簡單,和直接使用RestTemplate沒什麼兩樣,隻需給RestTemplate添加一個@LoadBalanced即可。
注入RestTemplate,使用其調用user-service中提供的相關接口,這裡對GET和POST調用進行了示範,其他方法調用均可參考。
啟動eureka-server于8001端口;
啟動user-service于8201端口;
啟動另一個user-service于8202端口,可以通過修改IDEA中的SpringBoot的啟動配置實作:

此時運作中的服務如下:
調用接口進行測試:http://localhost:8301/user/1
可以發現運作在8201和8202的user-service控制台交替列印如下資訊:
與全局配置的差別就是ribbon節點挂在服務名稱下面,如下是對ribbon-service調用user-service時的單獨配置。
所謂的負載均衡政策,就是當A服務調用B服務時,此時B服務有多個執行個體,這時A服務以何種方式來選擇調用的B執行個體,ribbon可以選擇以下幾種負載均衡政策。
com.netflix.loadbalancer.RandomRule:從提供服務的執行個體中以随機的方式;
com.netflix.loadbalancer.RoundRobinRule:以線性輪詢的方式,就是維護一個計數器,從提供服務的執行個體中按順序選取,第一次選第一個,第二次選第二個,以此類推,到最後一個以後再從頭來過;
com.netflix.loadbalancer.RetryRule:在RoundRobinRule的基礎上添加重試機制,即在指定的重試時間内,反複使用線性輪詢政策來選擇可用執行個體;
com.netflix.loadbalancer.WeightedResponseTimeRule:對RoundRobinRule的擴充,響應速度越快的執行個體選擇權重越大,越容易被選擇;
com.netflix.loadbalancer.BestAvailableRule:選擇并發較小的執行個體;
com.netflix.loadbalancer.AvailabilityFilteringRule:先過濾掉故障執行個體,再選擇并發較小的執行個體;
com.netflix.loadbalancer.ZoneAwareLoadBalancer:采用雙重過濾,同時過濾不是同一區域的執行個體和故障執行個體,選擇并發較小的執行個體。
https://github.com/macrozheng/springcloud-learning