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() 测试一下随机策略,然后重复刷新上面的测试地址,可以发现是随机请求三个服务。其他的策略,读者可以自行尝试一下。
读者福利
针对于上面的文章我总结出了互联网公司java程序员面试涉及到的绝大部分面试题及答案做成了文档和架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
资料获取方式:加qun群:956011797点击立即加入 找管理小姐姐免费获取!

合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!



Spring Cloud:使用Ribbon实现负载均衡详解(下)的更多相关文章
- Spring Cloud:使用Ribbon实现负载均衡详解(上)
1. 什么是 Ribbon? Spring Cloud Ribbon 是一套实现客户端负载均衡的工具.注意是客户端,当然也有服务端的负载均衡工具,我们后面再介绍.可以认为 Ribbon 就是一个负载均 ...
- Spring Cloud Gateway Ribbon 自定义负载均衡
在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...
- Spring Cloud - 切换Ribbon的负载均衡模式
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模 ...
- Nginx代理功能与负载均衡详解
序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...
- Docker Swarm 负载均衡详解 or 模式选择
Docker Swarm 负载均衡详解 Swarm模式内置DNS组件,可以自动为集群中的每个服务分配DNS记录. Swarm manager使用内部负载均衡,根据服务的DNS名称在集群内的服务之间分发 ...
- Nginx 反向代理与负载均衡详解
序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在Nginx 配置详解中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Ngin ...
- 2.【Spring Cloud Alibaba】实现负载均衡-Ribbon
负载均衡的两种方式 如何实现负载均衡 目前已经实现让A总能找到B,如何实现负载均衡 负载均衡的两种方式 服务器端负载均衡 客户端负载均衡 使用Ribbo实现负载均衡 Ribbon是什么 ==Netfl ...
- 4.Spring Cloud初相识--------Feign负载均衡
前言: 在上一节里,我们学习了ribbon的使用. 我们了解到ribbon是一个客户端负载均衡机制. 而我们今天要讲的Feign呢,也是一款客户端负载均衡机制. 或者这样说,Feign封装了ribbo ...
- 【Spring Cloud学习之三】负载均衡
环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 Spring Cloud 1.2 主流的负载均衡技术有nginx.LVS.HAproxy.F5,Spring Clou ...
随机推荐
- mysql 中的增改查删(CRUD)
增改查删可以用CURD来表示 增加:create 修改:update 查找:read 删除:delete 增加create : insert +表名+values+(信息): in ...
- EasyDarwin云存储方案调研:海康萤石云采用的是MPEG-PS打包的方式进行的存储
EasyDarwin开源流媒体服务器项目在直播功能稳定和完善之后,开始涉及服务器端存储与回放功能的调研与开发,当然,这里就要研究一下行业标杆萤石云是怎么来做的,我们通过非常复杂的流程将萤石存储的录像文 ...
- 获取一组radio按钮选中的值Value
1.效果 2.HTML代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...
- BNUOJ 34978 汉诺塔 (概率dp)
题目分析:对于 i 个盘 , 须要移动多少步,取决于最大的盘子在哪个杆上.在C杆上,则最大的盘不须要移动,由于初始状态一定是满足盘由下到上盘子依次变小的,仅仅须要移动i - 1个盘.假设在A杆上,则首 ...
- 给js设定一个统一的入口
javascript是种脚本语言,浏览器下载到哪儿就会运行到哪儿,这样的特性会为编程提供方便,但也easy使程序过于凌乱.支离破碎. js从功能上能够分为两大部分--框架部分和应用部分,框架部分提供的 ...
- matlab从fig文件中提取数据
如果你的fig文件中图像是由多条曲线绘制而成,比如说plot命令生成的,通过以下方式输出横坐标,纵坐标的取值 open('figname.fig'); lh = findall(gca, 'type' ...
- 10个常见的 Android 新手误区
在过去十年的移动开发平台中,作为资深的移动开发人员,我们认为Android平台是一个新手最广为人知的平台.它不仅是一个廉价的工具,而且有着良好的开发社区,以及从所周知的编程语言(Java),使得开发A ...
- linux文件查找(find,locate)
文件查找: locate: 非实时,模糊匹配,查找是根据全系统文件数据库进行的: # updatedb, 手动生成文件数据库 速度快 find: 实时 精确 ...
- live555 基本类之间的关系
live555 中存在这5个最基本的类.每个类中都拥有一个BasicUsageEnvironment. 这是这几个类之间的相互关系. MediaSession可以拥有多个subsession.
- 【221】◀▶ IDL GUI 函数说明
参考:GUI - Dialogs Routines参考:GUI - Widgets Routines参考:GUI - Compound Widgets Routines 01 DIALOG_MES ...