Spring Cloud LoadBalancer--负载均衡的原理(源码分析)
创始人
2024-01-16 20:48:36
0

原文网址:Spring Cloud LoadBalancer--负载均衡的原理(源码分析)_IT利刃出鞘的博客-CSDN博客

简介

说明

        本文介绍Spring Cloud LoadBalancer负载均衡的原理。

        SpringCloud从2020版本开始移除了对Ribbon的依赖,官方使用Spring Cloud Loadbalancer正式替换Ribbon,而且Spring Cloud Loadbalancer成为了Spring Cloud负载均衡器的唯一实现。

        本例使用的SpringCloud版本为:2020.0.1,SpringBoot版本为:2.4.13。

Loadbalancer提供的的负载均衡策略

  • RandomLoadBalancer - 随机策略
  • RoundRobinLoadBalancer - 轮询策略(默认)

​​​​​​粉丝福利:有很多粉丝私信问我有没有面试及PDF书籍等资料,我把它们进行了整理,包含:真实面试题汇总、简历模板、PDF书籍、PPT模板等。这些是我自己也在用的资料,面试题是面试官问到我的问题的整理,其他资料也是我自用的,真正实用、靠谱。资料可以从这里免费获取:资料地址

实例代码

        本处的场景是:order(订单微服务)调用storage(库存微服务)扣减库存。

        本处只列出核心代码:依赖和feign定义,其他略。

依赖

pom.xml


4.0.0org.springframework.bootspring-boot-starter-parent2.4.13 com.knifegateway0.0.1-SNAPSHOTgatewayDemo project for Spring Boot1.8org.springframework.cloudspring-cloud-dependencies2020.0.1pomimportcom.alibaba.cloudspring-cloud-alibaba-dependencies2021.1pomimportorg.springframework.bootspring-boot-starterorg.springframework.cloudspring-cloud-starter-gatewaycom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery springframework.cloudspring-cloud-starter-netflix-ribbonorg.springframework.cloudspring-cloud-loadbalancerorg.projectlomboklombok1.18.24providedorg.springframework.bootspring-boot-maven-plugin2.4.13

feign接口

package com.knife.storage.api;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;@FeignClient("storage")
public interface StorageFeignClient {@PostMapping("/feign/storage/decreaseStorage")void decreaseStorage(@RequestParam("productId") Long productId, @RequestParam("count") Integer count);
}

原理分析

打断点

在Feign接口上打断点

到达断点,多次点击“Step Into”(跳到方法内)(我点击了15次才进去)

FeignInvocationHandler#invoke

到达feign-core包里边的:feign.ReflectiveFeign.FeignInvocationHandler#invoke

执行到最后一行(点下图红色箭头所指按钮“Step Over”(跳过),一直到最后一行)

进入到invoke方法(如下图:先点击绿色箭头按钮,再点击红色 箭头所指invoke方法)

SynchronousMethodHandler#invoke

上边点击之后,进入feign.SynchronousMethodHandler#invoke(feign-core包)。

进入到executeAndDecode方法:

SynchronousMethodHandler#executeAndDecode

上边点击之后,进入到feign.SynchronousMethodHandler#executeAndDecode(feign-core包)。

进入到client.execute方法内:

FeignBlockingLoadBalancerClient#execute

上一步点击完之后,进入org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient#execute(spring-cloud-openfeign-core包)。

其中,loadBalancerClient.choose是核心,它里边会去找一个storage实例去调用。

同样的方法,也是跳到方法内部去。

BlockingLoadBalancerClient#choose(重点)

        本方法是核心,先找到负载均衡策略,再按负载均衡策略挑选实例。

        执行到此方法(spring-cloud-loadbalancer包):

org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient#choose(java.lang.String, org.springframework.cloud.client.loadbalancer.Request)

本方法做了两件事情:找到负载均衡策略、根据负载均衡策略找到实例。

LoadBalancerClientFactory#getInstance(选策略)

执行到方法内(spring-cloud-loadbalancer包):org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory#getInstance

跳到 getInstance方法内部:

