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

简介: 本文主要介绍:1,Ribbon负载均衡原理 2,源码跟踪 3,负载均衡策略 4,饥饿加载

1,负载均衡原理

1.1:负载均衡原理

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

负载均衡流程图:

image.gif编辑

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

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

1.2:源码跟踪

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

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

image.gif编辑

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

1)LoadBalancerInterceptor

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

image.gif编辑

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

image.gif编辑

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

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

image.gif编辑

可以看到这里的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方法:

    image.gif编辑

    跟入到此接口中:

    image.gif编辑

    跟入到接口的实现类中:

    image.gif编辑

    总结:

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

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

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

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

    image.gif编辑  

    下一步进行负载均衡

    3)负载均衡策略IRule

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

    image.gif编辑

    我们继续跟入:

    image.gif编辑

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

    image.gif编辑

    我们看看这个rule是谁:

    image.gif编辑

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

    image.gif编辑

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

    4)总结

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

    image.gif编辑

    基本流程如下:

      • 拦截我们的RestTemplate请求http://localhost:8071/fangwen/love
      • RibbonLoadBalancerClient会从请求url中获取服务名称
      • DynamicServerListLoadBalancer根据user-service到nacos拉取服务列表
      • nacos返回列表
      • IRule利用内置负载均衡规则,从列表中选择一个,
      • RibbonLoadBalancerClient修改请求地址,发起真实请求

      1.3:负载均衡策略

      1.3.1:负载均衡策略

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

      image.gif编辑

      不同规则的含义如下:

      image.gif编辑

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

      1.3.2:自定义负载均衡策略

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

        1. 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
        @Bean
        public IRule randomRule(){
            return new RandomRule();
        }

        image.gif

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

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

        image.gif

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

        1.4:饥饿加载

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

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

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

        image.gif编辑

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

        image.gif编辑

        为什么会有这种变化呢?

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

        那么何为懒加载?

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

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

        何为饥饿加载?

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

        ribbon:

         eager-load:

           enabled: true   # 开启饥饿加载

           clients: userservice   # 指定对userservice这个服务饥饿加载

        相关实践学习
        每个IT人都想学的“Web应用上云经典架构”实战
        本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
        相关文章
        |
        运维 持续交付 云计算
        深入解析云计算中的微服务架构:原理、优势与实践
        深入解析云计算中的微服务架构:原理、优势与实践
        764 86
        |
        9月前
        |
        存储 Java 文件存储
        微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
        本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `<appender>` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `<logger>` 和 `<root>` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
        2259 1
        |
        8月前
        |
        弹性计算 负载均衡 网络协议
        阿里云SLB深度解析:从流量分发到架构优化的技术实践
        本文深入探讨了阿里云负载均衡服务(SLB)的核心技术与应用场景,从流量分配到架构创新全面解析其价值。SLB不仅是简单的流量分发工具,更是支撑高并发、保障系统稳定性的智能中枢。文章涵盖四层与七层负载均衡原理、弹性伸缩引擎、智能DNS解析等核心技术,并结合电商大促、微服务灰度发布等实战场景提供实施指南。同时,针对性能调优与安全防护,分享连接复用优化、DDoS防御及零信任架构集成的实践经验,助力企业构建面向未来的弹性架构。
        735 76
        |
        运维 监控 持续交付
        微服务架构解析:跨越传统架构的技术革命
        微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
        3351 36
        微服务架构解析:跨越传统架构的技术革命
        |
        10月前
        |
        传感器 监控 安全
        智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
        慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
        540 1
        |
        弹性计算 持续交付 API
        构建高效后端服务:微服务架构的深度解析与实践
        在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
        |
        存储 监控 API
        深入解析微服务架构及其在现代应用中的实践
        深入解析微服务架构及其在现代应用中的实践
        393 12
        |
        负载均衡 Java 持续交付
        深入解析微服务架构中的服务发现与负载均衡
        深入解析微服务架构中的服务发现与负载均衡
        693 7
        |
        Kubernetes Java 微服务
        微服务上下线动态感知实现的技术解析
        随着微服务架构的广泛应用,服务的动态管理和监控变得尤为重要。在微服务架构中,服务的上下线是一个常见的操作,如何实时感知这些变化,确保系统的稳定性和可靠性,成为了一个关键技术挑战。本文将深入探讨微服务上下线动态感知的实现方式,从技术基础、场景案例、解决思路和底层原理等多个维度进行阐述,并分别使用Java和Python进行演示介绍。
        337 4
        |
        负载均衡 算法 Java
        除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
        这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
        1130 61

        推荐镜像

        更多
      1. DNS