国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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-26 14:22張旭乾的博客 Java教程

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

簡介

Spring Cloud Ribbon實現客戶端負載均衡的方法

我們繼續以之前博客的代碼為基礎,增加ribbon組件來提供客戶端負載均衡。負載均衡是實現高并發、高性能、可伸縮服務的重要組成部分,它可以把請求分散到一個集群中不同的服務器中,以減輕每個服務器的負擔。客戶端負載均衡是運行在客戶端程序中的,如我們的web項目,然后通過獲取集群的ip地址列表,隨機選擇一個server發送請求。相對于服務端負載均衡來說,它不需要消耗服務器的資源。

基礎環境

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

git:項目源碼

更新配置

我們這次需要在本地啟動兩個產品服務程序,用來驗證負載均衡,所以需要為第二個程序提供不同的端口。spring cloud配置服務中心的配置默認會覆蓋本地系統環境變量,而我們需要通過系統環境變量來設置產品服務的端口,所以需要在配置中心git倉庫中修改產品服務的配置文件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的默認值即為true,寫出它來是想作說明,它的意思是允許遠程配置中心的配置項覆蓋本地的配置,并不是說允許本地的配置去覆蓋遠程的配置。當然我們可以把它設置成false,但是為了提供更精確的覆蓋規則,這里保留了默認值。

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

另外,在productservice項目的productcontroller中添加一些log,用來驗證負載均衡是否生效:

?
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的依賴:

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

然后修改application類,添加如下代碼:

?
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")注解,用來標記此項目為ribbon負載均衡的客戶端,它需要選擇產品服務集群中其中的一臺來訪問所需要的服務,這里的name屬性對應于productservice項目中配置的spring.application.name屬性。

@loadbalanced注解標明了resttemplate會被配置為自動使用ribbon的loadbalancerclient來選擇服務的uri并發送請求。

在我們在productservice類中添加如下代碼:

?
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);
  }
}

 這里新添加了一個productlistloadbalanced方法,跟之前的productlist方法訪問的是同一服務,只不過是用ribbon client去做了負載均衡,這里的uri的host變成了product-service即要訪問的服務的名字,跟@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();
  }
}

來創建一個專門處理/productslb請求的方法,調用productservie提供負載均衡的方法。

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

  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

因為我們這個項目用了eureka,所以有些配置項和默認實現有所不同,如eureka使用discoveryenabledniwsserverlist取代ribbonserverlist來獲取在eureka上注冊的服務的列表。下邊有一個簡單的congiguration類,來自spring官網:

?
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默認不會發送ping檢查server的健康狀態,默認均正常,然后irune默認實現為zoneavoidancerule用來避免aws ec2問題較多的zone,這在本地測試環境來說是用不到的,然后替換成了availabilityfilteringrule,這個可以開啟ribbon自帶的斷路器功能,來過濾不正常工作的服務器。

測試

首先啟動我們的configserver配置中心服務,然后啟動registry eureka注冊與發現服務,然后啟動兩個productservice,第一個我們可以正常使用spring-boot:run插件來啟動,第二個我們需要給它提供一個新的端口,可以用如下命令啟動:

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

最后啟動我們的web客戶端項目,訪問http://localhost:8080/productslb,然后刷新幾次,會看到運行著productservice的兩個命令行窗口會隨機出現我們的log:

?
1
access to /products endpoint

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品美女久久久久久久久久久 | 久久只有精品 | 亚色图 | 米奇影视7777| 黄色三级视频 | 美女一区二区三区 | 国产区一区 | 99精品电影| 性色视频免费观看 | 亚洲成人福利 | jizz中国jizz女人 | 美女视频一区二区三区 | 免费观看的av | 国产精品久久久久久 | 久久99精品国产自在现线 | 在线a电影 | 波多野结衣中文字幕一区二区三区 | 国产精品久久久久久久久久新婚 | 亚洲一区二区三区四区的 | 欧美视频在线一区 | 日本特黄特色aaa大片免费 | 亚洲 欧美 另类 综合 偷拍 | 国产露脸国语对白在线 | 欧美精品久久久久久久久老牛影院 | 毛片黄片 | 99热在线精品免费 | 一级国产免费 | 国产综合亚洲精品一区二 | 成人网在线视频 | 男女免费视频 | 日韩在线中文字幕 | 午夜影院久久 | 亚洲电影二区 | 国产羞羞视频免费在线观看 | 97久久精品人人澡人人爽 | 久久久久综合视频 | 亚洲综合色视频在线观看 | 岛国黄色大片 | 狠狠躁躁夜夜躁波多野结依 | 久久久夜色精品亚洲 | 精品www |