getContext的作用:根据name(本处是“storage”)找到@FeignClient标记的接口,返回Context(@LoadBalancerClient或者@LoadBalancerClients如果配置了负载均衡策略,则此处即生效)。

上图可以看到,获得到的负载均衡策略为:RoundRobinLoadBalancer(轮询负载均衡)。

我们退出方法,往下执行:

ReactiveLoadBalancer#choose(选实例)

上一步点击之后,进入到:

org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer#choose

本处的分析略。

为什么是轮询策略?

见:Spring Cloud--LoadBalancer默认的负载均衡策略_IT利刃出鞘的博客-CSDN博客

上一篇:docker 网络

下一篇:法律顾问李

相关内容

热门资讯

五年级上册数学小数乘整数说课... 五年级上册数学小数乘整数说课稿(通用6篇)  作为一位优秀的人民教师,往往需要进行说课稿编写工作,借...
《陶校长的演讲》说课稿 《陶校长的演讲》说课稿范文  作为一名老师,常常要根据教学需要编写说课稿,通过说课稿可以很好地改正讲...
新学期国旗下的演讲稿 新学期国旗下的演讲稿(精选22篇)  好的演讲稿可以引导听众,使听众能更好地理解演讲的内容。在当下社...
《小数加法和减法》说课稿 《小数加法和减法》说课稿  作为一位杰出的老师,往往需要进行说课稿编写工作,说课稿有助于提高教师理论...
《雪孩子》说课稿 《雪孩子》说课稿《雪孩子》说课稿1  一、说教材  1、教材分析  首先我对教材做简要说明。《雪孩子...
小学数学《轴对称图形》说课稿 小学数学《轴对称图形》说课稿  一、教材分析  1、教材的地位及作用  对称是数学中一个非常重要的概...
小学语文《苹果里的五角星》说... 小学语文《苹果里的五角星》说课稿  一.教材  今天我所说的是苏教版第八册《苹果里的五角星》,这是一...
关于体育节的广播稿   听,运动场上的呐喊助威声!这是运动场上洒发的凝聚力。下面为大家带来的是关于体育节的广播稿,欢迎阅...
《回忆我的母亲》说课稿 《回忆我的母亲》说课稿  作为一名优秀的教育工作者,通常会被要求编写说课稿,借助说课稿可以有效提高教...
小学评课发言稿 小学评课发言稿大家好!我是跃升里小学的xxx。我今天做的这节课是一年级《看图写话》的期末复习。看图写...
学前班的家长会发言稿 关于学前班的家长会发言稿(精选16篇)  在发展不断提速的社会中,发言稿与我们的生活息息相关,发言稿...
《燕子》的说课稿 《燕子》的说课稿(精选4篇)  作为一名优秀的教育工作者,就难以避免地要准备说课稿,编写说课稿助于积...
教师节大会校长讲话稿范文 教师节大会校长讲话稿范文  在充满活力,日益开放的今天,我们使用上讲话稿的情况与日俱增,讲话稿可以起...
我们的节日端午朗诵稿 我们的节日端午朗诵稿(精选6首)  在现在的社会生活中,大家都接触过很多优秀的朗诵稿吧,朗诵,指清清...
《超重和失重》的说课稿 《超重和失重》的说课稿  很荣幸参加了这次青年教师说课比赛。从事教师职业已经第三年,但我还是第一次参...
教师节经典朗诵稿   教师节朗诵稿(单人版)  金风送欢笑,丹桂花香飘。  老师的节日,今天又来到。  老师为我们的成...
开学典礼校长讲话稿 开学典礼校长讲话稿  开学了,又是一个新起点,新学期是我们人生里程碑上的一个加油站。以下是小编帮大家...
小学数学平移和旋转说课稿 小学数学平移和旋转说课稿  一、说教材  1、学情及教学内容简析:  平移和旋转是两种基本的图形变换...
数学赛课的通讯稿 数学赛课的三篇通讯稿  数学赛课通讯稿篇一:公开课通讯稿  十月的天空格外的清爽,暖暖的阳光洒在身上...
一个数除以分数说课稿 一个数除以分数说课稿  作为一无名无私奉献的教育工作者,就有可能用到说课稿,通过说课稿可以很好地改正...