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

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

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

服務器之家 - 編程語言 - Java教程 - 詳細介紹SpringCloud之Ribbon

詳細介紹SpringCloud之Ribbon

2021-03-23 13:33Bob_F Java教程

本篇文章主要介紹了SpringCloud之Ribbon,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一:Ribbon是什么?

Ribbon是Netflix發布的開源項目,主要功能是提供客戶端的軟件負載均衡算法,將Netflix的中間層服務連接在一起。Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer(簡稱LB)后面所有的機器,Ribbon會自動的幫助你基于某種規則(如簡單輪詢,隨即連接等)去連接這些機器。我們也很容易使用Ribbon實現自定義的負載均衡算法。

二:LB方案分類

目前主流的LB方案可分成兩類:一種是集中式LB, 即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬件,如F5, 也可以是軟件,如nginx), 由該設施負責把訪問請求通過某種策略轉發至服務的提供方;另一種是進程內LB,將LB邏輯集成到消費方,消費方從服務注冊中心獲知有哪些地址可用,然后自己再從這些地址中選擇出一個合適的服務器。Ribbon就屬于后者,它只是一個類庫,集成于消費方進程,消費方通過它來獲取到服務提供方的地址。

三:Ribbon的主要組件與工作流程

Ribbon的核心組件(均為接口類型)有以下幾個:

ServerList

用于獲取地址列表。它既可以是靜態的(提供一組固定的地址),也可以是動態的(從注冊中心中定期查詢地址列表)。

ServerListFilter

僅當使用動態ServerList時使用,用于在原始的服務列表中使用一定策略過慮掉一部分地址。

IRule

選擇一個最終的服務地址作為LB結果。選擇策略有輪詢、根據響應時間加權、斷路器(當Hystrix可用時)等。

Ribbon在工作時首選會通過ServerList來獲取所有可用的服務列表,然后通過ServerListFilter過慮掉一部分地址,最后在剩下的地址中通過IRule選擇出一臺服務器作為最終結果。

四:Ribbon提供的主要負載均衡策略介紹

1:簡單輪詢負載均衡(RoundRobin)

以輪詢的方式依次將請求調度不同的服務器,即每次調度執行i = (i + 1) mod n,并選出第i臺服務器。

2:隨機負載均衡 (Random)

隨機選擇狀態為UP的Server

3:加權響應時間負載均衡 (WeightedResponseTime)

根據相應時間分配一個weight,相應時間越長,weight越小,被選中的可能性越低。

4:區域感知輪詢負載均衡(ZoneAvoidanceRule)

復合判斷server所在區域的性能和server的可用性選擇server

Ribbon自帶負載均衡策略比較

 

策略名 策略聲明 策略描述 實現說明
BestAvailableRule public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 選擇一個最小的并發請求的server 逐個考察Server,如果Server被tripped了,則忽略,在選擇其中ActiveRequestsCount最小的server
AvailabilityFilteringRule public class AvailabilityFilteringRule extends PredicateBasedRule 過濾掉那些因為一直連接失敗的被標記為circuit tripped的后端server,并過濾掉那些高并發的的后端server(active connections 超過配置的閾值) 使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個server的運行狀態
WeightedResponseTimeRule public class WeightedResponseTimeRule extends RoundRobinRule 根據相應時間分配一個weight,相應時間越長,weight越小,被選中的可能性越低。 一 個后臺線程定期的從status里面讀取評價響應時間,為每個server計算一個weight。Weight的計算也比較簡單responsetime 減去每個server自己平均的responsetime是server的權重。當剛開始運行,沒有形成statas時,使用roubine策略選擇 server。
RetryRule public class RetryRule extends AbstractLoadBalancerRule 對選定的負載均衡策略機上重試機制。 在一個配置時間段內當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server
RoundRobinRule public class RoundRobinRule extends AbstractLoadBalancerRule roundRobin方式輪詢選擇server 輪詢index,選擇index對應位置的server
RandomRule public class RandomRule extends AbstractLoadBalancerRule 隨機選擇一個server 在index上隨機,選擇index對應位置的server
ZoneAvoidanceRule public class ZoneAvoidanceRule extends PredicateBasedRule 復合判斷server所在區域的性能和server的可用性選擇server 使 用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個server,前一個判斷判定一個 zone的運行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于過濾掉連接數過多的 Server。

 

五:Ribbon單獨使用

創建一個maven工程 名稱 ribbon_client

pom內容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
  <dependencies>
  <dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-core</artifactId>
    <version>2.2.0</version>
  </dependency>
 
  <dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-httpclient</artifactId>
    <version>2.2.0</version>
  </dependency>
</dependencies>

sample-client.properties配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Max number of retries 
sample-client.ribbon.MaxAutoRetries=1
 
# Max number of next servers to retry (excluding the first server)
sample-client.ribbon.MaxAutoRetriesNextServer=1
 
# Whether all operations can be retried for this client
sample-client.ribbon.OkToRetryOnAllOperations=true 
 
# Interval to refresh the server list from the source
sample-client.ribbon.ServerListRefreshInterval=2000
 
# Connect timeout used by Apache HttpClient
sample-client.ribbon.ConnectTimeout=3000
 
# Read timeout used by Apache HttpClient
sample-client.ribbon.ReadTimeout=3000
 
# Initial list of servers, can be changed via Archaius dynamic property at runtime
sample-client.ribbon.listOfServers=www.sohu.com:80,www.163.com:80,www.sina.com.cn:80
 
sample-client.ribbon.EnablePrimeConnections=true

RibbonMain代碼

