天天看點

SpringCloud元件之Ribbon

Spring Cloud Ribbon 是一個基于 Http 和 TCP 的客服端負載均衡工具,它是基于 Netflix Ribbon 實作的。用戶端負載均衡即是當浏覽器向背景送出請求的時候,用戶端會向 Eureka Server 讀取注冊到伺服器的可用服務資訊清單,根據設定的負載均衡政策(沒有設定即用預設的),選擇向哪台伺服器發送請求

本文将介紹Ribbon的工作原理以及如何在項目中使用

一、Ribbon簡介

1、Ribbon工作原理

ribbon實作的關鍵點是為ribbon定制的RestTemplate,ribbon利用了RestTemplate的攔截器機制,在攔截器中實作ribbon的負載均衡。負載均衡的基本實作就是利用applicationName從服務注冊中心擷取可用的服務位址清單,然後通過一定算法負載,決定使用哪一個服務位址來進行http調用

SpringCloud元件之Ribbon

2、Ribbon的常用負載政策

  • RandomRule:随機選取負載均衡政策。
随機選擇狀态為UP的Server
  • RoundRobinRule:簡單輪詢負載均衡,

    預設選擇

以輪詢的方式依次将請求排程不同的伺服器,即每次排程執行i = (i + 1) mod n,并選出第i台伺服器
  • WeightedResponseTimeRule:權重響應時間負載均衡
根據響應時間配置設定一個weight,響應時間越長,weight越小,被選中的可能性越低
  • ZoneAvoidanceRule:區域感覺輪詢負載均衡
複合判斷server所在區域的性能和server的可用性選擇server

二、搭建Eureka服務

由于有專門一章介紹Eureka,對Eureka不熟悉的可以前往閱讀這篇文章:

SpringCloud元件之Eureka

,這裡不在講解如何搭建啦。

三、搭建web服務,用于ribbon調用

1、導入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>           

2、配置檔案

  • bootstrap.yml
spring:
  profiles:
    active: demo1           
  • application-demo1.yml
server:
  port: 8090
spring:
  application:
    name: demo
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/           
  • application-demo2.yml
server:
  port: 8091
spring:
  application:
    name: demo
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/           

由于要測試負載,是以建立兩個配置檔案,bootstrap為引導檔案,較application先執行

3、啟動類

/**
 * @author Gjing
 */
@SpringBootApplication
@EnableEurekaClient
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}           

4、提供接口

/**
 * @author Gjing
 **/
@RestController
public class TestController {

    @GetMapping("/test-ribbon")
    public String testRibbon() {
        System.out.println("有新的請求");
        return "success";
    }

}           

分别啟動兩個不同的端口服務

四、搭建發起Ribbon調用的服務

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>           

server:
  port: 8084
spring:
  application:
    name: ribbon-demo
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/           

/**
 * @author Gjing
 */
@SpringBootApplication
@EnableEurekaClient
public class RibbonApplication {
    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }
}           

4、配置類

向容器中注入 restTemplate,同時通過 @LoadBalanced 開啟 restTemplate 負載均衡功能

/**
 * @author Gjing
 **/
@Configuration
public class RibbonConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}           

5、接口調用

/**
 * @author Gjing
 **/
@RestController
public class TestRibbonController {

    @Resource
    private RestTemplate restTemplate;

    @PostMapping("/test")
    public String test() {
        return restTemplate.getForObject("http://demo/test-ribbon", String.class);
    }
}           

啟動後測試,會發現輪詢調用我們之前啟動的兩個不同端口的服務

  • 服務1
    SpringCloud元件之Ribbon
  • 服務2
    SpringCloud元件之Ribbon

6、負載政策很多,本文舉例随機政策來實作負載

修改配置類,增加政策規則

/**
 * @author Gjing
 **/
@Configuration
public class RibbonConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    // 配置随機政策
    @Bean
    public IRule ribbonRandomRule() {
        return new RandomRule();
    }
}           

接下來啟動就是随機向某個服務發起請求了,以下是兩個服務的響應情況

  • SpringCloud元件之Ribbon
  • SpringCloud元件之Ribbon

好了,本文到此就結束啦,如果發現有誤,可以評論留言哦,希望大家可以關注我哦,我會經常分享技術文章,本文Demo位址:

SpringCloud-Demo

繼續閱讀