SpringCloud学习(2)--- Ribbon详解

目录

    • 前言
    • 一、Ribbon负载均衡实战
    • 二、负载均衡策略

前言

上一篇Eureka详解链接

下面学习Ribbon,Ribbon是服务与服务之间的负载均衡,画图解释
SpringCloud学习(2)--- Ribbon详解_第1张图片
跟着学习过上一篇:Eureka就知道,上一篇讲服务注册与发现,用的是用户买了商品进行支付的例子,那支付模块对于公司无疑是十分重要模块,不可能只放在一个服务器上,肯定放在多个服务器上,这样一个支付服务宕机也不会影响用户支付,多个服务器也可以分摊用户请求压力,不让支付请求都在一个服务器上,平摊压力。那customer是如何选取多个支付模块的呢?用的什么负载均衡策略呢?

首先2个支付服务会注册到Eureka中,然后customer作为服务消费方,会拉取这注册的两个支付模块到自己缓存中,然后通过Ribbon负载均衡策略,选取哪个pay调用

注意:Ribbon是客户端负载均衡,就是customer自己来选择调用哪个pay服务,而不是又服务器(服务端)来告诉customer你应该去调哪个pay,nginx就是服务端负载均衡,用它的话,它会每次告诉customer应该去调哪个pay服务
SpringCloud学习(2)--- Ribbon详解_第2张图片
SpringCloud学习(2)--- Ribbon详解_第3张图片
后面会将负载均衡策略,有轮巡、随机等等

一、Ribbon负载均衡实战

最好跟着我上一篇Eureka做一遍,或者拿我上一篇最后给的代码跑一跑,因为这里还会用到之前代码

第一步:启动两个pay模块,我们只有一个,所以需要进行一些配置,变成启动两个pay
SpringCloud学习(2)--- Ribbon详解_第4张图片
新增下面内容,加个port就能知道是哪个端口启动的
SpringCloud学习(2)--- Ribbon详解_第5张图片
四步配置好pay 8082
SpringCloud学习(2)--- Ribbon详解_第6张图片
这样就多了一个端口可以同时访问pay服务
SpringCloud学习(2)--- Ribbon详解_第7张图片

输入localhost:8761,如下
SpringCloud学习(2)--- Ribbon详解_第8张图片

SpringCloud学习(2)--- Ribbon详解_第9张图片
说明两个pay服务都能正常启动

第二步:配置负载均衡
由于是customer调用pay,即用户使用支付服务,所以customer要配置负载均衡策略,从而选定哪个服务

注意:spring-cloud-starter-netflix-eureka-client 已经默认集成了 spring-cloud-starter-netflix-ribbon,如果两个还一起导入会产生冲突

在eureka_client_customer模块的启动类中加上@LoadBalanced注解
SpringCloud学习(2)--- Ribbon详解_第10张图片
Ribbon不用再用繁琐的获取服务规则了,只要加上服务名payClient就会自动解析成对应地址
SpringCloud学习(2)--- Ribbon详解_第11张图片
不能用下划线,所以client_customer也写成customer,下面把不用的部分注释,用payClient服务名,@LoadBalanced负载均衡会自动解析服务名变成对应的地址
SpringCloud学习(2)--- Ribbon详解_第12张图片

重启所有服务,使得5个服务都能在Eureka看到
SpringCloud学习(2)--- Ribbon详解_第13张图片
输入localhost:8080/customer

SpringCloud学习(2)--- Ribbon详解_第14张图片
不断刷新8081->8082->8081->8082,负载均衡默认的是轮巡的方式,如果有三个pay,那么就会顺序且循环访问三个pay服务

二、负载均衡策略

如果想自定义负载均衡策略呢?首先我们先了解负载均衡策略有哪些,如下,有很多,但常用就四种
SpringCloud学习(2)--- Ribbon详解_第15张图片
四种常用负载均衡策略
1、RandomRule:随机策略
2、RoundRobbinRule:轮巡策略(默认
3、WeightResponseTimeRule:默认采用轮巡,后续根据服务响应时间分配权重,比如响应快的就多分配些请求
4、BestAvailableRule:根据被调用方并发数最小去分配

配置负载均衡策略也有两种方式(重点)
1、采用注解形式
SpringCloud学习(2)--- Ribbon详解_第16张图片

@Bean
public IRule robbinRule(){
   return new RandomRule();
}

重启ClientCustomerApplication,策略就变成随机负载均衡,然后刷新页面可能尾号就是8081->8081->8082>8082->8081无规律随机调用服务

2、采用在yml文件中配置推荐
先注释之前的配置策略方式
SpringCloud学习(2)--- Ribbon详解_第17张图片

此处我们给customer的yml文件配置,再重启,只要它能变回轮巡就说明配置成功,这里因为在本地所有响应时间基本没差别,就会采用轮巡

payClient:  #指定服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

然后我们每次刷新都会变8081->8082->8081->8082->8081…

配置过程中可能遇到的问题与解决方法

参考视频:https://www.bilibili.com/video/BV15e411W75G

你可能感兴趣的