配置负载均衡 Spring Cloud Ribbon,及实现原理源码探究(一步一截图,超详细)

Ribbon是Netflix发布的负载均衡器,有助于控制HTTP客户端行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于负载均衡算法,自动帮助服务消费者请求。

Ribbon默认提供的负载均衡算法:轮询(默认)随机,重试法,加权。当然,我们可用自己定义负载均衡算法
在这里插入图片描述

负载均衡配置

注意,默认已经创建了Eureka服务,并且在其中添加了提供者user-provider和消费者user-consumer。不会的同学点这里,看我上篇博客。那么让我们开始吧。
(1)复制user-provider为user-provider到主项目中
在这里插入图片描述
但是我们可能会发现此时模块是灰的,表示Maven并没有管理此模块,我们需要做如下两步:
①将user-provider-demo1的artifactId换成user-provider-demo1
在这里插入图片描述
②加入父模块的管理
在这里插入图片描述
③别忘了修改端口号

(2)消费者user-comsumer开启负载均衡
在这里插入图片描述

(3)在消费者的Controller进行采用服务名访问配置
注意:这里必须采用服务名,而不能用IP+Port。因为由多个模块是相同的模块名,因此必须使用应用名
在这里插入图片描述
在这里插入图片描述

(4)在消费者端配置负载均衡策略,此次使用轮循模式。
在这里插入图片描述
(5)测试
①我们可以从注册中心看到服务已经启动
在这里插入图片描述

②测试轮循模式是否启用
在这里插入图片描述
在这里插入图片描述
可以看到,两次请求,提供者进行了轮循,负载均衡配置成功

负载均衡源码跟踪探究

为什么只输入了Service名称就可以访问了呢?不应该需要获取ip和端口吗?
负载均衡器动态的
从服务注册中心中获取服务提供者的访问地址
(host、port)
显然是有某个组件根据Service名称,获取了服务实例ip和端口。就是LoadBalancerInterceptor(负载均衡拦截器)

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

源码跟踪步骤:
打开LoadBalancerInterceptor 类,断点打入intercept 方法中
在这里插入图片描述
继续跟入execute方法:发现获取了18081发端口的服务在这里插入图片描述
再跟下一次,发现获取的是18081和18083之间切换
在这里插入图片描述
通过代码断点内容判断,果然是实现了负载均衡

小结

1,Ribbon的负载均衡算法应用在客户端(Http请求),只需要提供服务列表,就能帮助消费端自动访问服务端,并通过不同算法实现负载均衡。

2,Ribbon的轮询、随机算法配置:在application.yml中配置 {服务名称}.ribbon.NFLoadBalancerRuleClassName

3,负载均衡的切换:在LoadBalancerInterceptor中获取服务的名字,通过调用RibbonLoadBalancerClient的execute方法,并获取ILoadBalancer负载均衡器,然后根据ILoadBalancer负载均衡器查询出要使用的节点,再获取节点的信息,并实现调用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值