Spring Cloud Ribbon 是一個基于 Http 和 TCP 的客服端負載均衡工具,它是基于 Netflix Ribbon 實作的。用戶端負載均衡即是當浏覽器向背景送出請求的時候,用戶端會向 Eureka Server 讀取注冊到伺服器的可用服務資訊清單,根據設定的負載均衡政策(沒有設定即用預設的),選擇向哪台伺服器發送請求
本文将介紹Ribbon的工作原理以及如何在項目中使用
一、Ribbon簡介
1、Ribbon工作原理
ribbon實作的關鍵點是為ribbon定制的RestTemplate,ribbon利用了RestTemplate的攔截器機制,在攔截器中實作ribbon的負載均衡。負載均衡的基本實作就是利用applicationName從服務注冊中心擷取可用的服務位址清單,然後通過一定算法負載,決定使用哪一個服務位址來進行http調用
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLiJWM4AzNiVDNyI2M5UWZhljZ2UzNjJ2Y1M2YllTMwIjZ4YzMiRTYm9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
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