Spring cloud alibaba之Ribbon负载均衡实现方案
作者:清云青云 发布时间:2021-11-08 20:05:23
1.什么是Ribbon
目前主流的负载均衡方案分为以下两种:
(1)集中式负载均衡:在消费者和服务提供者中间使用独立的代理方式进行负载,有硬件的(F5),软件的Nginx
(2)客户端事先拿到提供者请求连接集合,根据自己的请求情况做负载均衡,Ribbon就属于客户端自己做负载均衡。
Spring cloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具,Ribbon客户端提供一系列完善的配置,如超时、重试等。通过Load Balancer获取到服务器提供的所有机器实例,Ribbon会自动基于某种规则(轮询、随机)去调用这些服务。Ribbon也可以实现自己的负载均衡算法。
1.1客户端的负载均衡
例如spring cloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡,即在客户端进行负载均衡算法分配。
1.2服务器端的负载均衡
例如通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端进行负载均衡算法分配。
1.3常见负载均衡算法
(1)随机:通过随机选择服务进行执行,一般这种方法使用较少
(2)轮询:负载均衡默认实现方式,请求来之后排队处理
(3)加权轮询:通过对服务器性能的分型,给高配置、低负载的服务器分配更高的权重,均衡各个服务器的压力
(4)地址Hash,通过客户端地址请求地址的hash值取模映射进行调度,
(5)最小链接数:即使请求均衡了,压力不一定会均衡,最小链接数法就是根据服务器的情况,例如请求积压数的参数,将请求分配到当前压力最小的服务器上
2.Nacos使用Ribbon
(1)Nacos disconvery中默认已经引入了Ribbon,不需要单独引入
(2)添加@LoadBalanced注解
(3)调用的时候使用服务器名称替代ip+端口,即使用默认轮询的负载均衡方式
3.Ribbon负载均衡策略
3.1常用负载均衡描述
①RandomRule:随机选择一个服务实例
②RoundRobinRule:轮询负载均衡策略
③RetryTule:在轮询的基础上进行重试,一直重试的次数由服务连接的超时时间控制
④WeightedResponseTimeRule:一个服务的平均响应时间越短,则权重越大,那么改实例被选中执行任务的概率也越大
⑤BestAvaliableRule:过滤掉失效的服务实例,顺便找出并发最小的服务实例来使用
⑥ZoneAvoidanceRule:判断所在的区域,选择最近的服务调用
⑦NacosRule:按随机与配置的权重进行选择服务器
3.2修改默认的负载均衡策略--配置类的方式
①赋值一份消费端项目OrderNacos,重命名为OrderRibbon
删除OrderRibbon中原先的OrderNacos.iml文件
修改OrderRibbon的pom.xml的ArtifactId值
把新添加的OrderRibbon添加到父项目的pom.xml的module中
刷新maven项目
②创建RibbonConfig配置类
使用@Configuration标识是配置类,使用@Bean注入到spring容器中,方法名必须叫iRule,否则无效。
/**
* 重写负载均衡配置类
*/
@Configuration
public class RibbonConfig {
//方法名一定要叫iRule
@Bean
public IRule iRule(){
return new RandomRule();
}
}
****注意此配置类不能放在@SpringBootApplication的注解@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的RibbonClients共享,
springboot启动类,没有配置扫描范围的话,默认扫描到与启动类OrderApplication同目录级别的文件,此处为qingyun包下的文件都会被扫描到。
配置的目录如下:
③在启动类中使用注解@RibbonClients加入配置的自定义负载均衡器,value里面可以配置多个负载均衡器,是个数组类型的值;调用服务创建的RestTemplate使用@LoadBalanced进行修饰。
启动消费者,两个不同端口的服务提供者,通过页面访问,查看负载均衡机制由之前默认的改为轮询的方式
3.3修改默认的负载均衡策略--配置文件的方式
使用配置文件的方式设定负载均衡方式,具体到某个服务,格式:服务名.ribbon.NFLoadBalancerRuleClassName=服务方式
stock-service.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule
在nacos管理界面配置服务器的权重,权重越大,被选中的概率越大。
也可以在项目配置文件中设置
#设置服务的权重
spring.cloud.nacos.discovery.weight=4
3.4自定义负载均衡策略
(1)定义一个类继承AbstractLoadBalancerRule,重写choose方法
/**
* 自定义负载均衡策略
*/
public class CustomRule extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object o) {
ILoadBalancer loadBalancer = this.getLoadBalancer();
//获取当前请求的实例集合
List<Server> reachableServers = loadBalancer.getReachableServers();
//使用线程安全生成一个随机数
int i = ThreadLocalRandom.current().nextInt(reachableServers.size());
//获取服务
Server server = reachableServers.get(i);
return server;
}
}
(2)在application.properties中添加配置信息,指向自定义的配置类
stock-service.ribbon.NFLoadBalancerRuleClassName=com.rule.CustomRule
(3)开启ribbon饥饿加载
当没有任何配置的情况下,第一次请求服务时,才会请求加载对应的服务实例
可以在配置文件application.properties中配置饥饿加载
#开启ribbon饥饿加载
ribbon.eager-load.enabled=true
#饥饿加载是服务,多个使用逗号隔开
ribbon.eager-load.clients=stock-service
启动项目的时候,加载配置服务使用的负载均衡策略
4.使用spring cloud loadbalancer替代ribbon
(1)在pom.xml中引入nacos-discovery时,去除ribbon,此时项目依赖的包里面已经移除ribbon
(2)pom.xml中添加loadbalancer依赖,前提是项目中已经引入了spring cloud依赖(父maven已经引入)
<!-- 添加loadbalancer依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
(3)创建RestTemplate时,需要加@LoadBalanced
//程序启动时创建RestTemplate
//使用注解LoadBalanced标识负载均衡,默认轮询的方式
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
RestTemplate build = builder.build();
return build;
}
(4)application.properties中禁用ribbon
#禁用ribbon
spring.cloud.loadbalancer.ribbon.enabled=false
(5)若是想自定义loadbalancer,与自定义ribbon类似的方式,使用@LoadBalancerClients配置到springboot启动类中
来源:https://blog.csdn.net/ZHANGLIZENG/article/details/119008397


