SpringCloud学习--- Ribbon详解
Posted 小样5411
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud学习--- Ribbon详解相关的知识,希望对你有一定的参考价值。
前言
下面学习Ribbon,Ribbon是服务与服务之间的负载均衡,画图解释
跟着学习过上一篇:Eureka就知道,上一篇讲服务注册与发现,用的是用户买了商品进行支付的例子,那支付模块对于公司无疑是十分重要模块,不可能只放在一个服务器上,肯定放在多个服务器上,这样一个支付服务宕机也不会影响用户支付,多个服务器也可以分摊用户请求压力,不让支付请求都在一个服务器上,平摊压力。那customer是如何选取多个支付模块的呢?用的什么负载均衡策略呢?
首先2个支付服务会注册到Eureka中,然后customer作为服务消费方,会拉取这注册的两个支付模块到自己缓存中,然后通过Ribbon负载均衡策略,选取哪个pay调用
注意:Ribbon是客户端负载均衡,就是customer自己来选择调用哪个pay服务,而不是又服务器(服务端)来告诉customer你应该去调哪个pay,nginx就是服务端负载均衡,用它的话,它会每次告诉customer应该去调哪个pay服务
后面会将负载均衡策略,有轮巡、随机等等
一、Ribbon负载均衡实战
最好跟着我上一篇Eureka做一遍,或者拿我上一篇最后给的代码跑一跑,因为这里还会用到之前代码
第一步:启动两个pay模块,我们只有一个,所以需要进行一些配置,变成启动两个pay
新增下面内容,加个port就能知道是哪个端口启动的
四步配置好pay 8082
这样就多了一个端口可以同时访问pay服务
输入localhost:8761
,如下
说明两个pay服务都能正常启动
第二步:配置负载均衡
由于是customer调用pay,即用户使用支付服务,所以customer要配置负载均衡策略,从而选定哪个服务
注意:spring-cloud-starter-netflix-eureka-client 已经默认集成了 spring-cloud-starter-netflix-ribbon,如果两个还一起导入会产生冲突
在eureka_client_customer模块的启动类中加上@LoadBalanced
注解
Ribbon不用再用繁琐的获取服务规则了,只要加上服务名payClient就会自动解析成对应地址
不能用下划线,所以client_customer也写成customer,下面把不用的部分注释,用payClient服务名,@LoadBalanced负载均衡会自动解析服务名变成对应的地址
重启所有服务,使得5个服务都能在Eureka看到
输入localhost:8080/customer
不断刷新8081->8082->8081->8082,负载均衡默认的是轮巡的方式,如果有三个pay,那么就会顺序且循环访问三个pay服务
二、负载均衡策略
如果想自定义负载均衡策略呢?首先我们先了解负载均衡策略有哪些,如下,有很多,但常用就四种
四种常用负载均衡策略:
1、RandomRule:随机策略
2、RoundRobbinRule:轮巡策略(默认)
3、WeightResponseTimeRule:默认采用轮巡,后续根据服务响应时间分配权重,比如响应快的就多分配些请求
4、BestAvailableRule:根据被调用方并发数最小去分配
配置负载均衡策略也有两种方式(重点)
1、采用注解形式
@Bean
public IRule robbinRule(){
return new RandomRule();
}
重启ClientCustomerApplication,策略就变成随机负载均衡,然后刷新页面可能尾号就是8081->8081->8082>8082->8081无规律随机调用服务
2、采用在yml文件中配置(推荐)
先注释之前的配置策略方式
此处我们给customer的yml文件配置,再重启,只要它能变回轮巡就说明配置成功,这里因为在本地所有响应时间基本没差别,就会采用轮巡
payClient: #指定服务名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
然后我们每次刷新都会变8081->8082->8081->8082->8081…
以上是关于SpringCloud学习--- Ribbon详解的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud学习--- Feign详解(附代码压缩包)
SpringCloud学习--- Feign详解(附代码压缩包)