1 缘起

Spring稳步向前发展,功能迭代,Bug修复,
对于应用工程师而言,不同版本的Spring对于开发还是有不小的影响,
比如,服务熔断、负载均衡,
SpringCloud2020.0.3版本:
(1)使用新的熔断组件:Resilience4j替代Hystrix,
(2)使用自带的负载均衡LoadBalancer替代Ribbon,
不同项目中使用不同的SpringCloud版本,应用时,各自处理各自的,有很强的割裂感,
打算先从负载均衡器开始,对比分析一下Ribbon和LoadBalancer负载均衡器,
包括两者默认的负载均衡策略、如何找到默认的负载均衡规则、如何自定义负载均衡规则,
帮助读者理解和记忆,轻松应知识考核场景。

2 负载均衡

简单理解:雨露均沾,如下图所示。我认为理想情况下的“均”不是平均,而是合适,
合理利用机器资源,让每台机器的利用率都在合适的范围。
在不同的业务场景下,催生了不同的负载均衡策略,如随机、轮询、最小连接数策略等,
共同的目的是保证服务可用,合理利用集群中的机器资源。

Spring中常用的负载均衡器有:Ribbon和LoadBalancer,
本文也是针对这两种负载均衡器展开分析的。

版本说明:
Ribbon:2.3.0
LoadBalancer:3.0.3

3 Ribbon负载均衡器

Netflix出品。

3.1 负载均衡策略

这里仅列出负载均衡策略,不细讲,后续会另写文章分析。

序号 均衡策略 描述
1 AvailabilityFilteringRule 可用过滤规则,先过滤出故障或并发请求大于阈值的服务实例,然后线性轮询其余的实例
2 BestAvailableRule 最优可用规则,过滤故障后的服务实例,选择并发量最小的实例
3 RandomRule 随机规则,随机选择
4 RetryRule 重试规则,从服务实例轮询获取服务,失败,则重新轮询实例
5 RoundRobinRule 轮询规则,从服务列表中顺序获取服务
6 WeightedResponseTimeRule 响应时间加权轮询
7 ZoneAvoidanceRule 最佳区域实例集合中选择性能最优的服务

3.2 默认负载均衡策略

AvailabilityFilteringRule,可用过滤规则。先过滤出故障或并发请求大于阈值的服务实例,
然后线性轮询剩余的实例,分配请求。

3.2.1 入口类

老规矩,找到入口,Ribbon构造负载均衡器入口源码如下图所示。
位置:com.netflix.loadbalancer.LoadBalancerBuilder
由源码可知,并没有注释,见名知意,这就是构建负载均衡器的入口类,有默认配置config,自定义配置rule等属性。

3.2.2 构建负载均衡策略方法

构建负载均衡器的具体实现(入口)方法源码如下图所示,
位置:com.netflix.loadbalancer.LoadBalancerBuilder#buildFixedServerListLoadBalancer
由源码可知,并且为了分析方便,特将构建负载均衡器可分为4个步骤,如下图的标号,
(1)构建负载均衡器;
(2)创建负载均衡规则;
(3)创建Rule;
(4)获取默认规则;

3.2.2.1 第二步:创建负载均衡规则

通过这个配置,可以获取负载均衡默认属性,如负载均衡器、负载均衡规则等,
config的值,源码如下图所示,
位置:com.netflix.client.config.DefaultClientConfigImpl#getClientConfigWithDefaultValues()
有源码可知,配置的默认属性为getClientConfigWithDefaultValues()。

进入这个方法:getClientConfigWithDefaultValues(),
看到默认的负载均衡器DEFAULT_PROPERTY_NAME_SPACE,
源码如下图所示,由源码可知,使用的默认均衡器为ribbon,通过DefaultClientConfigImpl配置默认属性。

(1)默认的负载均衡器:ribbon

位置:com.netflix.client.config.DefaultClientConfigImpl#DEFAULT_PROPERTY_NAME_SPACE

(2)默认属性配置实现
位置:com.netflix.client.config.DefaultClientConfigImpl#DefaultClientConfigImpl(java.lang.String)
com.netflix.client.config.DefaultClientConfigImpl#loadDefaultValues
通过loadDefaultValues配置默认属性,如下图所示,默认的负载均衡规则Rule,在第三步讲。

