在上一篇文章(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实现负载均衡详解(下)的更多相关文章

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

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

  2. Spring Cloud Gateway Ribbon 自定义负载均衡

    在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...

  3. Spring Cloud - 切换Ribbon的负载均衡模式

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

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

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

  5. Docker Swarm 负载均衡详解 or 模式选择

    Docker Swarm 负载均衡详解 Swarm模式内置DNS组件,可以自动为集群中的每个服务分配DNS记录. Swarm manager使用内部负载均衡,根据服务的DNS名称在集群内的服务之间分发 ...

  6. Nginx 反向代理与负载均衡详解

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

  7. 2.【Spring Cloud Alibaba】实现负载均衡-Ribbon

    负载均衡的两种方式 如何实现负载均衡 目前已经实现让A总能找到B,如何实现负载均衡 负载均衡的两种方式 服务器端负载均衡 客户端负载均衡 使用Ribbo实现负载均衡 Ribbon是什么 ==Netfl ...

  8. 4.Spring Cloud初相识--------Feign负载均衡

    前言: 在上一节里,我们学习了ribbon的使用. 我们了解到ribbon是一个客户端负载均衡机制. 而我们今天要讲的Feign呢,也是一款客户端负载均衡机制. 或者这样说,Feign封装了ribbo ...

  9. 【Spring Cloud学习之三】负载均衡

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 Spring Cloud 1.2 主流的负载均衡技术有nginx.LVS.HAproxy.F5,Spring Clou ...

随机推荐

  1. Presenting view controllers on detached view controllers is discouraged

    本文转载至 http://www.xuebuyuan.com/2117943.html Presenting view controllers on detached view controllers ...

  2. webapp 打包

    输入您的WAP网址,技术员马上帮您封装APP! APP人工打包-智睿软件_app打包_苹果app发布_app 上架_ios 上架_封装app_网站转app_安卓发布 http://app.niuhu1 ...

  3. left outer join preserving unmatched rows from the first table

    https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj18922.html INNER JOIN operation Specifies a join ...

  4. govendor

    cd  到工程目录. govendor init : 初始化 govendor fetch : 拉取包 go 1.6以后编译go代码会优先从vendor目录先寻找依赖包: controllers\ar ...

  5. MotionEvent分析及ImageView缩放实现

    这个类在各种View和用户的手势操作之间的交互存在很大的自定义空间.要理解清楚这个类的一些特性和意义,对自定义的新型控件很有帮助 先翻译一下开发者文档的描述 Overview Motion event ...

  6. 最简单ajax,$.post()用法

    最简单的ajax,$.post()用法 $.post("action.php",{'email':$('#email').val(),'address':$('#address') ...

  7. 物体position:absolute后设置left:50%发生的有趣小事

    今天在重构ui控件中3秒hint提示框样式,发现了一个有趣的小事,特发个文章记录一下,方便自己日后看一下 一 准备知识 ①一个已设置宽高的块状元素设置position:absolute后会保持他原来宽 ...

  8. POJ 1611 The Suspects (并查集+数组记录子孙个数 )

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 24134   Accepted: 11787 De ...

  9. SDUT OJ 之 1571 《人品,有没有?》 字符串的处理问题

    人品,有木有? Time Limit: 1000ms   Memory limit: 32768K  有疑问?点这里^_^ 题目描述 新一届的山东理工大学ACM网络擂台赛就要开始啦!听说晋级的选手有机 ...

  10. 谈谈java中静态变量与静态方法在有继承关系的两个类中调用

    谈谈java中静态变量与静态方法在有继承关系的两个类中调用 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量和静态方法在有继承关系的两个类中的问题测试 ...