Spring Cloud 負(fù)載均衡器 Ribbon原理及實(shí)現(xiàn)
Ribbon簡(jiǎn)介
分布式系統(tǒng)中,各個(gè)微服務(wù)會(huì)部署多個(gè)實(shí)例,如何將服務(wù)消費(fèi)者均勻分?jǐn)偟蕉鄠€(gè)服務(wù)提供者實(shí)例上,就要使用到負(fù)載均衡器
Ribbon 是負(fù)載均衡器 ,它提供了很多負(fù)載均衡算法,例如輪詢、隨即等,在配置服務(wù)提供者地址后,可以將服務(wù)消費(fèi)者請(qǐng)求均勻的分發(fā)

為服務(wù)消費(fèi)者整合Ribbon
添加 Ribbon 依賴庫
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-ribbobn</artifactId> </dependency>
給 RestTemplate 添加 @LoadBalaced 注解,就可整合 RestTemplate 和 Ribbon
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
修改Controller,請(qǐng)求地址修改為 http://flim-user/user/ ,當(dāng) Ribbon 和 Eureka 配合使用時(shí),會(huì)自動(dòng)將虛擬主機(jī)名映射成微服務(wù)的網(wǎng)絡(luò)地址,并注入了 LoadBalancerClient 輸出當(dāng)前選擇的微服務(wù)節(jié)點(diǎn)
@RestController
public class MovieController {
private final Logger log = LoggerFactory.getLogger(MovieController.class);
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/user/{id}")
public User findById(@PathVariable int id){
return this.restTemplate.getForObject("http://flim-user/"+id,User.class);
}
@GetMapping("/log-instance")
public void logInstance(){
ServiceInstance serviceInstance = this.loadBalancerClient.choose("flim-user");
log.info("{}:{}:{}",serviceInstance.getServiceId(),serviceInstance.getHost(),serviceInstance.getPort());
}
}
運(yùn)行測(cè)試程序
- 啟動(dòng) Eureka Server
- 啟動(dòng) 2 個(gè)或更多 flim-user 實(shí)例
- 啟動(dòng) flim-consumer
- 訪問 http://localhost:8761/ 查看微服務(wù) flim-user 是否注冊(cè)成功
- 多次訪問 http://localhost:8010/user/1 會(huì)返回如下結(jié)果
{"id":1,"username":"account1","name":"張三","age":20,"balance":100.00}
多次訪問 http://localhost:8010/log-instance 控制臺(tái)會(huì)輸出以下信息

