一、Ribbon是什么?

  Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端  负载均衡的工具(这里区别于nginx的负载均衡)。简单来说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix中间服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。再简单点说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询、随机连接等)去连接这些机器。当然,我们也很容易使用Ribbon实现自定义的负载均衡算法。

  Ribbon官网:https://github.com/Netflix/ribbon

二、Ribbon配置

本项目的地址https://github.com/Simple-Coder/microservice-demo-study

(1)Maven工程结构

(2)microservice-consumer添加Ribbon的pom依赖

pom

(3)添加负载均衡注解:@LoadBalanced

(4)地址修改

(5)启动类添加@EnableEurekaClient注解

(6)测试:依次启动3个EurekaServer、3个Provider、1个Consumer

(7)浏览器访问服务消费方提供的地址:http://localhost:7001/consumer/get/all

第一次访问该地址,可以看出数据来自Cloud02数据库

第二次访问该地址,可以看出数据来自Cloud03数据库

第三次访问该地址,可以看出数据来自Cloud01数据库

第四次访问该地址,可以看出数据来自Cloud02数据库,说明客户端使用的负载均衡算法默认是简单轮询

三、Ribbon核心组件IRule

  IRule:根据特定算法从服务列表中选取一个要访问的服务,官网源码地址如下:

  https://github.com/Netflix/ribbon/blob/master/ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/IRule.java,IRule的继承关系图如下:

  

(1)框架自带的7种特定算法概括

  ①RoundRobinRule:简单轮询

  ②RandomRule:随机

  ③AvailabilityFilteringRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问。

  ④WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大,被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRibbonRule策略,等统计信息足够,会切换到WeightedResponseTimeRule

  ⑤RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间会进行重试,获取可用的服务

  ⑥BestAvailableRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务

  ⑦ZoneAvoidanceRule:默认规则,符合判断server所在区域的性能和server的可用性选择服务器

(2)启动类添加配置(添加此注解:@RibbonClient)

  在这里要特别注意:官方文档明确给出警告,这个自定义的配置类不能放在@ComponentScan所扫描的当前包及子包下,否则我们自定义的这个配置类就会被所有Ribbon客户端所共享,也就不能达到特殊化定制的目的了。 

(3)根据需求自定义算法(MyRandomRule.java)

  需求:依旧轮询策略,但是加上新的需求,每个服务器要求被调用3次。也就是以前每台机器一次,现在每台机器5次。参考官网源码地址如下:

https://github.com/Netflix/ribbon/blob/master/ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/RandomRule.java 

(4)配置该自定义算法

(5)测试

依次启动3个Eureka、3个provider、1个consumer,查看consumer是否每个服务调用3次切换

浏览器访问消费方提供的地址:http://localhost:7001/consumer/get/all

  不断访问该地址,确实发现每个服务调用3次,至此自定义的负载均衡算法小练习已经完成!

四、总结

  ①Ribbon是客户端、负载均衡的工具(区别于nginx)

  ②框架自带7种负载均衡算法

  ③自定义负载均衡算法的使用(启动类添加@RibbonClient、配置类不能在启动类扫描包下,否则所有Ribbon客户端都会生效该配置)

  ④本代码已经上传:https://github.com/Simple-Coder/microservice-demo-study