猜你喜欢
- 首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入。依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方
- 前言早在2011年它作为安卓兼容库发布,在75%的应用中使用过,是最广泛使用的安卓库。它事实上不是一个单一的文件,而是一个集合,其中可以大致
- 在程序中对文件操作是非常常见的,而对文件的操作则不可避免的需要文件的路径,并对文件的路径进行一系列的操作,例如:判断已知的路径是一个目录还是
- 一、概述应用程序配置文件,对于asp.net是 web.config,对于WINFORM程序是 App.Config(ExeName.exe
- 将字符串转换为ASCII编码数组,只要是中文字节码就是ASCII编码63即"?",所以可以由此来进行判断class St
- 在Java的逻辑运算符中,有这么四类:&&(短路与),&,|,||(短路或)。&&和&都是表
- 这篇文章主要介绍了Spring MVC处理方法返回值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 首先,说说final。final关键字可以修饰变量,方法,类。final变量:需求:1 需要一个永不改变的编译时常量2 一个运行时被初始化的
- 图的实际应用在现实生活中,有许多应用场景会包含很多点以及点点之间的连接,而这些应用场景我们都可以用即将要学习的图这种数据结构去解决。地图:我
- 一、解码流程解码流程大致分为以下三个部分,以FFmpge源码下的ffmpeg\doc\examples\decode_audio.c为参考。
- System.ComponentModel.Design.DesignSurface是为设计组件提供一个用户界面,通过它可以实现一个简单的窗
- 首先,来看一下,快速排序的实现的动态图:快速排序介绍:快速排序,根据教科书说法来看,是冒泡排序的一种改进。快速排序,由一个待排序的数组(ar
- Hadoop环境搭建详见此文章https://www.jb51.net/article/33649.htm。我们已经知道Hadoop能够通过
- 结构图: 抽象对象: abstract class Component
- 一. 线性表中的顺序表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见
- 现阶段的问题现在是云原生和容器化时代,.NET Core对于云原生来说有非常好的兼容和亲和性,dotnet社区以及微软为.NET Core提
- 在讲使用path绘制多边形时,讲下Canvas的translate(),rotate()方法的使用,本博客中会使用这方面的知识,先单独讲下,
- Settings是WebView提供给上层App的一个配置Webview的接口,每个WebView都有一个WebSettings,要控制We
- Springboot 整合 RocketMQ 收发消息创建springboot项目pom.xml添加rocketmq-spring-boot
- 一、logback日志技术介绍Spring Boot中使用的日志技术为logback。其与Log4J都出自同一人,性能要优于Log4J,是L