當前位置:網站首頁>ribbon

ribbon

2022-06-24 04:22:35InfoQ

一、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(&quot;date_calculated&quot;, day);
baseMapper.delete(queryWrapper);

//生成統計記錄
R r = restTemplate.getForObject(&quot;http://guli-ucenter/admin/ucenter/member/count-register/{day}&quot;, R.class, day);
Integer registerNum = (Integer) r.getData().get(&quot;countRegister&quot;);
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=&quot;統計分析管理&quot;)@[email protected]@RequestMapping(&quot;/admin/statistics/daily&quot;)public class DailyAdminController {

@Autowired
private DailyService dailyService;

@ApiOperation(value = &quot;生成統計記錄&quot;, notes = &quot;生成統計記錄&quot;)
@PostMapping(&quot;{day}&quot;)
public R createStatisticsByDate(
 @ApiParam(name = &quot;day&quot;, value = &quot;統計日期&quot;)
 @PathVariable String day) {
 dailyService.createStatisticsByDay(day);
 return R.ok();
}

}6、Swagger測試啟動eureka、ucenter、statistics三個微服務在swagger中測試

三、測試負載均衡1、Ucenter中打印日志MemberAdminController.java 中讀取端口號@Value(&quot;${server.port}&quot;)private Integer port;registerCount方法中打印日志System.out.println(&quot;用戶服務被調用:port=&quot; + 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

隨機推薦