?
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
27
28
29
30
import java.net.URI;
import com.netflix.client.ClientFactory;
import com.netflix.client.http.HttpRequest;
import com.netflix.client.http.HttpResponse;
import com.netflix.config.ConfigurationManager;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
import com.netflix.niws.client.http.RestClient;
public class RibbonMain {
  public static void main( String[] args ) throws Exception {
    ConfigurationManager.loadPropertiesFromResources("sample-client.properties");
    System.out.println(ConfigurationManager.getConfigInstance().getProperty("sample-client.ribbon.listOfServers"));
    RestClient client = (RestClient)ClientFactory.getNamedClient("sample-client");
    HttpRequest request = HttpRequest.newBuilder().uri(new URI("/")).build();
    for(int i = 0; i < 4; i ++) {
      HttpResponse response = client.executeWithLoadBalancer(request);
      System.out.println("Status for URI:" + response.getRequestedURI() + " is :" + response.getStatus());
 
    }
    ZoneAwareLoadBalancer lb = (ZoneAwareLoadBalancer) client.getLoadBalancer();
    System.out.println(lb.getLoadBalancerStats());
    ConfigurationManager.getConfigInstance().setProperty("sample-client.ribbon.listOfServers", "ccblog.cn:80,www.linkedin.com:80");
    System.out.println("changing servers ...");
    Thread.sleep(3000);
    for(int i = 0; i < 3; i ++) {
      HttpResponse response = client.executeWithLoadBalancer(request);
      System.out.println("Status for URI:" + response.getRequestedURI() + " is :" + response.getStatus());
    }
    System.out.println(lb.getLoadBalancerStats());
  }
}

代碼解析

使用 Archaius ConfigurationManager 加載屬性;

使用 ClientFactory 創建客戶端和負載均衡器;

使用 builder 構建 http 請求。注意我們只支持 URI 的 "/" 部分的路徑,一旦服務器被負載均衡器選中,會由客戶端計算出完整的 URI;

調用 API client.executeWithLoadBalancer(),不是 exeucte() API;

動態修正配置中的服務器池;

等待服務器列表刷新(配置文件中定義的刷新間隔是為 3 秒鐘);

打印出負載均衡器記錄的服務器統計信息。

六:Ribbon結合eureka使用

先要啟動eureka_register_service工程(注冊中心)和biz-service-0工程(服務生產者)

創建maven工程 eureka_ribbon_client 該工程啟動和相關配置依賴eureka_register_service和biz-service-0

pom加入

?
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.4.3.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
 
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
  </dependency>
 
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
  </dependency>
 
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
 
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>
 
<dependencyManagement>
  <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Brixton.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
  </dependency>
  </dependencies>
</dependencyManagement>

在應用主類中,通過@EnableDiscoveryClient注解來添加發現服務能力。創建RestTemplate實例,并通過@LoadBalanced注解開啟均衡負載能力。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonApplication {
  @Bean
  @LoadBalanced
  RestTemplate restTemplate() {
    return new RestTemplate();
 
  }
  public static void main(String[] args) {
    SpringApplication.run(RibbonApplication.class, args);
  }
}

創建ConsumerController來消費biz-service-0的getuser服務。通過直接RestTemplate來調用服務

?
1
2
3
4
5
6
7
8
9
10
11
@RestController
public class ConsumerController {
  @Autowired
  RestTemplate restTemplate;
 
  @RequestMapping(value = "/getuserinfo", method = RequestMethod.GET)
  public String add() {
    return restTemplate.getForEntity("http://biz-service-0/getuser", String.class).getBody();
  }
 
}

application.properties中配置eureka服務注冊中心

?
1
2
3
spring.application.name=ribbon-consumer
server.port=8003
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

完成后可以打開http://localhost:8003/getuserinfo 可以看到結果

總結:Ribbon其實就是一個軟負載均衡的客戶端組件,他可以和其他所需請求的客戶端結合使用,和eureka結合只是其中的一個實例。

代碼地址:https://github.com/zhp8341/SpringCloudDemo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/xiaojunbo/p/7094305.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 娇妻被朋友征服中文字幕 | 肉色欧美久久久久久久蜜桃 | 久久久这里有精品999 | 视频在线观看入口一二三2021 | 暖暖免费观看高清在线 | 男人的天堂va | 午夜无码国产理论在线 | 亚洲国产美女精品久久 | haodiaocao的视频这里看 | 99视频九九精品视频在线观看 | 亚洲成人影院在线 | 狠狠综合视频精品播放 | 美女毛片视频 | 国模孕妇季玥全部人体写真 | 四虎精品成人免费视频 | 日本高清免费不卡在线 | 美女脱了内裤打开腿让人羞羞软件 | 91caoporm在线进入| 国产良家 | 我不卡影院手机在线观看 | 国产在视频线在精品 | 九九九九在线精品免费视频 | 高清在线观看免费入口 | yellow视频免费观看播放 | 日本免费在线观看 | 性色AV一区二区三区V视界影院 | 国产一成人精品福利网站 | 国产一区二区三区四 | 火影忍者小南裸羞羞漫画 | 36美女厕所撒尿全过程 | 欧美一卡2卡3卡四卡海外精品 | 午夜精品在线 | 色狠狠婷婷97 | 欧美日韩精品免费一区二区三区 | 北岛玲亚洲一区在线观看 | 国产最新进精品视频 | 99久久免费国产特黄 | 成人网视频免费播放 | 亚洲va韩国va欧美va天堂 | 女人c交zzzooo在线观看 | 精品国语对白精品自拍视 |