Springcloud ribbon負(fù)載均衡算法實(shí)現(xiàn)
一 前言
經(jīng)過幾篇的cloud系列文章,我想大家都有一個(gè)堅(jiān)實(shí)的基礎(chǔ),后續(xù)的學(xué)習(xí)就會(huì)輕松很多,如果是剛剛來看的讀者需要有eureka基礎(chǔ)知識(shí),或者查閱知識(shí)追尋者的cloud系列專欄;這篇文章主要講解如何使用ribbon實(shí)現(xiàn)web service客戶端調(diào)用,ribbon默認(rèn)算法實(shí)現(xiàn)負(fù)載均衡等!
二 ribbon簡(jiǎn)介
ribbon是一個(gè)客戶端負(fù)載均衡器,其能夠整合不同的協(xié)議工具進(jìn)行web service API 調(diào)用;
主要特色如下:
提供可插拔式的負(fù)載均衡整合服務(wù)發(fā)現(xiàn)故障彈性恢復(fù)cloud支持客戶端整合加載負(fù)載均衡
核心工程如下:
ribbon-core:整合其他模塊實(shí)現(xiàn)負(fù)載均衡
ribbon-eureka: 基于 eureka client 實(shí)現(xiàn) 負(fù)載均衡
ribbon-httpclient: 包括JSR-311 實(shí)現(xiàn)REST 加載負(fù)載均衡
三 eureka-client
在之前的 eureka-client工程中創(chuàng)建controller包,并提供表現(xiàn)層接口,代碼如下,然后啟動(dòng)eureka-client實(shí)例2個(gè),分別為8090端口,8091端口;
/**
* @Author lsc
* <p> 知識(shí)追尋者,ribbon provider the restful api</p>
*/
@RestController
public class RibbonProvidderController {
@GetMapping("zszxz/ribbon")
public String testRibbon(){
return "hell i am zszxz";
}
}
四 ribbon-client
4.1 pom.xml
在父工程低下添加新模塊 ribbon-client;原來的start-web依賴在父工程中已經(jīng)引入,故ribbon模塊中不會(huì)再次引入該依賴;
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
</dependencies>
4.2 config
使用restTemplate進(jìn)行客戶端調(diào)用,故需要進(jìn)行配置,并且在方法上加 @LoadBalanced 注解表示開啟ribbon負(fù)載均衡;
/**
* @Author lsc
* <p> ribbon-restTemplate配置 </p>
*/
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced//表示用于負(fù)載均衡
RestTemplate restTemplate(){
return new RestTemplate();
}
}
4.3 service
創(chuàng)建service類,并且使用restTemplate進(jìn)行HTTP API 調(diào)用;注意點(diǎn)是這邊不使用ip端口,而是直接使用服務(wù)的應(yīng)用名稱 eureka-client ;
/**
* @Author lsc
* <p> </p>
*/
@Service
public class RibbonService {
@Autowired
RestTemplate restTemplate;
public String testRibbon(){
return restTemplate.getForObject("http://eureka-client/zszxz/ribbon",String.class);
}
}
4.4 controller
創(chuàng)建表現(xiàn)層類, 用于瀏覽器訪問;
/**
* @Author lsc
* <p> </p>
*/
@RestController
public class RibbonController {
@Autowired
RibbonService ribbonService;
@GetMapping("ribbon/test")
public String testRibbon(){
return ribbonService.testRibbon();
}
}
4.5 ribbon啟動(dòng)類
ribbon的啟動(dòng)類也是作為 eureka 的客戶端故需要加上@EnableEurekaClient注解;
/**
* @Author lsc
* <p>知識(shí)追尋者 ribbon啟動(dòng)類 </p>
*/
@SpringBootApplication
@EnableEurekaClient
public class RibbonApp {
public static void main(String[] args) {
SpringApplication.run(RibbonApp.class,args);
}
}
4.6 application.yml
application.yml 配置中使用端口8092,服務(wù)注冊(cè)地址分別是peer1,peer2,peer3;
server: port: 8092 spring: application: name: eureka-ribbon # 應(yīng)用名稱 eureka: client: service-url: # 服務(wù)注冊(cè)地址 defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/
4.7 啟動(dòng)工程
分別啟動(dòng) client ,server ; 如下圖

