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

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類(lèi)的用法

詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類(lèi)的用法

2021-04-15 11:23hsm_computer Java教程

本篇文章主要介紹了詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類(lèi)的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

RibbonSpring Cloud Netflix全家桶中負(fù)責(zé)負(fù)載均衡的組件,它是一組類(lèi)庫(kù)的集合。通過(guò)Ribbon,程序員能在不涉及到具體實(shí)現(xiàn)細(xì)節(jié)的基礎(chǔ)上“透明”地用到負(fù)載均衡,而不必在項(xiàng)目里過(guò)多地編寫(xiě)實(shí)現(xiàn)負(fù)載均衡的代碼。

比如,在某個(gè)包含Eureka和Ribbon的集群中,某個(gè)服務(wù)(可以理解成一個(gè)jar包)被部署在多臺(tái)服務(wù)器上,當(dāng)多個(gè)服務(wù)使用者同時(shí)調(diào)用該服務(wù)時(shí),這些并發(fā)的請(qǐng)求能被用一種合理的策略轉(zhuǎn)發(fā)到各臺(tái)服務(wù)器上。

事實(shí)上,在使用Spring Cloud的其它各種組件時(shí),我們都能看到Ribbon的痕跡,比如Eureka能和Ribbon整合,而在后文里將提到的提供網(wǎng)關(guān)功能Zuul組件在轉(zhuǎn)發(fā)請(qǐng)求時(shí),也可以整合Ribbon從而達(dá)到負(fù)載均衡的效果。

從代碼層面來(lái)看,Ribbon有如下三個(gè)比較重要的接口。

第一,ILoadBalancer,這也叫負(fù)載均衡器,通過(guò)它,我們能在項(xiàng)目里根據(jù)特定的規(guī)則合理地轉(zhuǎn)發(fā)請(qǐng)求,常見(jiàn)的實(shí)現(xiàn)類(lèi)有BaseLoadBalancer。

第二,IRule,這個(gè)接口有多個(gè)實(shí)現(xiàn)類(lèi),比如RandomRule和RoundRobinRule,這些實(shí)現(xiàn)類(lèi)具體地定義了諸如“隨機(jī)“和”輪詢“等的負(fù)載均衡策略,我們還能重寫(xiě)該接口里的方法來(lái)自定義負(fù)載均衡的策略。

在BaseLoadBalancer類(lèi)里,我們能通過(guò)IRule的實(shí)現(xiàn)類(lèi)設(shè)置負(fù)載均衡的策略,這樣該負(fù)載均衡器就能據(jù)此合理地轉(zhuǎn)發(fā)請(qǐng)求。

第三,IPing接口,通過(guò)該接口,我們能獲取到當(dāng)前哪些服務(wù)器是可用的,我們也能通過(guò)重寫(xiě)該接口里的方法來(lái)自定義判斷服務(wù)器是否可用的規(guī)則。在BaseLoadBalancer類(lèi)里,我們同樣能通過(guò)IPing的實(shí)現(xiàn)類(lèi)設(shè)置判斷服務(wù)器是否可用的策略。   

1 ILoadBalancer:負(fù)載均衡器接口

在Ribbon里,我們還可以通過(guò)ILOadBalancer這個(gè)接口以基于特定的負(fù)載均衡策略來(lái)選擇服務(wù)器。

通過(guò)下面的ILoadBalancerDemo.java,我們來(lái)看下這個(gè)接口的基本用法。這個(gè)類(lèi)是放在4.2部分創(chuàng)建的RabbionBasicDemo項(xiàng)目里,代碼如下。  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//省略必要的package和import代碼
  public class ILoadBalancerDemo {
    public static void main(String[] args){
      //創(chuàng)建ILoadBalancer的對(duì)象
      ILoadBalancer loadBalancer = new BaseLoadBalancer();
      //定義一個(gè)服務(wù)器列表
       List<Server> myServers = new ArrayList<Server>();
      //創(chuàng)建兩個(gè)Server對(duì)象
      Server s1 = new Server("ekserver1",8080);
      Server s2 = new Server("ekserver2",8080);
      //兩個(gè)server對(duì)象放入List類(lèi)型的myServers對(duì)象里 
      myServers.add(s1);
      myServers.add(s2);
      //把myServers放入負(fù)載均衡器
      loadBalancer.addServers(myServers);
      //在for循環(huán)里發(fā)起10次調(diào)用
      for(int i=0;i<10;i++){
      //用基于默認(rèn)的負(fù)載均衡規(guī)則獲得Server類(lèi)型的對(duì)象
        Server s = loadBalancer.chooseServer("default");
      //輸出IP地址和端口號(hào)
        System.out.println(s.getHost() + ":" + s.getPort());
      }   
   }
  }

