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

服務(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 Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的方法

Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的方法

2021-04-26 14:22張旭乾的博客 Java教程

本篇文章主要介紹了Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

簡(jiǎn)介

Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的方法

我們繼續(xù)以之前博客的代碼為基礎(chǔ),增加ribbon組件來(lái)提供客戶端負(fù)載均衡。負(fù)載均衡是實(shí)現(xiàn)高并發(fā)、高性能、可伸縮服務(wù)的重要組成部分,它可以把請(qǐng)求分散到一個(gè)集群中不同的服務(wù)器中,以減輕每個(gè)服務(wù)器的負(fù)擔(dān)。客戶端負(fù)載均衡是運(yùn)行在客戶端程序中的,如我們的web項(xiàng)目,然后通過(guò)獲取集群的ip地址列表,隨機(jī)選擇一個(gè)server發(fā)送請(qǐng)求。相對(duì)于服務(wù)端負(fù)載均衡來(lái)說(shuō),它不需要消耗服務(wù)器的資源。

基礎(chǔ)環(huán)境

  1. jdk 1.8
  2. maven 3.3.9
  3. intellij 2018.1

git:項(xiàng)目源碼

更新配置

我們這次需要在本地啟動(dòng)兩個(gè)產(chǎn)品服務(wù)程序,用來(lái)驗(yàn)證負(fù)載均衡,所以需要為第二個(gè)程序提供不同的端口。spring cloud配置服務(wù)中心的配置默認(rèn)會(huì)覆蓋本地系統(tǒng)環(huán)境變量,而我們需要通過(guò)系統(tǒng)環(huán)境變量來(lái)設(shè)置產(chǎn)品服務(wù)的端口,所以需要在配置中心git倉(cāng)庫(kù)中修改產(chǎn)品服務(wù)的配置文件product-service.yml

?
1
2
3
4
5
6
7
server:
 port: 8081
spring:
 cloud:
  config:
   allow-override: true
   override-system-properties: false

allow-override的默認(rèn)值即為true,寫(xiě)出它來(lái)是想作說(shuō)明,它的意思是允許遠(yuǎn)程配置中心的配置項(xiàng)覆蓋本地的配置,并不是說(shuō)允許本地的配置去覆蓋遠(yuǎn)程的配置。當(dāng)然我們可以把它設(shè)置成false,但是為了提供更精確的覆蓋規(guī)則,這里保留了默認(rèn)值。

我們添加了override-system-properties=false,即雖然遠(yuǎn)程配置中心的配置文件可以覆蓋本地的配置,但是不要覆蓋本地系統(tǒng)變量。修改完成后提交到git倉(cāng)庫(kù)。

另外,在productservice項(xiàng)目的productcontroller中添加一些log,用來(lái)驗(yàn)證負(fù)載均衡是否生效:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package cn.zxuqian.controllers;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;
@restcontroller
public class productcontroller {
  private static logger log = loggerfactory.getlogger(productcontroller.class);
 
  @requestmapping("/products")
  public string productlist() {
    log.info("access to /products endpoint");
    return "外套,夾克,毛衣,t恤";
  }
}

 為web配置ribbon

首先在pom.xml中添加ribbon的依賴(lài):

?
1
2
3
4
<dependency>
  <groupid>org.springframework.cloud</groupid>
  <artifactid>spring-cloud-starter-netflix-ribbon</artifactid>
</dependency>

然后修改application類(lèi),添加如下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@enablecircuitbreaker
@enablediscoveryclient
@ribbonclient(name = "product-service")
@springbootapplication
public class application {
  public static void main(string[] args) {
    springapplication.run(application.class, args);
  }
 
  @bean
  @loadbalanced
  public resttemplate rest(resttemplatebuilder builder) {
    return builder.build();
  }
}

 這里用到了@ribbonclient(name = "product-service")注解,用來(lái)標(biāo)記此項(xiàng)目為ribbon負(fù)載均衡的客戶端,它需要選擇產(chǎn)品服務(wù)集群中其中的一臺(tái)來(lái)訪問(wèn)所需要的服務(wù),這里的name屬性對(duì)應(yīng)于productservice項(xiàng)目中配置的spring.application.name屬性。

@loadbalanced注解標(biāo)明了resttemplate會(huì)被配置為自動(dòng)使用ribbon的loadbalancerclient來(lái)選擇服務(wù)的uri并發(fā)送請(qǐng)求。

在我們?cè)趐roductservice類(lèi)中添加如下代碼:

?
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
@service
public class productservice {
  private final resttemplate resttemplate;
  @autowired
  private discoveryclient discoveryclient;
  public productservice(resttemplate resttemplate) {
    this.resttemplate = resttemplate;
  }
 
  @hystrixcommand(fallbackmethod = "backupproductlist")
  public string productlist() {
    list<serviceinstance> instances = this.discoveryclient.getinstances("product-service");
    if(instances != null && instances.size() > 0) {
      return this.resttemplate.getforobject(instances.get(0).geturi() + "/products", string.class);
    }
 
    return "";
  }
 
  public string backupproductlist() {
    return "夾克,毛衣";
  }
 
