當前位置:網站首頁>ribbon
ribbon
2022-06-24 04:22:35【InfoQ】
一、Ribbon、
基本概念:
Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務的REST模版請求自動轉換成客戶端負載均衡的服務調用。Spring Cloud Ribbon雖然只是一個工具類框架,它不像服務注册中心、配置中心、API網關那樣需要獨立部署,但是它幾乎存在於每一個Spring Cloud構建的微服務和基礎設施中。因為微服務間的調用,API網關的請求轉發等內容,實際上都是通過Ribbon來實現的,包括後續我們將要介紹的Feign,它也是基於Ribbon實現的工具。所以,對Spring Cloud Ribbon的理解和使用,對於我們使用Spring Cloud來構建微服務非常重要。
2、客戶端負載均衡負載均衡在系統架構中是一個非常重要,並且是不得不去實施的內容。因為負載均衡是對系統的高可用、網絡壓力的緩解和處理能力擴容的重要手段之一。我們通常所說的負載均衡都指的是服務端負載均衡,其中分為硬件負載均衡和軟件負載均衡。硬件負載均衡主要通過在服務器節點之間按照專門用於負載均衡的設備,比如F5等;
而軟件負載均衡則是通過在服務器上安裝一些用於負載均衡功能或模塊等軟件來完成請求分發工作,比如Nginx等。不論采用硬件負載均衡還是軟件負載均衡,只要是服務端都能以類似下圖的架構方式構建起來:硬件負載均衡的設備或是軟件負載均衡的軟件模塊都會維護一個可用的服務端清單,通過心跳檢測來剔除故障的服務端節點,以保證清單中都是可以正常訪問的服務端節點。當客戶端發送請求到負載均衡設備的時候,該設備按某種算法(比如線性輪詢、按權重負載、按流量負載等)從維護的可用服務端清單中取出一臺服務端地址,然後進行轉發。而客戶端負載均衡和服務端負載均衡最大的不同點在於上面所提到服務清單所存儲的比特置。在客戶端負載均衡中,所有客戶端節點都維護著自己要訪問的服務端清單,而這些服務端端清單來自於服務注册中心,比如上一章我們介紹的Eureka服務端。同服務端負載均衡的架構類似,在客戶端負載均衡中也需要心跳去維護服務端清單的健康性。Ribbon默認會創建針對各個服務治理框架的自動化整合配置,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration。在實際使用的時候,我們可以通過查看這兩個類的實現,以找到它們的配置詳情來幫助我們更好地使用它。
二、實現服務調用通過Spring Cloud Ribbon的封裝,我們在微服務架構中使用客戶端負載均衡調用非常簡單,只需要如下兩步:服務提供者只需要啟動多個服務實例並注册到一個注册中心或是多個相關聯的服務注册中心。
服務消費者直接通過調用被@LoadBalanced注解修飾過的RestTemplate來實現面向服務的接口調用。
這樣,我們就可以將服務提供者的高可用以及服務消費者的負載均衡調用一起實現了。1、在調用端添加pom依賴在statistics微服務中添加
@Configurationpublic class RibbonConfig {
//負載均衡
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}3、調用微服務在調用端的DailyService中使用 RestTemplate 給遠程發送請求接口void createStatisticsByDay(String day);實現@AutowiredRestTemplate restTemplate;
@Transactional(rollbackFor = Exception.class)@Overridepublic void createStatisticsByDay(String day) {
//如果當日的統計記錄已存在,則删除重新統計|或 提示用戶當日記錄已存在
QueryWrapper<Daily> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("date_calculated", day);
baseMapper.delete(queryWrapper);
//生成統計記錄
R r = restTemplate.getForObject("http://guli-ucenter/admin/ucenter/member/count-register/{day}", R.class, day);
Integer registerNum = (Integer) r.getData().get("countRegister");
Integer loginNum = RandomUtils.nextInt(100, 200); //TODO
Integer videoViewNum = RandomUtils.nextInt(100, 200); //TODO
Integer courseNum = RandomUtils.nextInt(100, 200); //TODO
Daily daily = new Daily();
daily.setRegisterNum(registerNum);
daily.setLoginNum(loginNum);
daily.setVideoViewNum(videoViewNum);
daily.setCourseNum(courseNum);
daily.setDateCalculated(day);
baseMapper.insert(daily);
}5、controllerpackage com.guli.statistics.controller.admin;
@Api(description="統計分析管理")@[email protected]@RequestMapping("/admin/statistics/daily")public class DailyAdminController {
@Autowired
private DailyService dailyService;
@ApiOperation(value = "生成統計記錄", notes = "生成統計記錄")
@PostMapping("{day}")
public R createStatisticsByDate(
@ApiParam(name = "day", value = "統計日期")
@PathVariable String day) {
dailyService.createStatisticsByDay(day);
return R.ok();
}
}6、Swagger測試啟動eureka、ucenter、statistics三個微服務在swagger中測試
三、測試負載均衡1、Ucenter中打印日志MemberAdminController.java 中讀取端口號@Value("${server.port}")private Integer port;registerCount方法中打印日志System.out.println("用戶服務被調用:port=" + port);2、啟動Ucenter微服務分別為三個服務分配8140、8141、8142端口
3、測試默認會使用負載均衡輪詢方式訪問擴展閱讀:Ribbo負載均衡策略及原理:https://blog.csdn.net/wudiyong22/article/details/80829808
負載均衡策略配置:https://www.cnblogs.com/xing-12/p/9889153.htmlhttps://blog.csdn.net/rickiyeat/article/details/64918756
版權聲明
本文為[InfoQ]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/175/202206240032531789.html
邊欄推薦
猜你喜歡
隨機推薦
- 你真的理解LDO的輸出電容嗎!?
- 二維激光SLAM( 使用Laser Scan Matcher )
- MySQL使用ReplicationConnection導致的連接失效分析與解决
- Go寫文件的權限 WriteFile(filename, data, 0644)?
- 在線文本過濾小於指定長度工具
- quartus調用&設計D觸發器——仿真&時序波驗證
- 【深入理解TcaplusDB技術】TcaplusDB構造數據
- 等保備案是什麼意思?應該去哪裏辦理備案?
- 建議自查!MySQL驅動Bug引發的事務不回滾問題,也許你正面臨該風險!
- 百萬獎金等你來拿,首届中國元宇宙創新應用大賽聯合創業黑馬火熱招募中!
- 力扣解法匯總513-找樹左下角的值
- 快速排序的簡單理解
- 139. 單詞拆分
- Web篇_01 了解web開發
- ADB 按鍵名、按鍵代碼數字、按鍵說明對照錶
- leetcode:面試題 08.13. 堆箱子【自頂而下的dfs + memory or 自底而上的排序 + dp】
- 解答02:Smith圓為什麼能“上感下容 左串右並”?
- MySQL的 安裝、配置、卸載
- 【ESP8266-01s】獲取天氣,城市,北京時間
- Redis 集群
- 【華中科技大學】考研初試複試資料分享
- 傑理之串口設置好以後打印亂碼,內部晶振沒有校准【篇】
- 【NOI2014】15.起床困難綜合症【二進制】
- 函數的定義和函數的參數
- JDBC 在性能測試中的應用
- 35歲危機?內卷成程序員代名詞了…
- SQL聯合查詢(內聯、左聯、右聯、全聯)的語法
- Outlook開機自啟+關閉時最小化
- 北大、加州伯克利大學等聯合| Domain-Adaptive Text Classification with Structured Knowledge from Unlabeled Data(基於未標記數據的結構化知識的領域自適應文本分類)
- 為什麼你的數據圖譜分析圖上只顯示一個值?
- sql server常用sql
- MySQL事務隔離
- STM32-------外部中斷
- 2022年信息安全工程師考試知識點:訪問控制
- 高仿書旗小說 Flutter 版,學起來
- 工作中一些常用的工具函數
- docker 部署redis
- 如何利用數倉創建時序錶
- version `ZLIB_1.2.9‘ not found (required by /lib64/libpng16.so.16)
- 【Flutter】如何使用Flutter包和插件