• 微服务【Ribbon负载均衡&源码解析&饥饿加载】第2章


    目录

    • 💂 个人主页: 爱吃豆的土豆
    • 🤟 版权: 本文由【爱吃豆的土豆】原创、在CSDN首发、需要转载请联系博主
    • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦
    • 🏆人必有所执,方能有所成!

    • 🐋希望大家多多支持😘一起进步呀!

    1,负载均衡原理

    1.1:负载均衡原理

    1.2:源码跟踪

    1)LoadBalancerIntercepor

    2)LoadBalancerClient

    3)负载均衡策略IRule

    4)总结

    1.3:负载均衡策略

    1.3.1:负载均衡策略

    1.3.2:自定义负载均衡策略

    1.4:饥饿加载


    1,负载均衡原理

    1.1:负载均衡原理

    SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的

    负载均衡流程图:

    那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢?

    具体Ribbon什么时候拦截下来的请求?什么时候从注册中心拉取下来的?什么时候做的负载均衡呢?下面我们进入idea中分析源码

    1.2:源码跟踪

    首先看到restTemplate被LoadBalanced进行标记,意思就是说

    通过restTemplate发起的请求会被LoadBalanced进行处理拦截

    那么这个拦截的动作在底层中是通过谁进行完成的呢?就是:LoadBalancerInterceptor

    1)LoadBalancerInterceptor

    首先在编辑器中Ctrl+Shift+N搜索 LoadBalancerInterceptor 该实现类

     点进去查看一下源码:该实现类实现了ClientHttpRequestInterceptor接口,那么这个接口是干嘛的呢?

      该接口是客户端请求拦截器,那么restTemplate不就是一个发Http请求的客户端嘛!被拦截

     既然实现类实现了ClientHttpRequestInterceptor接口,也实现了接口中的intercept方法,下面看一下这个方法具体在干嘛!(打个断点演示一下,图片放大更清楚)

    可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:

    • request.getURI()获取请求uri,本例中就是http://service-provide/echo/love

    • originalUri.getHost()获取uri路径的主机名,其实就是服务id,service-provide

    • this.loadBalancer.execute()处理服务id,和用户请求

    这里的this.loadBalancerLoadBalancerClient类型,我们继续跟入。  

    2)LoadBalancerClient

    继续跟入execute方法:

     跟入到此接口中:

     跟入到接口的实现类中:

     总结:

    跟踪到execute方法中,将参数服务Id传递进来交给Load Balancer函数进行处理,

    返回出:动态服务列表负载均衡器。

    这个负载均衡器是干嘛的?

    通过服务Id获取到服务注册中心的服务列表,现在这一步已经把服务拉取到了

      

    下一步进行负载均衡

    3)负载均衡策略IRule

    在刚才的代码中,可以看到获取服务使通过一个getServer方法来做负载均衡:

     我们继续跟入:

    继续跟踪源码chooseServer方法,发现这么一段代码:  

     我们看看这个rule是谁:

     对象是IRule对象,我们知道I是接口,Rule是规则,那么就是规则接口,那接口有实现类,咱们Ctrl+H查看一下继承树

     到这里,整个负载均衡的流程我们就清楚了。

    4)总结

    SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:

    基本流程如下:

    • 拦截我们的RestTemplate请求http://localhost:8071/fangwen/love

    • RibbonLoadBalancerClient会从请求url中获取服务名称

    • DynamicServerListLoadBalancer根据user-service到nacos拉取服务列表

    • nacos返回列表

    • IRule利用内置负载均衡规则,从列表中选择一个,

    • RibbonLoadBalancerClient修改请求地址,发起真实请求

    1.3:负载均衡策略

    1.3.1:负载均衡策略

    负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:

    不同规则的含义如下:

    默认的实现就是ZoneAvoidanceRule,是一种轮询方案  

    1.3.2:自定义负载均衡策略

    通过定义IRule实现可以修改负载均衡规则,有两种方式

    1. 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:

    1. @Bean
    2. public IRule randomRule(){
    3.    return new RandomRule();
    4. }

         2. 配置文件方式:在application.yml文件中,添加新的配置也可以修改规则:

    1. userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
    2. ribbon:
    3.   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

    注意,一般用默认的负载均衡规则,不做修改。

    1.4:饥饿加载

    Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。

    什么意思呢?(访问监测一下)

    第一次请求:请求耗时如此之长

     第二次请求:请求耗时很短

     为什么会有这种变化呢?

    当然导致请求耗时过长的因素有很多,在这里最重要的一个因素是Ribbon采用了懒加载。

    那么何为懒加载?

    即第一次访问时才会去创建LoadBalanceClient,去服务注册中心拉取服务,导致时间加载过长。

    为了解决第一次访问才创建LoadBalanceClient导致耗时过长,可以采用饥饿加载。

    何为饥饿加载?

    饥饿加载则会在项目启动时进行创建,降低第一次访问的耗时,通过下面配置yml文件开启饥饿加载:

    ribbon:
      eager-load:
        enabled: true   # 开启饥饿加载
        clients: userservice   # 指定对userservice这个服务饥饿加载

  • 相关阅读:
    Linux、Unix、WindowsC语言理解查看字节序排序
    操作系统——管程、死锁及其处理策略
    Spring Boot集成xstream快速入门demo
    软考-软件设计师 - 第12章 软件系统分析与设计【附补充常考知识点】
    [剑指 Offer]数组中出现次数超过一半的数字
    HarmonyOS/OpenHarmony原生应用开发-华为Serverless服务支持情况(四)
    4.2 metasploit 开发 exploit
    MonkeyRunner测试步骤
    Docker Jenkins(改错版本)
    <SQL编程工具MySQL、SQLyog安装及环境配置教程>——《SQL》
  • 原文地址:https://blog.csdn.net/m0_64550837/article/details/125548200