在第5行里,我們創(chuàng)建了BaseLoadBalancer類(lèi)型的loadBalancer對(duì)象,而B(niǎo)aseLoadBalancer是負(fù)載均衡器ILoadBalancer接口的實(shí)現(xiàn)類(lèi)。

在第6到第13行里,我們創(chuàng)建了兩個(gè)Server類(lèi)型的對(duì)象,并把它們放入了myServers里,在第15行里,我們把List類(lèi)型的myServers對(duì)象放入了負(fù)載均衡器里。

在第17到22行的for循環(huán)里,我們通過(guò)負(fù)載均衡器模擬了10次選擇服務(wù)器的動(dòng)作,具體而言,是在第19行里,通過(guò)loadBalancer的chooseServer方法以默認(rèn)的負(fù)載均衡規(guī)則選擇服務(wù)器,在第21行里,我們是用“打印”這個(gè)動(dòng)作來(lái)模擬實(shí)際的“使用Server對(duì)象處理請(qǐng)求”的動(dòng)作。

上述代碼的運(yùn)行結(jié)果如下所示,其中我們能看到,loadBalancer這個(gè)負(fù)載均衡器把10次請(qǐng)求均攤到了2臺(tái)服務(wù)器上,從中確實(shí)能看到 “負(fù)載均衡”的效果。

第二,IRule,這個(gè)接口有多個(gè)實(shí)現(xiàn)類(lèi),比如RandomRule和RoundRobinRule,這些實(shí)現(xiàn)類(lèi)具體地定義了諸如“隨機(jī)“和”輪詢“等的負(fù)載均衡策略,我們還能重寫(xiě)該接口里的方法來(lái)自定義負(fù)載均衡的策略。

在BaseLoadBalancer類(lèi)里,我們能通過(guò)IRule的實(shí)現(xiàn)類(lèi)設(shè)置負(fù)載均衡的策略,這樣該負(fù)載均衡器就能據(jù)此合理地轉(zhuǎn)發(fā)請(qǐng)求。

第三,IPing接口,通過(guò)該接口,我們能獲取到當(dāng)前哪些服務(wù)器是可用的,我們也能通過(guò)重寫(xiě)該接口里的方法來(lái)自定義判斷服務(wù)器是否可用的規(guī)則。在BaseLoadBalancer類(lèi)里,我們同樣能通過(guò)IPing的實(shí)現(xiàn)類(lèi)設(shè)置判斷服務(wù)器是否可用的策略。 

?
1
2
3
4
5
6
7
8
9
10
ekserver2:8080
  ekserver1:8080
  ekserver2:8080
  ekserver1:8080
  ekserver2:8080
  ekserver1:8080
  ekserver2:8080
  ekserver1:8080
  ekserver2:8080
 ekserver1:8080

2 IRule:定義負(fù)載均衡規(guī)則的接口

在Ribbon里,我們可以通過(guò)定義IRule接口的實(shí)現(xiàn)類(lèi)來(lái)給負(fù)載均衡器設(shè)置相應(yīng)的規(guī)則。在下表里,我們能看到IRule接口的一些常用的實(shí)現(xiàn)類(lèi)。

 

實(shí)現(xiàn)類(lèi)的名字

負(fù)載均衡的規(guī)則

RandomRule

采用隨機(jī)選擇的策略

RoundRobinRule

采用輪詢策略

RetryRule

采用該策略時(shí),會(huì)包含重試動(dòng)作

AvailabilityFilterRule

會(huì)過(guò)濾些多次連接失敗和請(qǐng)求并發(fā)數(shù)過(guò)高的服務(wù)器

WeightedResponseTimeRule