SpringCloud全家桶学习之客户端负载均衡及自定义负载均衡算法----Ribbon(三)的更多相关文章

  1. SpringCloud全家桶学习之Feign负载均衡----Feign(四)

    一.Feign概述 (1)Feign是什么? 官网地址:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-f ...

  2. SpringCloud全家桶学习之一阶段总结(一)

    一.概述 前几篇小博客记录了我学习SpringCloud组件的过程,并与工作中所用的Dubbo框架做了一点比较,基本组件:Eureka.Ribbon.Hystrix.Feign.Zuul.Config ...

  3. SpringCloud全家桶学习之概览(一)

    一.概览 根据百度百科的描述,微服务架构是一项在云中部署应用和服务的新技术.而SpringCloud是微服务架构思想的一个具体实现,它为开发人员提供了构建分布式系统中一些常见模式的工具(服务注册与发现 ...

  4. SpringCloud全家桶学习之分布式配置中心----Config(七)

    一.概述 (1)背景 微服务意味着将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中出现大量的服务.由于每个服务都需要配置必要的配置信息才能运行,所以一套集中式的.动态的配置管理 ...

  5. SpringCloud全家桶学习之服务注册与发现及Eureka高可用集群搭建(二)

    一.Eureka服务注册与发现 (1)Eureka是什么? Eureka是NetFlix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故 ...

  6. SpringCloud全家桶学习之消息总线---SpringCloud Bus

    一.概述 ConfigClient(微服务)从ConfigServer端获取自己对应的配置文件,但是目前的问题是:当远程git仓库配置文件发生改变时,每次都是需要重启ConfigCient(微服务), ...

  7. SpringCloud全家桶学习之断路器---Hystrix(五)

    目前我也在摸索着学习Spring Cloud,本节主要摸索的是服务熔断.服务降级.Hystrix服务监控. 一.Hystrix概述 (1)服务雪崩 服务雪崩:多个微服务之间调用的时候,假设微服务A调用 ...

  8. SpringCloud全家桶学习之路由网关----Zuul(六)

    一.Zuul概述 (1)Zuul是什么? Zuul包含了对请求的路由和过滤的两个最主要的功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础:而过滤功能则负责对请求的 ...

  9. 框架用多了真的会死人的,spring-cloud全家桶与mybitais 集成完整示例(附下载)

    ​ 题外话: 看到这一长串包含各种技术名词的标题,一路走来感觉研发深深的被各种框架给绑架了,从我们刚出生最简单的jsp,servlet打天下,到spring mvc的盛行,再到现在spring-boo ...

随机推荐

  1. 堆(Heap)和栈(Stack)

    详细可以查看这篇文章:https://www.cnblogs.com/qingtianMo/p/5255121.html 栈保存代码执行(调用)的路径,堆负责保存对象(数据) 栈相当于摞盒子,进入一个 ...

  2. DE1-soc软件实验”hello_word"

    此实验需要工具:win32disk,路由器,sd卡,Embeed Design suite, Putty,usb to uart 驱动 选择文件,在拷贝到sd卡中去:烧写的文件是官方提供的SD卡的程序 ...

  3. count(*)、count(1)、count(column)的区别

    count(*)对行的数目进行计算,包含NULL count(column)对特定的列的值具有的行数进行计算,不包含NULL值. count()还有一种使用方式,count(1)这个用法和count( ...

  4. 通过jquery将多选框变单选框

    多选框的name值为checkboxlist是复选框选中后更换其他复选框状态. function queryListByParam(e){ $("input[name='checkboxli ...

  5. AC3 channel coupling

    1.overview 如果使用channel coupling, encoder端计算所有channel的transform coefficients的平均值,将平均值压缩到coupling chan ...

  6. 在页面跳转的时候,在跳转后的页面中使用js 获取到 页面跳转的url中携带的参数。

    common.js代码 //获取URL中的参数..等等function getQueryString(name){var reg = new RegExp("(^|&)"+ ...

  7. sqlserver 查看视图语句

    本人sql小白一个,在项目中遇到了视图的使用,但是不知道视图的语句怎么查看,所以在网上搜索了一下,查到了一下的查看方式,再次记录一下: 方法一->前提: 已经创建好的视图 sp_helptext ...

  8. php截取富文本框中的固定长度的字符

    ai,哎怎么赶脚自己写东西越来越小儿科了呢,现在连这个问题都找了好半天 因为后台是的内容是富文本编辑器编辑的,前台我傻逼的直接截取了字符串,然后样式啥的都乱了,找了半天是因为富文本的问题 其实解决办法 ...

  9. OO博客作业-《JML之卷》

    OO第三单元小结 一.JML语言理论基础以及应用工具链情况梳理 一句话来说,JML就是用于对JAVA程序设计逻辑的预先约定的一种语言,以便正确严格高效地完成程序以及展开测试,这在不能容忍细微错误的工程 ...

  10. 动手实现CapsNet系列——1 概述

    Geoffrey Hinton是深度学习的开创者之一,反向传播等神经网络经典算法发明人,他在17年年底和他的团队发表了两篇论文,介绍了一种全新的神经网络,这种网络基于一种称为胶囊(Capsule)的结 ...