DefaultClientConfigImpl中的属性properties用于存储默认属性值,如下图所示,具体的set和get感兴趣的可以继续看下源码,
这里仅给出部分过程和结果。

3.2.2.2 第三步:创建规则Rule

上面分析了填充默认属性值,接下来就可以获取配置以加载负载均衡器,
通过get获取对应的规则类名称,源码如下图所示,
由源码知,默认的Rule的键为:IClientConfigKey.Keys.NFLoadBalancerRuleClassName,
位置:com.netflix.loadbalancer.LoadBalancerBuilder#createRuleFromConfig
这个键对应的值是什么呢?

找到配置属性的地方,源码如下图所示,
由源码知,默认的规则类名称通过getDefaultNfloadbalancerRuleClassname()获取。
位置:com.netflix.client.config.DefaultClientConfigImpl#loadDefaultValues

默认规则类名称源码如下图所示,
由源码知,默认的负载均衡规则为:
位置:com.netflix.client.config.DefaultClientConfigImpl#getDefaultNfloadbalancerRuleClassname

3.3 自定义负载均衡策略

通过上面分析可知Ribbon默认会使用AvailabilityFilteringRule负载均衡策略,
虽然比较繁琐,但是,自定义配置负载均衡策略就比较方便了,
直接构造IRule类型的Bean即可,自定义构造负载均衡策略测试样例如下:

package com.company.microserviceuser.config;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 负载均衡策略配置.** @author xindaqi* @since 2022-09-01 18:17*/
@Configuration
public class LoadBalancerConfig {/*** 轮询策略.** @return 轮询对象*/@Beanpublic IRule loadBalancerRule() {return new RoundRobinRule();}
}

4 Loadbalancer负载均衡器

Spring出品。

4.1 负载均衡策略

序号 均衡策略 描述
1 RandomRule 随机规则,随机选择
2 RoundRobinRule 轮询规则,从服务列表中顺序获取服务

4.2 默认负载均衡策略

RoundRobinLoadBalancer,轮询策略。
默认的配置源码如下图所示,
由源码可知,默认的负载均衡策略为RoundRobinLoadBalancer。
位置:org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientConfiguration

4.3 自定义负载均衡

自定义负载均衡策略参照官方源码,
因为,当前版本的负载均衡器只有两种均衡策略,
所以,自定义的策略为随机均衡策略,
配置样例如下:

package com.monkey.tutorial.common.config;import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;/*** 负载均衡策略配置.** @author xindaqi* @since 2022-09-01 18:13*/
@Configuration
public class LoadBalancerConfig {/*** 随机负载均衡策略.** @param environment               环境配置* @param loadBalancerClientFactory 负载均衡客户端工厂* @return 随机负载均衡对象*/@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

5 小结

(1)负载均衡器:Ribbon和LoadBalancer,其中,Ribbon是Netflix开发,LoadBalancer是Spring官方的项目;
(2)Ribbon均衡器有7中均衡策略,LoadBalancer(3.0.3)有2中均衡策略;
(3)Ribbon默认均衡策略为:可用过滤规则;LoadBalancer默认策略为轮询。

再谈微服务负载均衡器:Ribbon均衡器和SpringCloud自带LoadBalancer均衡器相关推荐

  1. 微服务负载均衡器Ribbon

    微服务负载均衡器Ribbon 1.什么是Ribbon 目前主流的负载方案分为以下两种: 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 N ...

  2. 3:Alibaba微服务负载均衡器Ribbon

    Spring Cloud Alibaba系列目录 提示:这里是第三章:Alibaba微服务负载均衡器Ribbon 微服务和Spring Cloud Alibaba介绍 Alibaba微服务组件Naco ...

  3. Spring Cloud Alibaba全家桶(三)——微服务负载均衡器Ribbon与LoadBalancer

    前言 本文为 微服务负载均衡器Ribbon与LoadBalancer 相关知识,下边将对什么是Ribbon(包括:客户端的负载均衡.服务端的负载均衡.常见负载均衡算法),Nacos使用Ribbon,R ...

