首页 > 其他分享 >Ribbon负载均衡原理、负载均衡策略以及懒加载

Ribbon负载均衡原理、负载均衡策略以及懒加载

时间:2024-10-08 19:22:39浏览次数:9  
标签:负载 LoadBalancerInterceptor 均衡 服务器 Ribbon 加载

目录

负载均衡流程

问题分析

执行流程

底层源码分析

进入LoadBalancerInterceptor

进入ClientHttpRequestInterceptor

重新回到LoadBalancerInterceptor

负载均衡策略

通过定义IRule实现可以修改负载均衡规则

代码方式

配置文件方式

饥饿加载

总结


负载均衡流程

问题分析

order-service向user-service发送的请求是 http://userservice/user/1,但我们发现浏览器运行根本跑不起来

就会引发一个思考,说明此地址在到达userservice之前会有一个中间件进行处理,它就是Ribbon负载均衡

执行流程

  1. order-service向Ribbon负载均衡发起请求 http://userservice/user/1
  2. Ribbon负载均衡向eureka-server拉取userservice
  3. eureka-server返回服务给Ribbon负载均衡
  4. Ribbon负载均衡发送真实请求进行轮询

底层源码分析

进入LoadBalancerInterceptor

public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {
    private LoadBalancerClient loadBalancer;
    private LoadBalancerRequestFactory requestFactory;
    ·······
}

发现LoadBalancerInterceptor实现了ClientHttpRequestInterceptor接口

进入ClientHttpRequestInterceptor

@FunctionalInterface
public interface ClientHttpRequestInterceptor {
    ClientHttpResponse intercept(HttpRequest var1, byte[] var2, ClientHttpRequestExecution var3) throws IOException;
}

发现这是一个客户端请求拦截器

重新回到LoadBalancerInterceptor

发现LoadBalancerInterceptor实现了ClientHttpRequestInterceptor接口,说明在LoadBalancerInterceptor一定实现了ClientHttpRequestInterceptor类中的intercept方法

    public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
        URI originalUri = request.getURI();
        String serviceName = originalUri.getHost();
        Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
        return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
    }

在这个方法中可以发现实现流程

  • request.getURI()获取了我们输入的路径
  • originalUri.getHost()获取了服务器的名称以及端口号
  • 将以上信息交给了loadBalancer

loadBalancer是Ribbon负载均衡客户端

  • 会把serviceId交给getLoadBalancer()方法
  • instance里面会有两个serverlist,就是我们的两个服务器地址

  • 规则会根据IRule接口拿到其中一个serverlist并调用

负载均衡策略

Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。(2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑

通过定义IRule实现可以修改负载均衡规则

代码方式

在order-service中的OrderApplication类中,定义一个新的IRule

    @Bean
    public IRule randomRule(){
        return new RandomRule();
    }

配置文件方式

在order-service的application.yml文件中,添加新的配置

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时

ribbon:
  eager-load:
    enabled: true #开启饥饿加载

总结

  • Ribbon负载均衡规则
    • 规则接口是IRule
    • 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询
  • 负载均衡自定义方式
    • 代码方式:配置灵活,但修改时需要重新打包发布
    • 配置方式:直观,方便,无需重新打包发布,但是无法做全局配置
  • 饥饿加载
    • 开启饥饿加载
    • 指定饥饿加载的微服务名称

标签:负载,LoadBalancerInterceptor,均衡,服务器,Ribbon,加载
From: https://blog.csdn.net/qq_22554999/article/details/142726052

相关文章

  • LVS负载均衡群集
    目录一、群集概述二、群集的分类1.负载均衡群集(LoadBalanceCluster)2.高可用群集(HighAvailabilityCluster)3.高性能运算群集(HighPerformanceComputerCluster)三、负载均衡的结构四、LVS负载均衡群集工作模式1.NAT地址转换2.TUNIP隧道3.DR直接路由五、LVS虚......
  • F5负载均衡系列教程九【F5日志存放目录】
     参考F5的官方文档,F5的目录存放地址如下表所示TypeDescriptionLogfileauditTheauditeventmessagesaremessagesthattheBIG-IPsystemlogsasaresultofchangestotheBIG-IPsystemconfiguration.Loggingauditeventsisoptional./var......
  • F5负载均衡系列教程七【F5高可用相关知识】
    一、failover相关知识点1、networkfailover和hardwiredfailover的区别hardwiredfailover只能用于active/standby架构,无法用于active/active架构和viprion或者F5的虚拟机中,因为这个是需要用硬件线路连接两台F5设备;networkfailover可以用于各类2台设备以上的F5双机部署中;F......
  • SpringCloud入门(四)Ribbon负载均衡
    一、Ribbon负载均衡原理SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。  SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。如下图:  基本流程如下:-拦截我们的RestTemplate请求http://userservi......
  • 土地规划与区域经济发展:筑基均衡未来的战略经纬
    在新时代背景下,土地规划不仅是空间布局的艺术,更是推动区域经济均衡发展的关键引擎。土地资源的合理配置对于激发区域潜能、促进经济结构优化有着重要意义。本文将深入剖析土地规划如何成为促进区域经济均衡发展的强大动力。一、土地规划与区域经济的内在联系土地......
  • 05-LoadBalancer负载均衡
    1.Ribbon目前也进入维护模式1.1Ribbon介绍SpringCloudRibbon是基于NetflixRibbon实现的一套客户端负载均衡的工具。简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简......
  • NAT模式 LVS负载均衡群集部署
    目录NAT模式LVS负载均衡群集部署1.关闭所有虚拟机的防火墙和核心防护2.部署共享存储nfs(ip:192.168.110.20)3.配置nginx节点服务器(192.168.110.70,192.168.110.80)4.配置tomcat节点服务器(192.168.110.50,192.168.110.60)4.配置负载调度器(内网关ens33:192.168.110.10,外网关ens......
  • 大规异构集群 混合并行分布式训练系统,解决算力不均衡问题 HETHUB
    视频教程在这:3.2大规模异构集群,混合并行分布式系统,解释算力不均衡问题HETHUB_哔哩哔哩_bilibili一、大规模异构集群出现的原因:同一种GPU数量有限难以构建大规模集群:训练大规模模型依赖于大量的计算资源。例如,训练GPT-4模型(1.8万亿个参数)需要25000个A100GPU。用一种GPU加速......
  • 负载箱:充电桩测试利器
    RCD负载箱是用于测试和验证电气设备在故障状态下的性能的设备。它可以模拟真实的负载情况,从而帮助工程师和技术人员对设备进行准确的检测和维护。此外,RCD负载箱也是一种重要的安全保护设备,主要用于防止电路中的漏电现象引发的事故。它通常被安装在电路的起始位置,作为主断路器或分......
  • 返利机器人在电商返利系统中的负载均衡实现
    返利机器人在电商返利系统中的负载均衡实现大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来聊一聊如何在电商返利系统中实现返利机器人的负载均衡,尤其是在面对高并发和大量数据处理场景时,如何通过合理的架构设计确保系统的高可用性与......