1. 程式人生 > >Spring Cloud入門教程-Ribbon實現客戶端負載均衡

Spring Cloud入門教程-Ribbon實現客戶端負載均衡

簡介

結構

我們繼續以之前部落格的程式碼為基礎,增加Ribbon元件來提供客戶端負載均衡。負載均衡是實現高併發、高效能、可伸縮服務的重要組成部分,它可以把請求分散到一個叢集中不同的伺服器中,以減輕每個伺服器的負擔。客戶端負載均衡是執行在客戶端程式中的,如我們的web專案,然後通過獲取叢集的IP地址列表,隨機選擇一個server傳送請求。相對於服務端負載均衡來說,它不需要消耗伺服器的資源。

基礎環境

  • JDK 1.8
  • Maven 3.3.9
  • IntelliJ 2018.1
  • Git

專案原始碼

更新配置

我們這次需要在本地啟動兩個產品服務程式,用來驗證負載均衡,所以需要為第二個程式提供不同的埠。Spring Cloud配置服務中心的配置預設會覆蓋本地系統環境變數,而我們需要通過系統環境變數來設定產品服務的埠,所以需要在配置中心git倉庫中修改產品服務的配置檔案product-service.yml

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,用來驗證負載均衡是否生效:

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")註解,用來標記此專案為Ribbon負載均衡的客戶端,它需要選擇產品服務叢集中其中的一臺來訪問所需要的服務,這裡的name屬性對應於productService專案中配置的spring.application.name屬性。
@LoadBalanced註解標明瞭RestTemplate會被配置為自動使用Ribbon的LoadBalancerClient來選擇服務的uri併發送請求。

在我們在ProductService類中新增如下程式碼:

@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中新增下面的程式碼:

@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提供如下配置(左邊是介面,右邊是預設實現):

  • IClientConfig ribbonClientConfig: DefaultClientConfigImpl
  • IRule ribbonRule: ZoneAvoidanceRule
  • IPing ribbonPing: DummyPing
  • ServerList<Server> ribbonServerList: ConfigurationBasedServerList
  • ServerListFilter<Server> ribbonServerListFilter: ZonePreferenceServerListFilter
  • ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer
  • ServerListUpdater ribbonServerListUpdater: PollingServerListUpdater

因為我們這個專案用了Eureka,所以有些配置項和預設實現有所不同,如Eureka使用DiscoveryEnabledNIWSServerList取代ribbonServerList來獲取在Eureka上註冊的服務的列表。下邊有一個簡單的Congiguration類,來自Spring官網:

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外掛來啟動,第二個我們需要給它提供一個新的埠,可以用如下命令啟動:

$ SERVER_PORT=8082 mvn spring-boot:run

最後啟動我們的web客戶端專案,訪問http://localhost:8080/productslb,然後重新整理幾次,會看到執行著productService的兩個命令列視窗會隨機出現我們的log:

 Access to /products endpoint

相關推薦

Spring Cloud入門教程-Ribbon實現客戶負載均衡

簡介 我們繼續以之前部落格的程式碼為基礎,增加Ribbon元件來提供客戶端負載均衡。負載均衡是實現高併發、高效能、可伸縮服務的重要組成部分,它可以把請求分散到一個叢集中不同的伺服器中,以減輕每個伺服器的負擔。客戶端負載均衡是執行在客戶端程式中的,如我們的w

Spring Cloud-04使用Ribbon實現客戶負載均衡

文章目錄 概述 Ribbon演示 服務提供者微服務改造為使用MySql資料庫 新建服務消費者微服務,配置Ribbon 注意事項 原始碼 概述 Spring Cloud-03將微服務註冊到Eur

SpringCloud筆記(三)使用DiscoveryClient手動實現客戶負載均衡

1、什麼是客戶端負載均衡(Ribbon)? Ribbon是從eureka註冊中心伺服器端上獲取服務註冊資訊列表,快取到本地,然後在本地實現輪訓負載均衡策略。既在客戶端實現負載均衡。 2、什麼是服務端負載均衡(Nginx)?  Nginx是客戶端所有請求統一交給Nginx,由

Spring Cloud 入門教程(五): Ribbon實現客戶負載均衡

接上節,假如我們的Hello world服務的訪問量劇增,用一個服務已經無法承載, 我們可以把Hello World服務做成一個叢集。  很簡單,我們只需要複製Hello world服務,同時將原來的埠8762修改為8763。然後啟動這兩個Spring Boot應用, 就可

Spring Cloud 入門教程(六): 用宣告式REST客戶Feign呼叫遠端HTTP服務

