在上一篇文章(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@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}/*** 指定其他负载均衡策略* @return IRule*/@Beanpublic IRule myRule() {// 指定重试策略:先轮询,若获取失败则在指定时间内重试,重新轮询可用的服务。return new RetryRule();}
}
复制代码

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

转载于:https://juejin.im/post/5d009834f265da1ba77c9ca3

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

  1. Spring Cloud Netfilx Ribbon(负载均衡工具)

    一.介绍 Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的 ...

  2. spring python负载均衡_Spring Cloud:使用Ribbon实现负载均衡详解(上)

    1. 什么是 Ribbon? Spring Cloud Ribbon 是一套实现客户端负载均衡的工具.注意是客户端,当然也有服务端的负载均衡工具,我们后面再介绍.可以认为 Ribbon 就是一个负载均 ...

  3. Nginx代理功能与负载均衡详解

    序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...

  4. 大型网站系统架构系列:负载均衡详解(一)

    大型网站系统架构系列:负载均衡详解(一) 2016-03-20 架构说 面对大量用户访问.高并发请求,海量数据,可以使用高性能的服务器.大型数据库,存储设备,高性能Web服务器,采用高效率的编程语言比 ...

  5. Kubernetes上的负载均衡详解

    如果您的应用程序是面向大量用户.会吸引大量流量,那么一个不变的目标一定是在高效满足用户需求的同时.不让用户感知到任何类似于"服务器繁忙!"的情况.这一诉求的典型解决方案是横向扩展部 ...

  6. 大型网站架构系列:负载均衡详解(3)

    本次分享大纲 软件负载均衡概述 Ngnix负载均衡 Lvs负载均衡 Haproxy负载均衡 本次分享总结 一.软件负载均衡概述 硬件负载均衡性能优越,功能全面,但是价格昂贵,一般适合初期或者土豪级公司 ...

  7. 大型网站架构系列:负载均衡详解(4)

    原文:大型网站架构系列:负载均衡详解(4) 本文是负载均衡详解的第四篇,主要介绍了LVS的三种请求转发模式和八种负载均衡算法,以及Haproxy的特点和负载均衡算法.具体参考文章,详见最后的链接. 三 ...

  8. Tomcat安装、配置、优化及负载均衡详解

    博客园 首页 新随笔 联系 管理 订阅 随笔- 31  文章- 0  评论- 25  Tomcat安装.配置.优化及负载均衡详解 一.常见JavaWeb服务器      1.WebLogic:是BEA ...

  9. SpringBoot 整合 Spring Cloud Alibaba Nacos 连通性+负载均衡

    文章目录 一.整合版本说明 1. 毕业版本依赖关系(推荐使用) 2. 组件版本关系 3. 演示版本 二.整合实战 2.1. 聚合模块设计 2.2. 创建聚合parent 2.3. 依次创建子项目 三. ...

最新文章

  1. JAVA_SE之内部类
  2. Facebook人工智能副总裁:AI 这一领域很快就会「碰壁」
  3. 【简便解法】1090 危险品装箱 (25分)_33行代码AC
  4. 学习《apache源代码全景分析》之模块化体系结构摘录
  5. ARM 编译选项的默认关系 001
  6. 力扣——在排序数组中查找元素的第一个和最后一个位置
  7. 分享小知识:善用Group By排序
  8. 延时队列的几种实现方式(只有原理,并没有源码)
  9. 基于stc15f2k60s2芯片单片机编程(呼吸灯)
  10. RBAC权限系统设计
  11. 【Grafana】通过阿里云日志服务监控Nginx访问日志显示统计信息
  12. 如何在亿级数据中判断一个元素是否存在?
  13. Admin5推荐软文推广采用“链接标准化”
  14. 人生的意义在于梦想和坚持
  15. 数据结构与算法分析:实现list【理解 iter++ 和 ++iter 】
  16. 中国没有乔布斯,美国没有史玉柱
  17. 最优化方法 23:算子分裂法 ADMM
  18. 数学与计算机科学奖的是,2018未来科学数学与计算机科学奖揭晓:林本坚获奖
  19. ​【优化求解】基于人工蜂群算法求解无刷直流电机PID控制matlab代码
  20. 警惕诈骗:在俄罗斯000Pay声称支持…

热门文章

  1. vsphere ha 虚拟机监控错误_学会这3招,分分钟迁移业务繁忙虚拟机!
  2. mac系统访问群晖服务器地址,获取发现访问 U-NAS 系统管理中心 IP 地址方法
  3. python加法怎么写_51NOD 大数加法以及python写法
  4. 使用java实现类似nc的功能_在FANUC机器人中使用后台运行逻辑实现PLC功能
  5. 如果服务器开机显示NObootable,电脑不能开机提示No bootable device怎么办?
  6. java图片16帧动画_Java实现帧动画的实例代码
  7. vim匹配特定的行并删除
  8. 用tf的VocabularyProcessor使用细节
  9. python列表修改元素_python list 中修改元素
  10. 2016年6月份学习总结,读书《向着光亮那方》