可以看到請(qǐng)求會(huì)均勻的分布到兩個(gè)用戶微服務(wù)上
2017-12-17 20:47:53.975 INFO 12313 --- [nio-8010-exec-2] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
2017-12-17 20:47:54.215 INFO 12313 --- [nio-8010-exec-1] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 20:47:54.445 INFO 12313 --- [nio-8010-exec-3] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
2017-12-17 20:47:54.690 INFO 12313 --- [nio-8010-exec-4] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 20:47:54.935 INFO 12313 --- [nio-8010-exec-5] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
注意 :不能將 restTemplate.getForObject(...) 與 loadBalancerClient.choose(...) 寫在同一方法中,因?yàn)?rest-Template 實(shí)際上就是一個(gè) Ribbon 客戶端,本身已經(jīng)包含“choose”行為
代碼方式配置 Ribbon
可以使用Java代碼或?qū)傩宰远x Ribbon 的配置,Ribbon 默認(rèn)配置類是 RibbonClientConfiguration,也可以使用一個(gè) POJO 自定義 Ribbon 配置,這種 配置是細(xì)粒度的,不同的 Ribbon 客戶端可以使用不同的配置
創(chuàng)建 Ribbon 配置類
/**
* 該類為配置類
* 不應(yīng)該被ComponentScan掃描
*/
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule(){
//配置負(fù)載均衡的規(guī)則,更改為隨機(jī)
return new RandomRule();
}
}
使用 @RibbonClient 或 @RibbonClients 注解為服務(wù)提供者指定配置類
@SpringBootApplication
@EnableDiscoveryClient
@RibbonClient(name = "flim-user",configuration = RibbonConfiguration.class)
public class FlimConsumerApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(FlimConsumerApplication.class, args);
}
}
訪問測(cè)試地址 http://localhost:8010/log-instance 可看見請(qǐng)求會(huì)隨機(jī)分布到兩微服務(wù)上
2017-12-17 21:08:52.769 INFO 12524 --- [nio-8010-exec-7] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 21:08:52.946 INFO 12524 --- [nio-8010-exec-8] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 21:08:53.138 INFO 12524 --- [nio-8010-exec-9] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 21:08:53.319 INFO 12524 --- [io-8010-exec-10] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
2017-12-17 21:08:53.511 INFO 12524 --- [nio-8010-exec-1] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
注意 :RibbonConfiguration 類不能被 @ComponentScan 掃描到,否則配置信息就會(huì)被所有 @RibbonClient 共享,因此如果只想自定義某個(gè) Ribbon 客戶端的配置,必須防止被 @ComponentScan 掃描
配置文件方式配置 Ribbon
通過配置文件方式自定義 Ribbon 屬性更加方便,配置的前綴是 <clientName>.ribbon.
- NFLoadBalancerClassName:配置 ILoadBalancer 的實(shí)現(xiàn)類
- NFLoadBalancerRuleClassName:配置 IRule 的實(shí)現(xiàn)類
- NFLoadBalancerPingClassName:配置 IPing 實(shí)現(xiàn)類
- NIWSServerListClassName:配置 ServerList 的實(shí)現(xiàn)類
- NIWSServerListFilterClassName:配置 ServerListFilter 的實(shí)現(xiàn)類
通過配置文件定義Ribbon配置
flim-user: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
常用的 Ribbon 全局配置
ribbon: ConnectionTimeout: #連接超時(shí)時(shí)間 ReadTimeout: #讀取超時(shí)時(shí)間 OkToRetryOnAllOperatotions: #對(duì)所有操作請(qǐng)求都進(jìn)行重試 MaxAutoRetriesNextServer: #切換服務(wù)器實(shí)例的重試次數(shù) MaxAutoRetries: #對(duì)當(dāng)前實(shí)例的重試次數(shù) ServerListRefreshInterval: #刷新服務(wù)列表源的間隔時(shí)間
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring?Cloud?Alibaba?Nacos服務(wù)治理平臺(tái)服務(wù)注冊(cè)、RestTemplate實(shí)現(xiàn)微服務(wù)之間訪問負(fù)載均衡訪問的問題
- SpringCloud feign微服務(wù)調(diào)用之間的異常處理方式
- Spring Cloud多個(gè)微服務(wù)之間調(diào)用代碼實(shí)例
- spring cloud eureka微服務(wù)之間的調(diào)用詳解
- springcloud gateway如何實(shí)現(xiàn)路由和負(fù)載均衡
- spring cloud 之 客戶端負(fù)載均衡Ribbon深入理解
- Spring Cloud實(shí)現(xiàn)微服務(wù)調(diào)用的負(fù)載均衡(詳解)
相關(guān)文章
防止未登錄用戶操作—基于struts2攔截器的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄乐刮吹卿浻脩舨僮鳌趕truts2攔截器的簡(jiǎn)單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
Spring Boot定時(shí)器創(chuàng)建及使用解析
這篇文章主要介紹了Spring Boot定時(shí)器創(chuàng)建及使用解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
json解析時(shí)遇到英文雙引號(hào)報(bào)錯(cuò)的解決方法
下面小編就為大家分享一篇json解析時(shí)遇到英文雙引號(hào)報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
解決RestTemplate 請(qǐng)求接收自定義400+ 或500+錯(cuò)誤
這篇文章主要介紹了解決RestTemplate 請(qǐng)求接收自定義400+ 或500+錯(cuò)誤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
在spring中使用自定義注解注冊(cè)監(jiān)聽器的方法
本篇文章主要介紹了在spring中使用自定義注解注冊(cè)監(jiān)聽器的方法,本文就是在分析監(jiān)聽器回調(diào)原理的基礎(chǔ)上,在spring環(huán)境中使用自定義的注解實(shí)現(xiàn)一個(gè)監(jiān)聽器。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
教你使用Java實(shí)現(xiàn)掃雷小游戲(最新完整版)
本文給大家介紹使用Java實(shí)現(xiàn)掃雷小游戲,本程序封裝了五個(gè)類,分別是主類GameWin類,繪制底層地圖和繪制頂層地圖的類MapBottom類和MapTop類,繪制底層數(shù)字的類BottomNum類,以及初始化地雷的BottomRay類和工具GameUtil類,用于存靜態(tài)參數(shù)和方法,感興趣的朋友一起看看吧2022-05-05
@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解
這篇文章主要介紹了@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

