ribbon簡介
分布式系統中,各個微服務會部署多個實例,如何將服務消費者均勻分攤到多個服務提供者實例上,就要使用到負載均衡器
ribbon 是負載均衡器 ,它提供了很多負載均衡算法,例如輪詢、隨即等,在配置服務提供者地址后,可以將服務消費者請求均勻的分發
為服務消費者整合ribbon
添加 ribbon 依賴庫
1
2
3
4
|
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-ribbobn</artifactid> </dependency> |
給 resttemplate 添加 @loadbalaced 注解,就可整合 resttemplate 和 ribbon
1
2
3
4
5
|
@bean @loadbalanced public resttemplate resttemplate(){ return new resttemplate(); } |
修改controller,請求地址修改為 http://flim-user/user/ ,當 ribbon 和 eureka 配合使用時,會自動將虛擬主機名映射成微服務的網絡地址,并注入了 loadbalancerclient 輸出當前選擇的微服務節點
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@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()); } } |
運行測試程序
- 啟動 eureka server
- 啟動 2 個或更多 flim-user 實例
- 啟動 flim-consumer
- 訪問 http://localhost:8761/ 查看微服務 flim-user 是否注冊成功
- 多次訪問 http://localhost:8010/user/1 會返回如下結果
{"id":1,"username":"account1","name":"張三","age":20,"balance":100.00}
多次訪問 http://localhost:8010/log-instance 控制臺會輸出以下信息
可以看到請求會均勻的分布到兩個用戶微服務上
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(...) 寫在同一方法中,因為 rest-template 實際上就是一個 ribbon 客戶端,本身已經包含“choose”行為
代碼方式配置 ribbon
可以使用java代碼或屬性自定義 ribbon 的配置,ribbon 默認配置類是 ribbonclientconfiguration,也可以使用一個 pojo 自定義 ribbon 配置,這種 配置是細粒度的,不同的 ribbon 客戶端可以使用不同的配置
創建 ribbon 配置類
1
2
3
4
5
6
7
8
9
10
11
12
|
/** * 該類為配置類 * 不應該被componentscan掃描 */ @configuration public class ribbonconfiguration { @bean public irule ribbonrule(){ //配置負載均衡的規則,更改為隨機 return new randomrule(); } } |
使用 @ribbonclient 或 @ribbonclients 注解為服務提供者指定配置類
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@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); } } |
訪問測試地址 http://localhost:8010/log-instance 可看見請求會隨機分布到兩微服務上
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 掃描到,否則配置信息就會被所有 @ribbonclient 共享,因此如果只想自定義某個 ribbon 客戶端的配置,必須防止被 @componentscan 掃描
配置文件方式配置 ribbon
通過配置文件方式自定義 ribbon 屬性更加方便,配置的前綴是 <clientname>.ribbon.
- nfloadbalancerclassname:配置 iloadbalancer 的實現類
- nfloadbalancerruleclassname:配置 irule 的實現類
- nfloadbalancerpingclassname:配置 iping 實現類
- niwsserverlistclassname:配置 serverlist 的實現類
- niwsserverlistfilterclassname:配置 serverlistfilter 的實現類
通過配置文件定義ribbon配置
1
2
3
|
flim-user: ribbon: nfloadbalancerruleclassname: com.netflix.loadbalancer.randomrule |
常用的 ribbon 全局配置
1
2
3
4
5
6
7
|
ribbon: connectiontimeout: #連接超時時間 readtimeout: #讀取超時時間 oktoretryonalloperatotions: #對所有操作請求都進行重試 maxautoretriesnextserver: #切換服務器實例的重試次數 maxautoretries: #對當前實例的重試次數 serverlistrefreshinterval: #刷新服務列表源的間隔時間 |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.jianshu.com/p/047ef2b7284f