SpringCloud笔记(Hoxton)——Netflix之Ribbon负载均衡
迪丽瓦拉
2025-05-30 15:09:06
0

Ribbon使用

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,简单的说,Ribbon是Netflix 发布的开源项目,主要功能是提供客户端软件的负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供了一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮你基于某种规则(如简单轮训,随机连接等)去连接这些机器。我们也很容易实现自定义的负载均衡算法。

代码示例

注册中心

这里是Eureka作为服务注册中心,为Ribbon提供服务端信息的获取,比如说服务的IP地址和端口,使用前面搭建好的项目(eureka-server)。

Provider

  1. 在idea中新建两个项目运行主类,选择前面创建好的项目(eureka-provider)。
    在这里插入图片描述
  2. 设置不同运行主类,使用不同端口号,然后启动三个不同端口号的provider。
    在这里插入图片描述

接口实现

调用不同的服务端,会返回对应服务端的接口。

@RestController
@RequestMapping("/api")
public class PoroviderController {@Value("${server.port}")private String serverPort;@PostMapping("/sayHello")public String sayHello(String name) {return "我是服务端" + serverPort + ",你好" + name;}
}

Consumer

新建一个spring-boot工程,取名为consumer-ribbon,在pom文件引入ribbon需要的依赖。

添加依赖

org.springframework.cloudspring-cloud-starter-eureka
org.springframework.cloudspring-cloud-starter-ribbon

配置端口、注册中心等

server:port: 8091servlet:context-path: /ribbon
eureka:client:# false表示不向注册中心注册自己register-with-eureka: falseservice-url:defaultZone: http://localhost:8761/eureka/
spring:application:name: consumer-ribbon

RestTemplate配置

  • SpringCloud为客户端负载均衡创建了特定的注解@LoadBalanced,我们只需要使用该注解修饰创建RestTemplate实例的@Bean函数,SpringCloud就会让RestTemplate使用相关的负载均衡策略,默认情况下使用Ribbon。
  • 除了@LoadBalanced之外,Ribbon还提供@RibbonClient注解。该注解可以为Ribbon客户端声明名称和自定义配置。 name属性可以设置客户端的名称, configuration属性则会设置Ribbon相关的自定义配 类。
@Configuration
public class RestTemplateConfig {/*** @return org.springframework.web.client.RestTemplate* @description 注入一个可以进行负载均衡的RestTemple用于服务问调用* @author fengfan* @date 2022/5/18 14:43*/@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}}

全局配置负载

@Configuration
public class RibbonConfig {/*** @return com.netflix.loadbalancer.IRule* @description 配置随机负载策略* @author fengfan* @date 2022/5/20 16:04*/@Beanpublic IRule iRule(){return new RandomRule();}
}

单独配置负载

  1. 配置文件方法实现
# 服务提供方的单独配置设置(服务名称大小写必须和注册的一样)
EUREKA-PROVIDER:ribbon:ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)ReadTimeout: 3000 #服务请求处理超时时间(毫秒)OkToRetryOnAllOperations: true #对超时请求启用重试机制MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数MaxAutoRetries: 1 # 切换实例后重试最大次数NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡算法
  1. 代码配置实现
@Configuration
public class MyRuleConfig {@Beanpublic IRule iRule() {return new RandomRule();}
}
@SpringBootApplication
@EnableEurekaClient
/*** 在启动改微服务的时候就能去加载我们自定义的Ribbon配置类,从而配置生效* 注意:MyRuleConfig 必须是 @Configuration ,但请注意,它不在主应用程序上下文* 的 @ComponentScan 中,否则将由所有 @RibbonClients 共享。* 如果您使用 @ComponentScan (或 @SpringBootApplication ),* 则需要采取措施避免包含(例如将其放在一个单独的,不重叠的包中,或者指定要在 @ComponentScan )*/
@RibbonClient(name = "EUREKA-PROVIDER", configuration = MyRuleConfig.class)
public class ConsumerRibbonApplication {public static void main(String[] args) {SpringApplication.run(ConsumerRibbonApplication.class, args);}}

自定义负载策略

这里自己将RandomRule抄一份,实际情况根据需求自己实现

public class ZDYRule extends AbstractLoadBalancerRule {@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}@Overridepublic Server choose(Object o) {return this.choose(this.getLoadBalancer(), o);}public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;} else {Server server = null;while(server == null) {if (Thread.interrupted()) {return null;}List upList = lb.getReachableServers();List allList = lb.getAllServers();int serverCount = allList.size();if (serverCount == 0) {return null;}int index = this.chooseRandomInt(serverCount);server = (Server)upList.get(index);if (server == null) {Thread.yield();} else {if (server.isAlive()) {return server;}server = null;Thread.yield();}}return server;}}protected int chooseRandomInt(int serverCount) {return ThreadLocalRandom.current().nextInt(serverCount);}
}
@Configuration
public class MyRuleConfig {@Beanpublic IRule iRule() {return new ZDYRule();}
}

客户端调用实现

@RestController
@RequestMapping("/api")
public class ConsumerRibbonController {@Resourceprivate RestTemplate restTemplate;@PostMapping("/getServerInfo")public String getServerInfo(){MultiValueMap body = new LinkedMultiValueMap<>();body.add("name", "consumer8081");ResponseEntity responseEntity = restTemplate.postForEntity("http://EUREKA-PROVIDER/provider/api/sayHello", body, String.class);return responseEntity.getBody();}
}

Ribbon的负载均衡策略

  • com.netflix.loadbalancer.RandomRule:从提供服务的实例中以随机的方式;
  • com.netflix.loadbalancer.RoundRobinRule:以线性轮询的方式,就是维护一个计数器,从提供服务的实例中按顺序选取,第一次选第一个,第二次选第二个,以此类推,到最后一个以后再从头来过;
  • com.netflix.loadbalancer.RetryRule:在RoundRobinRule的基础上添加重试机制,即在指定的重试时间内,反复使用线性轮询策略来选择可用实例;
  • com.netflix.loadbalancer.WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择;
  • com.netflix.loadbalancer.BestAvailableRule:选择并发较小的实例;
  • com.netflix.loadbalancer.AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例;
  • com.netflix.loadbalancer.ZoneAwareLoadBalancer:采用双重过滤,同时过滤不是同一区域的实例和故障实例,选择并发较小的实例。

测试

在这里插入图片描述

多次请求的服务端,端口随机变化,证明配置成功。
在这里插入图片描述

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...