Spring Cloud:使用Ribbon实现负载均衡详解(下)

简介: Spring Cloud:使用Ribbon实现负载均衡详解(下)

在上一篇文章(Spring Cloud:使用Ribbon实现负载均衡详解(上))中,我对 Ribbon 做了一个介绍,Ribbon 可以实现直接通过服务名称对服务进行访问。这一篇文章我详细分析一下如何使用 Ribbon 实现客户端的负载均衡。


1. 使用 Ribbon 实现负载均衡


要实现负载均衡,首先要有多个订单服务提供者,目前我们就一个 microservice-order-provider01,端口号 8001,我们可以仿照这个服务,再创建两个子模块,也是订单服务提供者,取名为 microservice-order-provider02,端口号 8002 和 microservice-order-provider03,端口号 8003。

现在三个订单服务有了,再加上 Ribbon 和 Eureka 集群后,系统的架构如下:

Ribbon 是客户端的负载均衡工具,它在服务的消费方,首先三个订单服务 8001、8002 和 8003 都会注册到 Eureka 集群,Ribbon 会先从 Eureka 集群(7001、7002 和 7003)中查询可用的服务列表,然后根据 Ribbon 提供的负载均衡算法,负载均衡的请求可用的订单服务。

Ribbon 默认的负载均衡算法是轮询,也就是按顺序挨个的调用。我们先来搭建一下整个服务架构,上面提到了,首先要拷贝两个订单服务,端口号分别为 8002 和 8003,一起来对比看下三个订单服务的配置文件。

8001 端口的订单服务配置:

# 服务端口号
server:
 port: 8001
# 数据库地址
datasource:
 url: localhost:3306/microservice01
# 省略数据库的基本配置
spring:
 application:
   name: microservice-order # 对外暴露的服务名称
# 客户端注册进eureka服务列表里
eureka:
 client:
   service-url:
     defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/,
 instance:
   instance-id: 书籍订单服务-8001  # 人性化显示出服务的信息
   prefer-ip-address: true    # 访问路径可显示ip地址

8002 端口的订单服务配置:

# 服务端口号
server:
 port: 8002
# 数据库地址
datasource:
 url: localhost:3306/microservice02
# 数据库基本配置省略
spring:
 application:
   name: microservice-order # 对外暴露的服务名称
# 客户端注册进eureka服务列表里
eureka:
 client:
   service-url:
     defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/,
 instance:
   instance-id: 书籍订单服务-8002  # 人性化显示出服务的信息
   prefer-ip-address: true    # 访问路径可显示ip地址

8003 端口的订单服务配置:

# 服务端口号
server:
 port: 8003
# 数据库地址
datasource:
 url: localhost:3306/microservice03
# 数据库基本配置省略
spring:
 application:
   name: microservice-order # 对外暴露的服务名称
# 客户端注册进eureka服务列表里
eureka:
 client:
   service-url:
     defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/,
 instance:
   instance-id: 书籍订单服务-8003  # 人性化显示出服务的信息
   prefer-ip-address: true    # 访问路径可显示ip地址

对比后发现,有几个地方需要注意:

  • 对外暴露的服务名称必须要相同,因为都是同一个服务,只不过有多个而已,因为接下来Ribbon是通过服务名来调用服务的;
  • 每个服务连接了不同的数据库,这样用来区分不同的服务,便于测试,实际中也可能是便于维护;
  • 每个服务的个性化名称展示可以区分一下,这样在eureka里可以很好的辨别出来

Eureka 集群还是使用前面的 7001、7002 和 7003,首先我们启动 Eureka 集群,然后分别启动 8001、8002 和 8003 三个订单服务。(友情提示:这里已经启动了6个工程了,如果电脑的性能跟不上的话,可能已经开始卡顿了)。

启动了之后,可以访问下 eureka01:7001,看下三个订单服务是否正常注册到 eureka 集群里。如下图,说明集群和订单服务均正常。

OK,接下来就是重点了,我们启动服务消费方,也就是上一节中的订单消费服务,然后在浏览器输入 http://localhost:9001/consumer/order/get/1 即可查询到对应的订单服务:

