Spring Cloud Ribbon 是一个基于 Http 和 TCP 的客服端负载均衡工具,它是基于 Netflix Ribbon 实现的。客户端负载均衡即是当浏览器向后台发出请求的时候,客户端会向 Eureka Server 读取注册到服务器的可用服务信息列表,根据设定的负载均衡策略(没有设置即用默认的),选择向哪台服务器发送请求
本文将介绍Ribbon的工作原理以及如何在项目中使用
ribbon实现的关键点是为ribbon定制的RestTemplate,ribbon利用了RestTemplate的拦截器机制,在拦截器中实现ribbon的负载均衡。负载均衡的基本实现就是利用applicationName从服务注册中心获取可用的服务地址列表,然后通过一定算法负载,决定使用哪一个服务地址来进行http调用
随机选择状态为UP的Server
默认选择
以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器
根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低
复合判断server所在区域的性能和server的可用性选择server
由于有专门一章介绍Eureka,对Eureka不熟悉的可以前往阅读这篇文章:SpringCloud组件之Eureka
,这里不在讲解如何搭建啦。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
spring:
profiles:
active: demo1
server:
port: 8090
spring:
application:
name: demo
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
server:
port: 8091
spring:
application:
name: demo
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
由于要测试负载,因此创建两个配置文件,bootstrap为引导文件,较application先执行
/**
* @author Gjing
*/
@SpringBootApplication
@EnableEurekaClient
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
/**
* @author Gjing
**/
@RestController
public class TestController {
@GetMapping("/test-ribbon")
public String testRibbon() {
System.out.println("有新的请求");
return "success";
}
}
分别启动两个不同的端口服务
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
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);
}
}
向容器中注入 restTemplate,同时通过 @LoadBalanced 开启 restTemplate 负载均衡功能
/**
* @author Gjing
**/
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
/**
* @author Gjing
**/
@RestController
public class TestRibbonController {
@Resource
private RestTemplate restTemplate;
@PostMapping("/test")
public String test() {
return restTemplate.getForObject("http://demo/test-ribbon", String.class);
}
}
启动后测试,会发现轮询调用我们之前启动的两个不同端口的服务
修改配置类,增加策略规则
/**
* @author Gjing
**/
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 配置随机策略
@Bean
public IRule ribbonRandomRule() {
return new RandomRule();
}
}
接下来启动就是随机向某个服务发起请求了,以下是两个服务的响应情况
好了,本文到此就结束啦,如果发现有误,可以评论留言哦,希望大家可以关注我哦,我会经常分享技术文章,本文Demo地址:SpringCloud-Demo