  public string productlistloadbalanced() {
    return this.resttemplate.getforobject("http://product-service/products", string.class);
  }
}

 這里新添加了一個(gè)productlistloadbalanced方法,跟之前的productlist方法訪問(wèn)的是同一服務(wù),只不過(guò)是用ribbon client去做了負(fù)載均衡,這里的uri的host變成了product-service即要訪問(wèn)的服務(wù)的名字,跟@ribbonclient中配置的name屬性保持一致。最后在我們的productcontroller中添加下面的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@restcontroller
public class productcontroller {
 
  @autowired
  private productservice productservice;
 
  @requestmapping("/products")
  public string productlist() {
    return productservice.productlist();
  }
 
  @requestmapping("/productslb")
  public string productlistloadbalanced() {
    return productservice.productlistloadbalanced();
  }
}

來(lái)創(chuàng)建一個(gè)專(zhuān)門(mén)處理/productslb請(qǐng)求的方法,調(diào)用productservie提供負(fù)載均衡的方法。

到這里我們的代碼就完成了,代碼看似簡(jiǎn)單,其實(shí)是所有的配置都使用了默認(rèn)值。ribbon提供了編程式和配置式兩種方式來(lái)配置ribbon client。現(xiàn)簡(jiǎn)單介紹下,后續(xù)深入ribbon時(shí)再和大家一起看看如何修改它的配置。ribbon提供如下配置(左邊是接口,右邊是默認(rèn)實(shí)現(xiàn)):

  1. iclientconfig ribbonclientconfig: defaultclientconfigimpl
  2. irule ribbonrule: zoneavoidancerule
  3. iping ribbonping: dummyping
  4. serverlist<server> ribbonserverlist: configurationbasedserverlist
  5. serverlistfilter<server> ribbonserverlistfilter: zonepreferenceserverlistfilter
  6. iloadbalancer ribbonloadbalancer: zoneawareloadbalancer
  7. serverlistupdater ribbonserverlistupdater: pollingserverlistupdater

因?yàn)槲覀冞@個(gè)項(xiàng)目用了eureka,所以有些配置項(xiàng)和默認(rèn)實(shí)現(xiàn)有所不同,如eureka使用discoveryenabledniwsserverlist取代ribbonserverlist來(lái)獲取在eureka上注冊(cè)的服務(wù)的列表。下邊有一個(gè)簡(jiǎn)單的congiguration類(lèi),來(lái)自spring官網(wǎng):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class sayhelloconfiguration {
 @autowired
 iclientconfig ribbonclientconfig;
 
 @bean
 public iping ribbonping(iclientconfig config) {
  return new pingurl();
 }
 
 @bean
 public irule ribbonrule(iclientconfig config) {
  return new availabilityfilteringrule();
 }
 
}

ribbon默認(rèn)不會(huì)發(fā)送ping檢查server的健康狀態(tài),默認(rèn)均正常,然后irune默認(rèn)實(shí)現(xiàn)為zoneavoidancerule用來(lái)避免aws ec2問(wèn)題較多的zone,這在本地測(cè)試環(huán)境來(lái)說(shuō)是用不到的,然后替換成了availabilityfilteringrule,這個(gè)可以開(kāi)啟ribbon自帶的斷路器功能,來(lái)過(guò)濾不正常工作的服務(wù)器。

測(cè)試

首先啟動(dòng)我們的configserver配置中心服務(wù),然后啟動(dòng)registry eureka注冊(cè)與發(fā)現(xiàn)服務(wù),然后啟動(dòng)兩個(gè)productservice,第一個(gè)我們可以正常使用spring-boot:run插件來(lái)啟動(dòng),第二個(gè)我們需要給它提供一個(gè)新的端口,可以用如下命令啟動(dòng):

?
1
$ server_port=8082 mvn spring-boot:run

最后啟動(dòng)我們的web客戶端項(xiàng)目,訪問(wèn)http://localhost:8080/productslb,然后刷新幾次,會(huì)看到運(yùn)行著productservice的兩個(gè)命令行窗口會(huì)隨機(jī)出現(xiàn)我們的log:

?
1
access to /products endpoint

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

原文鏈接:https://blog.csdn.net/fengqiuzhihua/article/details/80205923

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品视频在线观看 | 久久人妻少妇嫩草AV无码 | 京东热在线观看 | 掰开逼操 | 亚洲欧美精品久久 | 色cccwww在线播放 | 亚洲精品91在线 | 国产区小视频 | 天天狠天天透天干天天怕处 | 亚洲精品私拍国产福利在线 | yjzz视频 | 欧美高清在线精品一区二区不卡 | fuqer日本老师 | 午夜视频一区 | 亚洲 欧美 中文字幕 在线 | 精品久久久麻豆国产精品 | 精品一区二区三区在线视频观看 | 白丝女仆被啪到深夜漫画 | 亚洲成人中文 | 国产东北三老头伦一肥婆 | xxx86日本人| 撕开老师的丝袜白丝扒开粉嫩的小 | aaa级黄色片 | 久99视频精品免费观看福利 | 国产悠悠视频在线播放 | 男人天堂资源 | 我被黑人彻底征服的全文 | 亚洲国产成人久久精品hezyo | 香蕉在线播放 | 韩国日本在线观看 | 亚洲区在线 | 欧美精选视频 | 亚洲精品国产精品精 | 色久激情| 脱jk裙的美女露小内内无遮挡 | 小浪妇奶真大水多 | 国产精品51麻豆cm传媒 | 8天堂资源在线官网 | 成人网欧美亚洲影视图片 | 成人免费播放 | 精品午夜久久网成年网 |