首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2023年11月 Java教学课程 185-SpringCloud(Ribbon负载均衡)

【愚公系列】2023年11月 Java教学课程 185-SpringCloud(Ribbon负载均衡)

作者头像
愚公搬代码
发布2025-06-02 14:26:02
发布2025-06-02 14:26:02
10400
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。 🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

微服务负载均衡是指在微服务架构中,将请求分发给多个服务实例,以平衡负载和提高可靠性的技术。在微服务架构中,一个应用通常由多个微服务组成,每个微服务都是独立的、可扩展的,并且可以部署多个实例以处理更多的请求。微服务负载均衡通过将请求分配给最合适的服务实例来实现负载均衡,并通过健康检查和自动故障转移来提高可靠性。常见的微服务负载均衡算法包括轮询、随机、哈希和最少连接等。

🚀一、Ribbon负载均衡

🔎1.负载均衡原理

Ribbon是Netflix开源的一个负载均衡框架,它可以将客户端的请求自动转发到多个服务实例中,从而实现服务的负载均衡。

Ribbon的负载均衡算法主要包括两个部分:服务列表的获取和请求到服务实例的路由。

  1. 服务列表的获取

Ribbon通过Eureka、Consul等注册中心获取服务实例列表,并通过定时刷新的方式保持列表的实时性。Ribbon还支持手动定义服务列表,以便进行测试或者调试。

  1. 请求到服务实例的路由

在获取到服务实例列表之后,Ribbon使用负载均衡算法将请求路由到其中一个服务实例。Ribbon支持多种负载均衡算法,包括轮询、加权轮询、随机、最少连接等。

在路由请求时,Ribbon还支持多种策略,包括重试、熔断等,从而保证了服务的稳定性和健壮性。

Ribbon通过获取服务实例列表和路由请求的方式实现了服务的负载均衡,并通过多种策略保障了服务的稳定性和可靠性。

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

🔎2.源码跟踪

LoadBalancerInterceptor,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

🦋2.1 LoadBalancerIntercepor

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

  • request.getURI():获取请求uri,本例中就是 http://user-service/user/8
  • originalUri.getHost():获取uri路径的主机名,其实就是服务id,user-service
  • this.loadBalancer.execute():处理服务id,和用户请求。
🦋2.2 LoadBalancerClient

继续跟入execute方法:

代码是这样的:

  • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。
  • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。本例中,可以看到获取了8082端口的服务

放行后,再次访问并跟踪,发现获取的是8081:

🦋2.3 负载均衡策略IRule

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

我们继续跟入:

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

我们看看这个rule是谁:

这里的rule默认值是一个RoundRobinRule,看类的介绍:

其实这就是轮询算法实现负载均衡。

🦋2.4 总结

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

基本流程如下:

  • 拦截我们的RestTemplate请求http://userservice/user/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
  • DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

🔎3.负载均衡策略

🦋3.1 负载均衡策略

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

不同规则的含义如下:

内置负载均衡规则类

规则描述

RoundRobinRule

简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。

AvailabilityFilteringRule

对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。

WeightedResponseTimeRule

为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。

ZoneAvoidanceRule

以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。

BestAvailableRule

忽略那些短路的服务器,并选择并发数较低的服务器。

RandomRule

随机选择一个可用的服务器。

RetryRule

重试机制的选择逻辑

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

🦋3.2 自定义负载均衡策略

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

  1. 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
代码语言:javascript
代码运行次数:0
运行
复制
@Bean
public IRule randomRule(){
    return new RandomRule();
}
  1. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
代码语言:javascript
代码运行次数:0
运行
复制
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

或者在启动类中使用

代码语言:javascript
代码运行次数:0
运行
复制
@RibbonClient(name="EUREKA-PROVIDER",configuration = MyRule.class)

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

🔎4.饥饿加载

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

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

代码语言:javascript
代码运行次数:0
运行
复制
ribbon:
  eager-load:
    enabled: true
    clients: userservice

🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀前言
  • 🚀一、Ribbon负载均衡
    • 🔎1.负载均衡原理
    • 🔎2.源码跟踪
      • 🦋2.1 LoadBalancerIntercepor
      • 🦋2.2 LoadBalancerClient
      • 🦋2.3 负载均衡策略IRule
      • 🦋2.4 总结
    • 🔎3.负载均衡策略
      • 🦋3.1 负载均衡策略
      • 🦋3.2 自定义负载均衡策略
    • 🔎4.饥饿加载
  • 🚀感谢:给读者的一封信
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档