Spring Cloud Ribbon 是一个基于 Http 和 TCP 的客服端负载均衡工具, 它是基于 Netflix Ribbon 实现的. 客户端负载均衡即是当浏览器向后台发出请求的时候, 客户端会向 Eureka Server 读取注册到服务器的可用服务信息列表, 根据设定的负载均衡策略 (没有设置即用默认的), 选择向哪台服务器发送请求
本文将介绍 Ribbon 的工作原理以及如何在项目中使用
一, Ribbon 简介
1,Ribbon 工作原理
ribbon 实现的关键点是为 ribbon 定制的 RestTemplate,ribbon 利用了 RestTemplate 的拦截器机制, 在拦截器中实现 ribbon 的负载均衡. 负载均衡的基本实现就是利用 applicationName 从服务注册中心获取可用的服务地址列表, 然后通过一定算法负载, 决定使用哪一个服务地址来进行 http 调用
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.YAML
- spring:
- profiles:
- active: demo1
- application-demo1.YAML
- server:
- port: 8090
- spring:
- application:
- name: demo
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:8761/eureka/
- application-demo2.YAML
- 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 调用的服务
1, 导入依赖
- <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>
2, 配置文件
- server:
- port: 8084
- spring:
- application:
- name: ribbon-demo
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:8761/eureka/
3, 启动类
- /**
- * @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
服务 2
6, 负载策略很多, 本文举例随机策略来实现负载
修改配置类, 增加策略规则
- /**
- * @author Gjing
- **/
- @Configuration
- public class RibbonConfig {
- @Bean
- @LoadBalanced
- public RestTemplate restTemplate() {
- return new RestTemplate();
- }
- // 配置随机策略
- @Bean
- public IRule ribbonRandomRule() {
- return new RandomRule();
- }
- }
接下来启动就是随机向某个服务发起请求了, 以下是两个服务的响应情况
服务 1
服务 2
好了, 本文到此就结束啦, 如果发现有误, 可以评论留言哦, 希望大家可以关注我哦, 我会经常分享技术文章, 本文 Demo 地址: SpringCloud-Demo
来源: https://yq.aliyun.com/articles/707750