一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring Cloud 負載均衡器 Ribbon原理及實現

Spring Cloud 負載均衡器 Ribbon原理及實現

2021-04-10 13:13林塬 Java教程

這篇文章主要介紹了Spring Cloud 負載均衡器 Ribbon原理及實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

ribbon簡介

分布式系統中,各個微服務會部署多個實例,如何將服務消費者均勻分攤到多個服務提供者實例上,就要使用到負載均衡器

ribbon 是負載均衡器 ,它提供了很多負載均衡算法,例如輪詢、隨即等,在配置服務提供者地址后,可以將服務消費者請求均勻的分發

Spring Cloud 負載均衡器 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());
  }
}

運行測試程序

  1. 啟動 eureka server
  2. 啟動 2 個或更多 flim-user 實例
  3. 啟動 flim-consumer
  4. 訪問 http://localhost:8761/ 查看微服務 flim-user 是否注冊成功
  5. 多次訪問 http://localhost:8010/user/1 會返回如下結果

{"id":1,"username":"account1","name":"張三","age":20,"balance":100.00}

多次訪問 http://localhost:8010/log-instance 控制臺會輸出以下信息

Spring Cloud 負載均衡器 Ribbon原理及實現

可以看到請求會均勻的分布到兩個用戶微服務上

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.

  1. nfloadbalancerclassname:配置 iloadbalancer 的實現類
  2. nfloadbalancerruleclassname:配置 irule 的實現類
  3. nfloadbalancerpingclassname:配置 iping 實現類
  4. niwsserverlistclassname:配置 serverlist 的實現類
  5. 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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 小SAO货边洗澡边CAO你动漫 | 肉文小说 | 99热精品国产麻豆 | 国产在线视频一区二区三区 | 成人高辣h视频一区二区在线观看 | 精品国产一区二区在线观看 | 国产欧美一区二区精品性色99 | 波多在线 | 国内精品99| 亚洲网色| 19+韩国女主播激情vip视频在线 | 国产成人激情视频 | 久久久久久久伊人电影 | 性欧美高清理论片 | 亚洲国产精品第一页 | 亚洲福利视频在线观看 | sex5·性屋娱乐 | 日韩欧美三级视频 | 青青草国产免费国产是公开 | 5g在线观看| 日本中文字幕一区二区三区不卡 | 欧美成人午夜片一一在线观看 | 免看一级一片一在线看 | 国产精品精品 | 天天干天天日天天射天天操毛片 | 亚洲精品第二页 | 操娇妻| 亚洲精品91 | 精品欧美一区二区三区在线观看 | 好涨好大我快受不了了视频网 | 亚洲国产精品网站久久 | 国产一级片在线 | 99国产自偷色久 | 四虎网站 | 99av麻豆 | 亚洲春黄在线观看 | 校园刺激全黄H全肉细节文 校草让我脱了内裤给全班看 | 男gay网站视频免费观看 | 秋霞在线观看成人高清视频51 | 国色天香社区视频在线观看免费完整版 | 九九免费高清在线观看视频 |