  4. Spring Cloud微服务再谈微服务架构(七)

    微服务架构 一.什么是微服务? 1.微服务的由来 2.为什么需要微服务 3.微服务与单体架构区别 4.微服务本质 5.什么样的项目适合微服务 6.微服务开发框架 7.什么是Spring Cloud? ...

  5. dubbo协议_阿里P8架构师谈微服务架构:Dubbo+Docker+SpringBoot+Cloud

    微服务架构 什么是微服务架构呢?简单说就是将一个完整的应用(单体应用) 按照一定的拆分规则(后文讲述)拆分成多个不同的服务,每个服务都能独立地进行开发.部署.扩展.服务于服务之间通过注入RESTful ...

  6. 常见的服务器架构入门:从单体架构、EAI 到 SOA 再到微服务和 ServiceMesh

    前言:架构的演变流程 单体架构 ==> 垂直架构 ==> 前后端分离 ==> EAI架构  ==> SOA架构 ==> 微服务 ==> 微服务2.0 1.单体架构: ...

  7. 阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解

    本文涉及的内容以及知识点如下: 1.单体架构 2.单体架构的拆分 3.SOA与微服务的区别 4.微服务的优缺点 5.微服务的消息 6.服务集成 7.数据的去中心化 单体架构 Web应用程序发展的早期, ...

  8. 浅谈微服务基建的逻辑

    2019独角兽企业重金招聘Python工程师标准>>> 起点 首先,我们得有一个"服务".根据定义,我们可以把每个服务实例都视作一个黑盒.这个盒子有着明确的输入点 ...

  9. 微服务系列:Dubbo与SpringCloud的Ribbon、Hystrix、Feign的优劣势比较

    在微服务架构中,分布式通信.分布式事务.分布式锁等问题是亟待解决的几个重要问题. Spring Cloud是一套完整的微服务解决方案,基于 Spring Boot 框架.确切的说,Spring Clo ...

  10. 最新版Spring Cloud Alibaba微服务架构-Ribbon负载均衡篇

    文章目录 前言 一.Ribbon核心概念 二.服务器端负载均衡和Riboon客户端负载均衡 1.服务器端负载均衡: 2.Riboon客户端负载均衡: 三.Ribbon策略 四.Ribbon配置使用 五 ...

最新文章

  1. VC++实现QQ聊天工具【源代码】
  2. 3.2.4 控制图层显示的范围
  3. BZOJ1036: [ZJOI2008]树的统计Count
  4. mysql半同步复制实现
  5. python多态_多态是什么?为什么要使用多态?
  6. Hadoop在MapReduce中使用压缩详解
  7. 网易容器云平台的微服务化实践
  8. linux lamp框架,LAMP架构协同应用的实例——phpMyAdmin
  9. python法则_python复数及计算法则
  10. 刘晓燕核心词汇趣讲笔记-第十七课
  11. 分布式微服框架Dubbo视频教程分享,已更新。
  12. windows10下超级好用的截屏自带快捷键
  13. 《分布式机器学习:算法、理论与实践》
  14. Android资源代码 源码 整理 Github开源项目下载地址
  15. ppt中插入html格式图表
  16. 机器学习一【决策树】
  17. python考拉兹猜想_Python练习题 042:Project Euler 014:最长的考拉兹序列
  18. 线性代数代码实现(五)求矩阵的逆(C++)
  19. 该怎么学好软件工程这门课?
  20. 【奈茶君】STM32F407驱动WS2812

热门文章

  1. Flink常用算子Transformation介绍
  2. 原来收汇宝真的是很烂
  3. RHY融获基金数字资产投资,海外扩建加速
  4. Word添加页码操作
  5. javaweb网上图书商城案例
  6. php设置pdf下载加密文件,pdf文件加密方法 PDF文件怎样加密 如何给PDF文件添加打开口令...
  7. 如何给PDF加密码保护?这3种方法总有一个能用上
  8. Java+SQLServer实现——网上图书馆借还管理系统
  9. 解决谷歌浏览器打不开
  10. 厦大计算机学硕考研难度,一个班半数考研 厦大录取仅两成 读研是鸡肋还是围城...