SpringCloud-Alibaba学习(四):Ribbon负载均衡
2022/7/1 23:20:53
本文主要是介绍SpringCloud-Alibaba学习(四):Ribbon负载均衡,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- Ribbon负载均衡
- 1、简介
- 2、Ribbon 使用
- 3、Ribbon 工作流程
- 4、Ribbon 源码了解
- 5、Ribbon 的负载均衡策略
- 切换 Ribbon 默认的负载均衡策略
Ribbon负载均衡
1、简介
Ribbon
是 Netflix 公司开源的一个负载均衡的项目,是客户端负载均衡器,运行在客户端上。
用于解决服务实例列表在调用时的负载均衡的问题。
2、Ribbon 使用
前篇 nacos 实例中有相关集成:https://www.cnblogs.com/liuyiyuan/p/16421731.html#325-远程调用
第一步:pom 依赖
SpringCloud 已经依赖了 Ribbon
第二步:@LoadBalance 注解
通过 Spring Cloud 原生注解 @EnableDiscoveryClient
开启服务注册发现,再给RestTemplate
实例添加 @LoadBalance
注解,开启与 Ribbon
的集成,代码中无感知。
@Bean @LoadBalanced // 使Ribbon生效 public RestTemplate restTemplate() { return new RestTemplate(); }
3、Ribbon 工作流程
4、Ribbon 源码了解
LoadBalancerAutoConfiguration
自动注入拦截器
进入 LoadBalancerInterceptor
@Override public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException { final URI originalUri = request.getURI(); // 从请求中获取 URI String serviceName = originalUri.getHost(); // 获取 host 作为服务名 Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri); return this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution)); }
查看 this.loadBalancer.execute
方法
会进入 RibbonLoadBalancerClient#execute
方法
public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint) throws IOException { ILoadBalancer loadBalancer = getLoadBalancer(serviceId); // 获取实例列表,serviceId就是服务名 Server server = getServer(loadBalancer, hint); // 对实例列表进行负载均衡获取到一个server if (server == null) { throw new IllegalStateException("No instances available for " + serviceId); } RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server, serviceId), serverIntrospector(serviceId).getMetadata(server)); return execute(serviceId, ribbonServer, request); }
方法 getLoadBalancer(serviceId)
会创建负载均衡器 ZoneAwareLoadBalancer
方法 getServer(loadBalancer, hint)
内部调用 ZoneAwareLoadBalancer#chooseServer
,再调用父类方法即BaseLoadBalancer#chooseServer
,根据负载均衡策略获取具体的 Server
5、Ribbon 的负载均衡策略
Ribbon 的负载均衡策略核心组件是 IRule,根据特定算法从服务列表中选取一个需要访问的服务;
其中 IRule 是一个接口,有七个自带的实现,可以实现不同的负载均衡策略
策略类 | 策略描述 |
---|---|
BestAvailableRule | 选择并发请求最少的server |
AvailabilityFilteringRule | 先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发连接数超过阈值的服务,然后对剩余服务进行轮询 |
WeightedResponseTimeRule | 根据平均响应时间计算服务权重,若统计信息不足则安装轮询规则,统计信息足够后按照响应时间选择服务 |
RetryRule | 正常时按照轮询选择服务,有服务出现故障时,在轮询一定次数后依然故障,则会跳过故障的服务继续轮询 |
RoundRobinRule | 轮询规则 |
RandomRule | 随机规则 |
ZoneAvoidanceRule | 默认策略,加了一些过滤条件,过滤成功后继续采用轮询方式选择服务 |
切换 Ribbon 默认的负载均衡策略
Ribbon 是客户端的负载均衡器,所以策略要配置到服务消费方上。
配置类,注意这个配置类不需要 Spring 的扫描自动注入
public class RibbonRuleConfig { @Bean public IRule rule() { return new RandomRule(); } }
启动类上添加注解,指定上面的配置类
// name为要调的微服务名称,configuration指定策略配置类 @RibbonClient(name = "ribbon-provider", configuration = RibbonRuleConfig.class)
这篇关于SpringCloud-Alibaba学习(四):Ribbon负载均衡的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南