欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年05月05日 16:52:33   作者:張旭乾的博客  
本篇文章主要介紹了Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

簡(jiǎn)介

我們繼續(xù)以之前博客的代碼為基礎(chǔ),增加Ribbon組件來提供客戶端負(fù)載均衡。負(fù)載均衡是實(shí)現(xiàn)高并發(fā)、高性能、可伸縮服務(wù)的重要組成部分,它可以把請(qǐng)求分散到一個(gè)集群中不同的服務(wù)器中,以減輕每個(gè)服務(wù)器的負(fù)擔(dān)??蛻舳素?fù)載均衡是運(yùn)行在客戶端程序中的,如我們的web項(xiàng)目,然后通過獲取集群的IP地址列表,隨機(jī)選擇一個(gè)server發(fā)送請(qǐng)求。相對(duì)于服務(wù)端負(fù)載均衡來說,它不需要消耗服務(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ù)程序,用來驗(yàn)證負(fù)載均衡,所以需要為第二個(gè)程序提供不同的端口。Spring Cloud配置服務(wù)中心的配置默認(rèn)會(huì)覆蓋本地系統(tǒng)環(huán)境變量,而我們需要通過系統(tǒng)環(huán)境變量來設(shè)置產(chǎn)品服務(wù)的端口,所以需要在配置中心git倉庫中修改產(chǎn)品服務(wù)的配置文件product-service.yml

server:
 port: 8081
spring:
 cloud:
  config:
   allow-override: true
   override-system-properties: false

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

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

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

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

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

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

@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")注解,用來標(biāo)記此項(xiàng)目為Ribbon負(fù)載均衡的客戶端,它需要選擇產(chǎn)品服務(wù)集群中其中的一臺(tái)來訪問所需要的服務(wù),這里的name屬性對(duì)應(yīng)于productService項(xiàng)目中配置的spring.application.name屬性。

@LoadBalanced注解標(biāo)明了RestTemplate會(huì)被配置為自動(dòng)使用Ribbon的LoadBalancerClient來選擇服務(wù)的uri并發(fā)送請(qǐng)求。

在我們?cè)赑roductService類中添加如下代碼:

@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ù),只不過是用Ribbon Client去做了負(fù)載均衡,這里的uri的host變成了product-service即要訪問的服務(wù)的名字,跟@RibbonClient中配置的name屬性保持一致。最后在我們的ProductController中添加下面的代碼:

@RestController
public class ProductController {

  @Autowired
  private ProductService productService;

  @RequestMapping("/products")
  public String productList() {
    return productService.productList();
  }

  @RequestMapping("/productslb")
  public String productListLoadBalanced() {
    return productService.productListLoadBalanced();
  }
}

來創(chuàng)建一個(gè)專門處理/productslb請(qǐng)求的方法,調(diào)用productServie提供負(fù)載均衡的方法。

到這里我們的代碼就完成了,代碼看似簡(jiǎn)單,其實(shí)是所有的配置都使用了默認(rèn)值。Ribbon提供了編程式和配置式兩種方式來配置Ribbon Client?,F(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來獲取在Eureka上注冊(cè)的服務(wù)的列表。下邊有一個(gè)簡(jiǎn)單的Congiguration類,來自Spring官網(wǎng):

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用來避免AWS EC2問題較多的zone,這在本地測(cè)試環(huán)境來說是用不到的,然后替換成了AvailabilityFilteringRule,這個(gè)可以開啟Ribbon自帶的斷路器功能,來過濾不正常工作的服務(wù)器。

測(cè)試

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

$ SERVER_PORT=8082 mvn spring-boot:run

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

Access to /products endpoint

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

相關(guān)文章

  • Java實(shí)現(xiàn)單鏈表翻轉(zhuǎn)實(shí)例代碼

    Java實(shí)現(xiàn)單鏈表翻轉(zhuǎn)實(shí)例代碼

    Java實(shí)現(xiàn)單鏈表反轉(zhuǎn),遞歸和非遞歸兩種形式。接下來通過本文給大家分享Java實(shí)現(xiàn)單鏈表翻轉(zhuǎn)實(shí)例代碼,需要的的朋友參考下
    2017-03-03
  • 詳解Struts2動(dòng)態(tài)方法調(diào)用

    詳解Struts2動(dòng)態(tài)方法調(diào)用

    這篇文章主要介紹了詳解Struts2動(dòng)態(tài)方法調(diào)用,涉及調(diào)用方法的代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • Java中的匿名對(duì)象定義與用法實(shí)例分析

    Java中的匿名對(duì)象定義與用法實(shí)例分析

    這篇文章主要介紹了Java中的匿名對(duì)象定義與用法,結(jié)合實(shí)例形式分析了java匿名對(duì)象的概念、原理、定義與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • 淺談Java中spring 線程異步執(zhí)行

    淺談Java中spring 線程異步執(zhí)行

    這篇文章主要介紹了淺談spring 線程異步執(zhí)行,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java中二叉樹的建立和各種遍歷實(shí)例代碼

    Java中二叉樹的建立和各種遍歷實(shí)例代碼

    這篇文章主要介紹了Java中二叉樹的建立和各種遍歷實(shí)例代碼,涉及樹節(jié)點(diǎn)的定義,后序遍歷,層序遍歷,深度優(yōu)先和廣度優(yōu)先等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Mybatis如何自動(dòng)生成sql語句

    Mybatis如何自動(dòng)生成sql語句

    這篇文章主要介紹了Mybatis如何自動(dòng)生成sql語句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 解決idea每次打開新的項(xiàng)目都需要重新配置maven問題

    解決idea每次打開新的項(xiàng)目都需要重新配置maven問題

    這篇文章主要介紹了解決idea每次打開新的項(xiàng)目都需要重新配置maven問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • spring中ioc是什么

    spring中ioc是什么

    IoC是一種讓服務(wù)消費(fèi)者不直接依賴于服務(wù)提供者的組件設(shè)計(jì)方式,是一種減少類與類之間依賴的設(shè)計(jì)原則。下面通過本文給大家分享spring中ioc的概念,感興趣的朋友一起看看吧
    2017-09-09
  • maven配置阿里云倉庫的實(shí)現(xiàn)方法

    maven配置阿里云倉庫的實(shí)現(xiàn)方法

    本文主要介紹了maven配置阿里云倉庫的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java 異常捕獲及處理案例詳解

    java 異常捕獲及處理案例詳解

    這篇文章主要介紹了java 異常捕獲及處理案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評(píng)論