Ribbon负载均衡

Ribbon负载均衡

负载均衡原理

springcloud底层利用Ribbon来实现的负载均衡。以Eureka为例,当发起一个请求的时候,Ribbon会将该请求拦截下来,然后根据请求的服务名去Eureka的服务端获取服务列表,然后根据负载均衡策略选择合适的服务进行访问。

image-20240801231332885

接下来对源码进行追踪看RIbbon是如何实现负载均衡的

源码追踪

当在浏览器发起请求的时候,代码内部通过RestTemplate发起Http请求:http://userservice/user/1

image-20240730222505520

双击shift搜索到LoadBalancerInterceptor,在下图中位置打上断点,然后往下进行,会发现执行进入了LoadBalancerInterceptor

在这里插入图片描述

从图片可以看到这个intercept方法拦截了用户的HttpRequest请求,然后进行了如下操作:

  1. request.getURI()从HttpRequest中获取到了该请求的URI

    在这里插入图片描述

  2. originalUri.getHost()从获取到的URI中获取到host,即服务名称。

  3. this.loadBalancer.execute()在该方法中处理服务名称和用户的请求。

image-20240801193707427

如上图可知this.loadBalancer.executeLoadBalancerClient类型,点击LoadBalancerClient继续跟入:

image-20240801211337958

按住Ctrl点击鼠标右键然后选择如图蓝色的实现类:

image-20240801211441076

进去之后如图打上断点:

在这里插入图片描述

继续往下执行,代码会进到该方法,其中对6364行代码解释如下:

image-20240801212454893

  • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。运行到63行后点击下图蓝色字样可以看到如下信息,其中LAPTOP-GLM61P9G为主机名,相当于127.0.0.1

    image-20240801213538509

  • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。如下图可以看到选择了8081端口的服务:

    image-20240801214212623

放行再次访问会发现访问的端口会变成8082,故此实现了负载均衡。

getServer进行负载均衡:

接下来我们继续看getServer这个方法是如何来做负载均衡的:

按住Ctrl点击getServer方法跳转到该方法所在位置:
image-20240801215009465

继续按住Ctrl点击chooseServer跟入:

在这里插入图片描述

点击框中标志选择第一个点击进入:

image-20240801215252904

可以看到跳转到了如下图中代码的位置,其中红框中的位置负责进行服务的选择:

image-20240801215741896

按住Ctrl点击rule,跳转到定义rule的地方:

image-20240801221646626

在这里插入图片描述

结合上面两张图片可以看到这里的rule默认值是一个RoundRobinRuleRoundRobinRule就是轮询的意思。

到此整个负载均衡的流程就清楚了。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值