根據(jù)平均響應(yīng)時(shí)間為每個(gè)服務(wù)器設(shè)置一個(gè)權(quán)重,根據(jù)該權(quán)重值優(yōu)先選擇平均響應(yīng)時(shí)間較小的服務(wù)器

ZoneAvoidanceRule

優(yōu)先把請(qǐng)求分配到和該請(qǐng)求具有相同區(qū)域(Zone)的服務(wù)器上

 

在下面的IRuleDemo.java的程序里,我們來(lái)看下IRule的基本用法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//省略必要的package和import代碼
 public class IRuleDemo {
   public static void main(String[] args){
   //請(qǐng)注意這是用到的是BaseLoadBalancer,而不是ILoadBalancer接口
   BaseLoadBalancer loadBalancer = new BaseLoadBalancer();
     //聲明基于輪詢的負(fù)載均衡策略
     IRule rule = new RoundRobinRule();
   //在負(fù)載均衡器里設(shè)置策略
     loadBalancer.setRule(rule);
     //如下定義3個(gè)Server,并把它們放入List類(lèi)型的集合中
     List<Server> myServers = new ArrayList<Server>();
     Server s1 = new Server("ekserver1",8080);
     Server s2 = new Server("ekserver2",8080);
     Server s3 = new Server("ekserver3",8080);
     myServers.add(s1);
     myServers.add(s2);
     myServers.add(s3);
     //在負(fù)載均衡器里設(shè)置服務(wù)器的List
     loadBalancer.addServers(myServers);
     //輸出負(fù)載均衡的結(jié)果
     for(int i=0;i<10;i++){
       Server s = loadBalancer.chooseServer(null);
       System.out.println(s.getHost() + ":" + s.getPort()); 
    }   
   }
 }

這段代碼和上文里的ILoadBalancerDemo.java很相似,但有如下的差別點(diǎn)。

1 在第5行里,我們是通過(guò)BaseLoadBalancer這個(gè)類(lèi)而不是接口來(lái)定義負(fù)載均衡器,原因是該類(lèi)包含setRule方法。

2 在第7行定義了一個(gè)基于輪詢規(guī)則的rule對(duì)象,并在第9行里把它設(shè)置進(jìn)負(fù)載均衡器。

3 在第19行里,我們是把包含3個(gè)Server的List對(duì)象放入負(fù)載均衡器,而不是之前的兩個(gè)。由于這里存粹是為了演示效果,所以我們就放入一個(gè)根本不存在的“ekserver3”服務(wù)器。

運(yùn)行該程序后,我們可以看到有10次輸出,而且確實(shí)是按“輪詢”的規(guī)則有順序地輸出3個(gè)服務(wù)器的名字。如果我們把第7行的代碼改成如下,那么就會(huì)看到 “隨機(jī)”地輸出服務(wù)器名。

?
1
IRule rule = new RandomRule();

3  IPing:判斷服務(wù)器是否可用的接口

在項(xiàng)目里,我們一般會(huì)讓ILoadBalancer接口自動(dòng)地判斷服務(wù)器是否可用(這些業(yè)務(wù)都封裝在Ribbon的底層代碼里),此外,我們還可以用Ribbon組件里的IPing接口來(lái)實(shí)現(xiàn)這個(gè)功能。

在下面的IRuleDemo.java代碼里,我們將演示IPing接口的一般用法。   

?
1
2
3
4
5
6
7
8
9
10
//省略必要的package和import代碼
  class MyPing implements IPing {
    public boolean isAlive(Server server) {
      //如果服務(wù)器名是ekserver2,則返回false
      if (server.getHost().equals("ekserver2")) {
        return false;
      }
      return true;
    }
  }

第2行定義的MyPing類(lèi)實(shí)現(xiàn)了IPing接口,并在第3行重寫(xiě)了其中的isAlive方法。

