Spring Cloud之 负载均衡 Ribbon
1.什么是负载均衡 Ribbon?
Ribbon 是一个基于 Http 和 TCP 的 客服端 负载均衡工具,它是基于 Netflix Ribbon 实
现的,它不像 spring cloud 服务注册中心、配置中心、API 网关那样独立部署,但是它几乎
存在于每个 spring cloud 微服务中。
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。
2.Ribbon的作用?
解决并提供了微服务的 负载均衡
3.为甚么使用Ribbon?
当服务的访问量增大,就用上了集群的配置,可是调用者怎么知道要调用集群中的哪个服务呢,Ribbon就派上用场了。
,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。
4.什么是负载均衡?
负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。
4.1 集中式负载均衡
即在 consumer 和 provider 之间使用独立的负载均衡设施(可以是硬件,如 F5, 也可以是软件,如 nginx), 由该设施负责把 访问请求 通过某种策略转发至 provider;
4.2 进程内负载均衡
将负载均衡逻辑集成到 consumer,consumer 从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的 provider。
Ribbon 就属于后者,它只是一个类库,集成于 consumer 进程,consumer 通过它来获取到 provider 的地址。
4.3 集中式与进程内负载均衡的区别
集中式负载均衡独立于consumer与provider之间
进程内负载均衡逻辑集成到 consumer中。
5. Ribbon的使用
Ribbon 中对于集群的服务采用的负载均衡的策略默认的是轮询
5.1 创建consumer项目
5.2 修改pom.xml文件
5.3 创建全局配置文件
5.4 编写业务层代码service
5.4.1 简化service层代码
因拼接url过于麻烦,可使用@loadBlanced注解结合RestTemplate简化代码
5.4.1.1 创建配置类
5.4.1.2 修改service代码
5.5. 编写控制层代码controller
5.6 创建集群的provider项目(省略)
5.7 将 provider 打包。部署到 linux 环境中,并启动
5.8 启动consumer,进行测试
6. Ribbon 的常见负载均衡策略
6.1轮询策略(默认) RoundRobinRule
轮询策略表示每次都顺序取下一个 provider,比如一共有 5 个provider,第 1 次取第 1 个,第 2次取第 2 个,第 3 次取第 3 个,以此类推
6.2 权重轮询策略WeightedResponseTimeRule
1.根据每个 provider 的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越
低。2.原理:一开始为轮询策略,并开启一个计时器,每 30 秒收集一次每个 provider 的平均响应时间,当信息足够时,给每个 provider附上一个权重,并按权重随机选择provider,高权越重的 provider会被高概率选中。
6.3 随机策略 RandomRule
从 provider 列表中随机选择一个provider
6.4最少并发数策略 BestAvailableRule
选择正在请求中的并发数最小的 provider,除非这个provider 在熔断中。
6.5 在“选定的负载均衡策略”基础上进行重试机制 RetryRule
1.“选定的负载均衡策略”这个策略是轮询策略RoundRobinRule
2.该重试策略先设定一个阈值时间段,如果在这个阈值时间段内当选择 provider 不成功,则一直尝试采用“选定的负载均衡策略:轮询策略”最后选择一个可用的provider
6.6 可用性敏感策略 AvailabilityFilteringRule
过滤性能差的 provider,有 2种:
第一种:过滤掉在 eureka 中处于一直连接失败 provider
第二种:过滤掉高并发的 provider
6.7 区域敏感性策略 ZoneAvoidanceRule
1.以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的
provider
2.如果这个 ip 区域内有一个或多个实例不可达或响应变慢,都会降低该 ip 区域内其他 ip 被选中的权重。
7. 如何设置自定义的负载均衡,自定义的负载均衡有两种:
7.1 在配置类中定义
7.2 在全局配置文件中定义
7.3 自定义负载均衡原理
Ribbon默认的负载均衡是轮询式负载均衡策略,当容器中加载了其他的负载均衡,spring会首选其他的负载均衡策略