SpringCloud 整合Ribbon/LoadBalancer负载均衡
简介:负载均衡(Load Balance)就是将用户的请求平均的分配到多个服务上,从而达到系统的高可用,它是一种算法,可以通过该算法实现从地址列表中获取一个地址进行服务调用,LB实现方式包含集中式(在消费者和服务提供方中间使用独立的代理方式进行负载均衡)和进程内(根据自己的请求情况做负载均衡)两种。
一、Ribbon
简介:Ribbon用于实现软负载均衡,核心三点:服务发现,发现依赖服务的列表、服务选择规则,在多个服务中如何选择一个有效服务、服务监听,检测失效的服务,高效剔除失效服务。
1. Ribbon与Nginx比较
A. Nginx:服务器负载均衡,客户端所有请求都会交给Nginx,然后Nginx实现转发请求,属于集中式实现负载均衡;
B. Ribbon:本地负载均衡,在调用微服务接口的时候,会在注册中心上获取注册信息服务列表后缓存到本地,从而在本地实现RPC远程服务调用,属于进程内实现负载均衡。
2. pom.xml Maven依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
3. application.yml 文件配置
ribbon: # 全局连接超时时间(使用url路由方式配置不生效) ConnectTimeout: 5000 # 全局请求超时时间(使用url路由方式配置不生效) ReadTimeout: 15000 # 同一台实例最大重试次数,不含首次调用 MaxAutoRetries: 0 # 重试负载均衡其他实例的最大重试次数,不含首次调用 MaxAutoRetriesNextServer: 0
Ribbon总时间ribbonTimeout = (ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * (ribbon.MaxAutoRetriesNextServer + 1);其中histry的timeoutInMilliseconds值应大于或等于ibbonTimeout,否则出现下面错误。
o.s.c.n.z.f.r.s.AbstractRibbonCommand : The Hystrix timeout of 15000ms for the command *** is set lower than the combination of the Ribbon read and connect timeout, 20000ms
4. Ribbon注解
A. @LoadBalanced:启动Ribbon的负载均衡策略;
B. @RibbonClient(name = "service-name", configuration = RuleConfig.class):自定义负载均衡策略;
name —— 服务名称
configuration —— 负载均衡配置类
C. @RibbonClients(defaultConfiguration = RuleConfig.class):全局配置自定义负载均衡策略
defaultConfiguration —— 负载均衡配置类
5. Ribbon核心类组成
接口 | 作用 | 默认值 |
IClientConfig | 读取配置 | DefaultClientConfigImpl |
IRule | 负载均衡规则,选择实例 | ZoneAvoidanceRule |
IPing | 筛选ping不通的实例 | DummyPing |
ServerList <Sever> | 交给Ribbon的实例列表 | ConfigurationBaseServerList |
ServerListFilter <Sever> | 过滤掉不符合条件的实例 | ZonePreferenceServerListFilter |
ILoadBalancer | Ribbon的入口 | ZoneAwareLoadBalancer |
ServerListUpdater | 更新交给Ribbon的List的策略 | PollingServerListUpdater |
6. Ribbon负载均衡策略
默认是ZoneAvoidanceRule,它是一个按照地域方式来进行负载均衡,但是在没有zone的情况下就是轮询(RoundRobinRule)。
负载均衡规则类 | 作用 |
RoundRobinRule | 轮询选择, 轮询index,选择index对应位置的Server |
AvailabilityFilteringRule | 过滤掉那些一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态 |
WeightedResponseTimeRule | 根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低 |
ZoneAvoidanceRule | 复合判断Server所在区域的性能和Server的可用性选择Server |
BestAvailableRule | 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过 |
RandomRule | 随机选择一个Server |
RetryRule | 对选定的负载均衡策略上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server |
7. 实现负载均衡的方式
Eureka中已经集成了Ribbon,所以无需引入新的依赖;如果两种方式都配置,则以java代码配置为准。
A. 基于application.yml配置文件
# service-name代表服务名称 service-name: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
B. 基于java代码
会引起父子上下文扫描重叠问题,这个会导致事务失效,解决方案是规则的定义(放在启动类之外的包目录下)和引入分开写隔离。可参考:Spring父子上下文重叠
package com.ruhaunxingyun.ribbon; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @description: 自定义负载均衡策略 * @author: ruphie * @date: Create in 2020/8/16 13:56 * @company: ruhuanxingyun */ @Configuration public class RuleConfig { @Bean public IRule myRule() { return new RandomRule(); } }
C. 两种方式的对比:代码配置优点是灵活,但存在上下文重叠的问题,修改以后需要重新打包;配置文件配置容易上手,配置更加直观,线上修改无需重新打包,发布优先级更高,缺点是若自定义规则需要代码配置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