在這個(gè)方法里,我們根據(jù)服務(wù)器名來(lái)判斷,具體而言,如果名字是ekserver2,則返回false,表示該服務(wù)器不可用,否則返回true,表示當(dāng)前服務(wù)器可用。    

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class IRuleDemo {
    public static void main(String[] args) {
      BaseLoadBalancer loadBalancer = new BaseLoadBalancer();
      //定義IPing類(lèi)型的myPing對(duì)象
      IPing myPing = new MyPing();
      //在負(fù)載均衡器里使用myPing對(duì)象
      loadBalancer.setPing(myPing);
      //同樣是創(chuàng)建三個(gè)Server對(duì)象并放入負(fù)載均衡器
      List<Server> myServers = new ArrayList<Server>();
      Server s1 = new Server("ekserver1", 8080);
      Server s2 = new Server("ekserver2", 8080);
      Server s3 = new Server("ekserver3", 8080);
      myServers.add(s1);
      myServers.add(s2);
      myServers.add(s3);
      loadBalancer.addServers(myServers);
      //通過(guò)for循環(huán)多次請(qǐng)求服務(wù)器
      for (int i = 0; i < 10; i++) {
        Server s = loadBalancer.chooseServer(null);
        System.out.println(s.getHost() + ":" + s.getPort());
      }
    }
  }

在第12行的main函數(shù)里,我們?cè)诘?5行創(chuàng)建了IPing類(lèi)型的myPing對(duì)象,并在第17行把這個(gè)對(duì)象放入了負(fù)載均衡器。通過(guò)第18到第26行的代碼,我們創(chuàng)建了三個(gè)服務(wù)器,并把它們也放入負(fù)載均衡器。

在第28行的for循環(huán)里,我們依然是請(qǐng)求并輸出服務(wù)器名。由于這里的負(fù)載均衡器loadBalancer中包含了一個(gè)IPing類(lèi)型的對(duì)象,所以在根據(jù)策略得到服務(wù)器后,會(huì)根據(jù)myPing里的isActive方法來(lái)判斷該服務(wù)器是否可用。

由于在這個(gè)方法里,我們定義了ekServer2這臺(tái)服務(wù)器不可用,所以負(fù)載均衡器loadBalancer對(duì)象始終不會(huì)把請(qǐng)求發(fā)送到該服務(wù)器上,也就是說(shuō),在輸出結(jié)果中,我們不會(huì)看到“ekserver2:8080”的輸出。

從中我們能看到IPing接口的一般用法,我們可以通過(guò)重寫(xiě)其中的isAlive方法來(lái)定義“判斷服務(wù)器是否可用“的邏輯,在實(shí)際項(xiàng)目里,判斷的依據(jù)無(wú)非是”服務(wù)器響應(yīng)是否時(shí)間過(guò)長(zhǎng)“或”發(fā)往該服務(wù)器的請(qǐng)求數(shù)是否過(guò)多“,而這些判斷方法都封裝在IRule接口以及它的實(shí)現(xiàn)類(lèi)里,所以在一般的場(chǎng)景中我們用到IPing接口。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/JavaArchitect/p/8648420.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: japanesen女同| 亚洲国产成人精品无码区APP | 免费看一级a一片毛片 | 波多洁野衣一二区三区 | 嫩草视频在线观看免费 | 四神集团1涨奶是第几章 | 亚洲狼人香蕉香蕉在线28 | 青草青青在线视频观看 | 午夜宅男影院 | uoco福利姬| 5g996未满十八| 视频免费观看在线播放高清 | 久久婷婷五月综合色丁香花 | 国产v日韩v欧美v精品专区 | 日本五十路六十30人8时间 | 欧美操屁股 | 午夜视频一区 | 天天av天天翘天天综合网 | 欧美jjvideo | 国产成人免费观看在线视频 | 亚洲国产99在线精品一区69堂 | 国产精品一区二区三区免费视频 | 亚洲成人国产精品 | 国产自拍资源 | 欧美日韩国产在线人成dvd | 国产欧美日韩精品一区二区三区 | 青苹果乐园影院免费观看完整版 | 奇米社区 | 国产亚洲女在线线精品 | 人人澡人 | 国产精品久久国产精品99盘 | 2018天天拍拍拍免费视频 | 精品视频在线免费播放 | 日本不卡一区二区三区在线观看 | 亚洲精品国产福利片 | 国产午夜免费视频 | 色戒 完整版 | 人妇小说 | 精品91 | 国产黄频在线观看高清免费 | 精品湿 |