{"id":1,"name":"跟武哥一起学 Spring Boot","price":39.99,"dbSource":"microservice03"}

刷新页面,可以看到,结果如下:

{"id":1,"name":"跟武哥一起学 Spring Boot","price":39.99,"dbSource":"microservice01"}

再刷新页面,可以看到,结果如下:

{"id":1,"name":"跟武哥一起学 Spring Boot","price":39.99,"dbSource":"microservice02"}

可以看到,dbsource的值一在 microservice01、microservice02 和 microservice03 之间轮询切换(这个值是我在三个数据库中设置的不同的值,就是为了在这展示,方便看到效果),这就说明了,Ribbon 的负载均衡已经起作用了,客户端会轮询的根据服务名,从 8001、8002 和 8003 之间切换访问,从而达到负载均衡的效果。

同时,也可以看到,Ribbon 的默认负载均衡算法是轮询。


2. 如何指定 Ribbon 的负载均衡策略


由上面的结果可知,Ribbon 默认的策略是轮询,那么 Ribbon 除了轮询,还有哪些负载均衡的策略呢?我们如何去设置自己想要的策略呢?

Ribbon 自带的负载均衡策略有如下几个:

  • RoundRibbonRule:轮询。人人有份,一个个来!
  • RandomRule:随机。拼人品了!
  • AvailabilityFilteringRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发连接数超过阈值的服务,剩下的服务,使用轮询策略。
  • WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应越快的服务权重越高,越容易被选中。一开始启动时,统计信息不足的情况下,使用轮询。
  • RetryRule:先轮询,如果获取失败则在指定时间内重试,重新轮询可用的服务。
  • BestAvailableRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务。
  • ZoneAvoidanceRule:复合判断 server 所在区域的性能和 server 的可用性选择服务器

如何指定 Ribbon 自带的负载均衡策略呢?我们需要在配置类中指定一下即可,如下:

/**
* 配置RestTemplate
* @author shengwu ni
*/
@Configuration
public class RestTemplateConfig {
   /**
    * '@LoadBalanced'注解表示使用Ribbon实现客户端负载均衡
    * @return RestTemplate
    */
   @Bean
   @LoadBalanced
   public RestTemplate getRestTemplate() {
       return new RestTemplate();
   }
   /**
    * 指定其他负载均衡策略
    * @return IRule
    */
   @Bean
   public IRule myRule() {
       // 指定重试策略:先轮询,若获取失败则在指定时间内重试,重新轮询可用的服务。
       return new RetryRule();
   }
}

我们可以 new 出以上对应的策略,来实现对应的负载均衡,读者可以 new RandomRule() 测试一下随机策略,然后重复刷新上面的测试地址,可以发现是随机请求三个服务。其他的策略,读者可以自行尝试一下。


相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1月前
|
负载均衡 Java API
Spring Cloud 面试题及答案整理,最新面试题
Spring Cloud 面试题及答案整理,最新面试题
138 1
|
1月前
|
Java Nacos Sentinel
Spring Cloud Alibaba 面试题及答案整理,最新面试题
Spring Cloud Alibaba 面试题及答案整理,最新面试题
212 0
|
1月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
158 0
|
2天前
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
|
3天前
|
负载均衡 算法
SpringCloud&Ribbon负载均衡原理与实践
SpringCloud&Ribbon负载均衡原理与实践
10 3
|
3天前
|
Java API Nacos
第十二章 Spring Cloud Alibaba Sentinel
第十二章 Spring Cloud Alibaba Sentinel
16 0
|
4天前
|
监控 Java 微服务
第八章 Spring Cloud 之 Hystrix
第八章 Spring Cloud 之 Hystrix
|
4天前
|
监控 Java API
第七章 Spring Cloud 之 GateWay
第七章 Spring Cloud 之 GateWay
10 0
|
4天前
|
负载均衡 前端开发 Java
第六章 Spring Cloud 之 OpenFeign
第六章 Spring Cloud 之 OpenFeign
|
4天前
|
消息中间件 Java Nacos
第三章 Spring Cloud简介
第三章 Spring Cloud简介
12 0