4.8 瀏覽器訪問結(jié)果
瀏覽器結(jié)果如下,說明我們?cè)?eureka-ribbon 中使用 restTemplate 結(jié)合 ribbon 實(shí)現(xiàn)了HTTP 方式從 eureka-clinet 模塊中調(diào)用API;

五 ribbon默認(rèn)負(fù)載均衡
LoadBalancerClient 是 ribbon 的一個(gè)核心類,其能夠獲得 ribbon提供負(fù)載均衡的實(shí)例信息;在 ribbon-client模塊中的controller層添加 方法 ,方法主體是獲得實(shí)例的端口和主機(jī);以便于于我們分析ribbon負(fù)載均衡算法;
@Autowired
LoadBalancerClient loadBalanced;
@GetMapping("ribbon")
public String ribbon(){
ServiceInstance choose = loadBalanced.choose("eureka-client");
String s = "host is :" + choose.getHost() + " port is :" + choose.getPort();
System.out.println(s);
return s;
}
重啟ribbon-client 工程,使用瀏覽器訪問,控制臺(tái)輸出如下,分別調(diào)用了8090,8091兩個(gè) eureka-client實(shí)例API,說明ribbon默認(rèn)的負(fù)載均衡機(jī)制是輪詢算法;
host is :peer1 port is :8091 host is :peer1 port is :8090 host is :peer1 port is :8091 host is :peer1 port is :8090 host is :peer1 port is :8091 host is :peer1 port is :8090 host is :peer1 port is :8091 host is :peer1 port is :8090
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解SpringCloud Ribbon 負(fù)載均衡通過服務(wù)器名無法連接的神坑
- SpringCloud Ribbon負(fù)載均衡代碼實(shí)例
- SpringCloud 服務(wù)負(fù)載均衡和調(diào)用 Ribbon、OpenFeign的方法
- SpringCloud手寫Ribbon實(shí)現(xiàn)負(fù)載均衡
- SpringCloud 2020-Ribbon負(fù)載均衡服務(wù)調(diào)用的實(shí)現(xiàn)
- springcloud中Ribbon和RestTemplate實(shí)現(xiàn)服務(wù)調(diào)用與負(fù)載均衡
- SpringCloud?Ribbon負(fù)載均衡原理
相關(guān)文章
SpringBoot模擬實(shí)現(xiàn)流式輸出效果
這篇文章主要為大家詳細(xì)介紹了如何使用SpringBoot模擬實(shí)現(xiàn)流式輸出效果,并在前端使用流式接收數(shù)據(jù)并打印,感興趣的小伙伴可以參考一下2025-03-03
Springboot Mybatis Plus自動(dòng)生成工具類詳解代碼
mybatis-plus 是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,這篇文章帶你使用Springboot Mybatis Plus自動(dòng)生成工具類2021-11-11
Java 確保某個(gè)Bean類被最后執(zhí)行的幾種實(shí)現(xiàn)方式
這篇文章主要介紹了Java 確保某個(gè)BeanDefinitionRegistryPostProcessor Bean被最后執(zhí)行的幾種實(shí)現(xiàn)方式,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03
Java設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解裝飾器模式
裝飾器模式又名包裝(Wrapper)模式。裝飾器模式以對(duì)客戶端透明的方式拓展對(duì)象的功能,是繼承關(guān)系的一種替代方案,本篇文章以虹貓藍(lán)兔生動(dòng)形象的為你帶來詳細(xì)講解2022-04-04
Java超詳細(xì)教你寫一個(gè)銀行存款系統(tǒng)案例
這篇文章主要介紹了怎么用Java來寫一個(gè)銀行的存款系統(tǒng),銀行存款主要有賬號(hào)和存款金額兩個(gè)屬性,感興趣的朋友跟隨文章往下看看吧2022-03-03
Java Swing組件編程之JTable表格用法實(shí)例詳解
這篇文章主要介紹了Java Swing組件編程之JTable表格用法,結(jié)合實(shí)例形式詳細(xì)分析了Swing組件中JTable表格的常見定義與使用方法,需要的朋友可以參考下2017-11-11

