微服務負載均衡Robbin

来源:https://www.cnblogs.com/zhaosq/archive/2019/02/28/10287214.html
-Advertisement-
Play Games

在上一篇中講解Eureka註冊中心的案例,我們啟動了一個user-service,然後通過DiscoveryClient來獲取服務實例信息,然後獲取ip和埠來訪問。 但是實際環境中,我們往往會開啟很多個user-service的集群。此時我們獲取的服務列表中就會有多個,到底該訪問哪一個呢? 一般這 ...


上一篇中講解Eureka註冊中心的案例,我們啟動了一個user-service,然後通過DiscoveryClient來獲取服務實例信息,然後獲取ip和埠來訪問。

但是實際環境中,我們往往會開啟很多個user-service的集群。此時我們獲取的服務列表中就會有多個,到底該訪問哪一個呢?

一般這種情況下我們就需要編寫負載均衡演算法,在多個實例列表中進行選擇。

不過Eureka中已經幫我們集成了負載均衡組件:Ribbon,簡單修改代碼即可使用。

什麼是Ribbon:

接下來,我們就來使用Ribbon實現負載均衡。

7.1.啟動兩個服務實例

首先我們啟動兩個user-service實例,一個8081,一個8082。

  

Eureka監控面板:

7.2.開啟負載均衡

因為Eureka中已經集成了Ribbon,所以我們無需引入新的依賴。直接修改代碼:

在RestTemplate的配置方法上添加@LoadBalanced註解:

 @Bean
 @LoadBalanced
 public RestTemplate restTemplate() {
    return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
 }

 修改調用方式,不再手動獲取ip和埠,而是直接通過服務名稱調用:

訪問頁面,查看結果:

完美!

7.3.源碼跟蹤

為什麼我們只輸入了service名稱就可以訪問了呢?之前還要獲取ip和埠。

顯然有人幫我們根據service名稱,獲取到了服務實例的ip和埠。它就是LoadBalancerInterceptor

我們進行源碼跟蹤:

繼續跟入execute方法:發現獲取了8082埠的服務

再跟下一次,發現獲取的是8081:

7.4.負載均衡策略

Ribbon預設的負載均衡策略是簡單的輪詢,我們可以測試一下:

編寫測試類,在剛纔的源碼中我們看到攔截中是使用RibbonLoadBalanceClient來進行負載均衡的,其中有一個choose方法,是這樣介紹的:

現在這個就是負載均衡獲取實例的方法。

我們對註入這個類的對象,然後對其測試:

結果:

符合了我們的預期推測,確實是輪詢方式。

我們是否可以修改負載均衡的策略呢?

繼續跟蹤源碼,發現這麼一段代碼:

我們看看這個rule是誰:

這裡的rule預設值是一個RoundRobinRule,看類的介紹:

這不就是輪詢的意思嘛。

我們註意到,這個類其實是實現了介面IRule的,查看一下:

定義負載均衡的規則介面。

它有以下實現:

SpringBoot也幫我們提供了修改負載均衡規則的配置入口:

user-service:
ribbon:
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

格式是:{服務名稱}.ribbon.NFLoadBalancerRuleClassName,值就是IRule的實現類。

再次測試,發現結果變成了隨機:

7.5.重試機制

Eureka的服務治理強調了CAP原則中的AP,即可用性和可靠性。它與Zookeeper這一類強調CP(一致性,可靠性)的服務治理框架最大的區別在於:Eureka為了實現更高的服務可用性,犧牲了一定的一致性,極端情況下它寧願接收故障實例也不願丟掉健康實例,正如我們上面所說的自我保護機制。

但是,此時如果我們調用了這些不正常的服務,調用就會失敗,從而導致其它服務不能正常工作!這顯然不是我們願意看到的。

我們現在關閉一個user-service實例:

因為服務剔除的延遲,consumer並不會立即得到最新的服務列表,此時再次訪問你會得到錯誤提示:

但是此時,8081服務其實是正常的。

因此Spring Cloud 整合了Spring Retry 來增強RestTemplate的重試能力,當一次服務調用失敗後,不會立即拋出一次,而是再次重試另一個服務。

只需要簡單配置即可實現Ribbon的重試:

根據如上配置,當訪問到某個服務超時後,它會再次嘗試訪問下一個服務實例,如果不行就再換一個實例,如果不行,則返回失敗。切換次數取決於MaxAutoRetriesNextServer參數的值

引入spring-retry依賴

   <dependency>
         <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
  </dependency>

我們重啟user-consumer-demo,測試,發現即使user-service2宕機,也能通過另一臺服務實例獲取到結果!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 微信分享需要手機掃描二維碼,需要對url進行編碼。在https協議下,掃描二維碼時,瀏覽器打不開可能時安全證書導致的。 ...
  • 此處有兩大坑: 1、下載easemob-websdk此npm包時,並沒有下載strophe.js、crypto-js、underscore這三個包,需要自己手動下載。 2、如下方標紅位置所示,需要自己手動改動npm包內代碼才可使用。 一、安裝npm包 1、npm install easemob-we ...
  • 恢復內容開始 恢復內容結束 ...
  • GitHub : "https://github.com/WozHuang/mp extend" 相關文章 : "小程式全局狀態管理,在頁面中獲取globalData和使用globalSetData" "通過頁面預載入(preload)提升小程式的響應速度" 主要目標 小程式本身的坑不少,開發時免不 ...
  • 1、配置此路由的標題title 2、配置組件是否需要緩存 ...
  • Flask租房項目總結 分析需求文檔,需要完成的功能模塊有: 登陸註冊 首頁展示,首頁搜索 詳情展示,訂單預定 個人中心的用戶信息修改 我的訂單展示,客戶訂單展示 我的房源,上傳圖片和實名認證 登陸註冊 首頁展示,首頁搜索 詳情展示,訂單預定 個人中心的用戶信息修改 我的訂單展示,客戶訂單展示 我的 ...
  • 移動APP開發框架盤點 總體概述 現在比較流行的移動APP開發框架有以下六種:網頁、混合、漸進、原生、橋接、自繪。前三種體驗與Web的體驗相似,後三種與原生APP的體驗相似。這六種框架形式,都有自己適用的範圍。無所謂好壞,適用就是好。 l 網頁應用適用於傳統網站APP化,比如淘寶、京東,有大量WEB ...
  • 不知不覺已經工作很久了。 從在校參加軟體設計大賽第一次寫項目代碼,到現在已經6年7個月了。 從一開始不知道如何就業,到第一次軟體設計大賽後,決定寫代碼為生。 從在校實習工作的不順心,到明白技術的重要性。事實證明3個月的實習,給我後來的工作也帶來不少幫助。 後來去實習,大四一整年都在企業內度過。當時交 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...