首先簡單解釋一下什麼是宣告式實現? 要做一件事, 需要知道三個要素,where, what, how。即在哪裡( where)用什麼辦法(how)做什麼(what)。什麼時候做(when)我們納入how的範疇。 1)程式設計式實現: 每一個要素(where,wh

深入理解Spring Cloud Ribbon客戶負載均衡原理(一 實現服務實例地址轉換)

missing 組織 not final str dynamics string pla pan 在使用spring cloud搭建微服務架構時,需要進行負載均衡操作。負載均衡分為硬件負載均衡和軟件負載均衡,軟件負載均衡又分為服務端負載均衡和客戶端負載均衡。本系列主要介紹利

筆記:Spring Cloud Ribbon 客戶負載均衡

系統架構 aging gap release 架構 err 接口 frame enable Spring Cloud Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,基於 Netflix Ribbon 實現,通過Spring Cloud 的封裝,可以讓

客戶負載均衡Ribbon之一:Spring Cloud Netflix負載均衡組件Ribbon介紹

erl status spring 使用 -c ive res 性能 bili Netflix:[‘netfli?ks] ribbon:英[?r?b?n]美[?r?b?n]n. 帶; 綬帶; (打印機的) 色帶; 帶狀物;v. 把…撕成條帶; 用緞帶

Spring Cloud入門教程-Hystrix斷路器實現容錯和降級

hystrix spring cloud spring cloud hystri 簡介 Spring cloud提供了Hystrix容錯庫用以在服務不可用時,對配置了斷路器的方法實行降級策略,臨時調用備用方法。這篇文章將創建一個產品微服務,註冊到eureka服務註冊中心,然後我們使用web客戶端訪

Spring Cloud微服務實戰》讀書筆記之客戶負載均衡Spring Cloud Ribbon - 4

摘要 客戶端負載均衡元件部署在客戶端,由客戶端維護要訪問的服務端清單(清單來源於服務註冊中心)。在Spring Cloud 中預設使用Ribbon作為客戶端負載均衡。 關鍵詞:客戶端負載均衡,Ribbon 一、什麼是客戶端負載均衡 負載均衡是對系統高可用、緩解網路壓力、處理能力擴容的重要手段之一。通常

Spring Cloud Ribbon(客戶負載均衡)(2)

1.引數配置 對於Ribbon的引數配置通常有兩種方式:全域性配置以及指定客戶端配置: 全域性配置:ribbon.<key>=<value>格式進行配置即可。<key>代表了Ribbon客戶端配置的引數名,<value>代表了對應引數值。比

Spring Cloud微服務實戰》讀書筆記之客戶負載均衡Spring Cloud Ribbon

摘要 客戶端負載均衡元件部署在客戶端,由客戶端維護要訪問的服務端清單(清單來源於服務註冊中心)。在Spring Cloud 中預設使用Ribbon作為客戶端負載均衡。 關鍵詞:客戶端負載均衡,Ribbon 一、什麼是客戶端負載均衡 負載均衡是對系統高可用、緩解網

3.Spring Cloud初相識--------Ribbon客戶負載均衡

前言: 在生產環境中,未避免單點故障,每個微服務都會做高可用部署。 通白的說,就是每一個一模一樣的服務會根據需求提供多分在多臺機器上。 那麼在大併發的情況下,如何分配服務可以快速得到響應,就成為了我們要解決的問題。 Ribbon就是一款優秀的客戶端負載均衡機制。 什麼是客戶端負載均衡呢? 就是由服務的消費方來

第四章 客戶負載均衡Spring Cloud Ribbon

  Spring Cloud R巾bon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,它基於 NetflixRibbon 實現。 通過 Spring Cloud 的封裝, 可以讓我們輕鬆地將面向服務的 REST 模板請求自動轉換成客戶端負載均衡的服務呼叫   客戶端負載均衡   我

SpringCloud之客戶負載均衡Spring Cloud Ribbon例項

一、簡介 Spring Cloud Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,它基於 Netflix Ribbon 實現。 通過 Spring Cloud 的封裝, 可以讓

spring cloud (四) 服務客戶負載均衡Ribbon

概述Ribbon是一個客戶端負載均衡器, 它可以讓您對HTTP和TCP客戶端的行為有很大的控制權。   Feign已經使用Ribbon,所以如果您使用的是@FeignClient, 那麼這個部分也適用。      Ribbon中一個重要的概念是named client。    Spring Cloud使用Ri

Spring cloud微服務的客戶負載均衡 Ribbon

    在我們已經有了服務註冊中心和服務提供者(這裡為了節省時間,此專案即是服務提供者,也是服務消費者),下面就嘗試建立服務消費者,它主要完成兩個目標,發現服務和消費服務。其中發現服務由 Eureak 的客戶端完成,而服務消費的任務由 Ribbon 完成。Ribbon 是一個

Spring Cloud 入門教程(二): 服務消費者(rest+ribbon)(Greenwich.RELEASE)

一、準備工作,eclipse執行兩個例項 1、修改  eurekaclient1 中 application.yml

Spring Cloud第四篇 | 客戶負載均衡Ribbon

​ 本文是Spring Cloud專欄的第四篇文章,瞭解前三篇文章內容有助於更好的理解本文: ​Spring Cloud第一篇 | Spring Cloud前言及其常用元件介紹概覽 Spring Cloud第二篇 | 使用並認識Eureka註冊中心 Spring Cloud第三篇 | 搭

springCloud(7):Ribbon實現客戶負載均衡-消費者整合Ribbon

spring cloud ribbon 消費者整合ribbon 一、簡介 Ribbon是Netfix發布的負載均衡器,它有助於控制HTTP和TCP客戶端的行為。為Ribbon配置服務提供者地址列表後,Ribbon就可基於某種負載均衡算法,自動地幫助服務消費者去請求。Ribbon默認為我們提供了很