spring boot 負載均衡Ribbon
git地址
https://github.com/a18792721831/studySpringCloud.git
1. RestTemplate簡介
RestTemplate 是 Spring Resources 中一個訪問第三方RESTful API 接口的網絡請求框架。RestTemplate 的設計原則和其他 Spring Template(例如JdbcTemplate、JmsTemplate)類似,都是爲執行復雜任務提供了一個具有默認行爲的簡單方法。
RestTemplate 是用來消費 REST 服務的,所以 RestTemplate 的主要方法都與REST的 Http協議的一些方法緊密相連,例如 HEAD、GET、POST、PUT、DELETE和 OPTIONS 等方法,這些方法在 RestTemplate 類對應的方法爲 headForHeaders()、getForObject()、postForObject()、put()和delete()等。
我們在寫測試方法時用到的TestRestTemplate
就是用RestTemplate實現的
2. Ribbon簡介
負載均衡是指將負載分攤到多個執行單元上,常見的負載均衡有兩種方式。一種是獨立進程單元,通過負載均衡策略,將請求轉發到不同的執行單元上,例如Ngnix。另一種是將負載均衡邏輯以代碼的形式封裝到服務消費者的客戶端上,服務消費者客戶端維護了一份服務提供者的信息列表,有了信息列表,通過負載均衡策略將請求分攤給多個服務提供者,從而達到負載均衡的目的。
Ribbon是 Netflix 公司開源的一個負載均衡的組件,它屬於上述的第二種方式,是將負載均衡邏輯封裝在客戶端中,並且運行在客戶端的進程裏。Ribbon是一個經過了雲端測試的IPC庫,可以很好地控制HTTP和TCP客戶端的負載均衡行爲。
在Spring Cloud 構建的微服務系統中,Ribbon作爲服務消費者的負載均衡器,有兩種使用方式,一種是和RestTemplate相結合,另一種是和 Feign相結合。
Ribbon有很多子模塊,但很多模塊沒有用於生產環境,目前Netilix 公司用於生產環境的Ribbon子模塊如下。
- ribbon-loadbalancer:可以獨立使用或與其他模塊一起使用的負載均衡器API。
- ribbon-cureka:Ribbon 結合 Eureka 客戶端的API,爲負載均衡器提供動態服務註冊列
表信息。 - ribbon-core:Ribbon的核心API。
不知是否還有人維護?
積累了140多個issues沒人處理
3. 實例–使用RestTemplate和Ribbon消費服務
3.1 啓動eureka server
3.2 多實例啓動eureka client
3.3 驗證eureka
3.4 創建 Ribbon模塊
項目結構
3.5 配置
3.6 創建Ribbon Config類
只需要在程序的IoC容器中注入一個restTemplate的Bean,並在這個Bean上加上@LoadBalanced註解,此時RestTemplate就結合Ribbon開啓了負載均衡。(爲什麼?負載均衡策略有哪些?存疑)
3.7 創建service
3.8 service test
結果
默認是輪詢策略。
3.9 創建controller
3.10 controller test
結果
3.11 啓動
訪問
4. LoadBalancerClent
負載均衡器的核心類爲LoadBalancerClient,它可以獲取負載均衡的服務提供者的實例信息。
我們上述的項目基礎上,在創建一個模塊。
如下配置
寫一個controller
打上斷點,調試啓動。
不要忘記這裏:
查看choose方法
這裏getserver,打上斷點,繼續。
首先看getLoadBalancer
進入打斷點
接下來
getLoadBalancer
通過反射,獲取IClientConfig.
接下來是
loadBalancer有什麼?
從上述圖片看出,本次請求應該是8764
看下allServers
是個接口,其實現有
有四個實現類,本次使用從調試信息看是使用第二個實現類。猜測這裏應該是不同的策略。
5. 本地serverList
在4的基礎上進行修改:
設置不連接eureka server
且定義stores,這個stores就是我們之前的eureka-client 的url
接着修改controller
然後運行:
這裏的list就是我們配置的本地的list