Spring Cloud Netflix Ribbon详细介绍及自定义规则策略
之前文章我们介绍了如何配置具有Ribbon轮询机制的负载均衡策略的消费者,这次来具体了解一下Ribbon的一些细节,以及如何自定义负载均衡策略等。
说一下Ribbon实现负载均衡的大致思路。它通过用@LoadBalanced修饰RestTemplate,将它交由Ribbon来配置,给RestTemplate定义了一个拦截器,拦截rest请求,交由Ribbon处理后发送出去。Ribbon主要负责选取合适的实例,并构造URL。(具体不分析了,有兴趣的可以看下LoadBalancerAutoConfiguration,LoadBalancerInterceptor,LoadBalancerClient几个类)。
我们来看一下,先了解以下几个我们可能用到的重要接口。
ILoadBalancer:Ribbon的负载均衡器接口,定义了增加服务实例,选择服务实例,标志服务实例下线,取得当前可用实例,取得所有服务实例方法。通过方法定义,我们可以看出,这个类是Ribbon的最主要的管理类。它管理所有实例,并通过获取实例方法的中的负载均衡策略选择合适实例返回。主要涉及到AbstractLoadBalancer实现接口,并定义了一些基础方法。
- BaseLoadBalancer:继承AbstractLoadBalancer,负载均衡器的基础实现类,有几个需要注意的地方:IPing(用于检测实例状态的方式)对象未实现,为空,需要在构造时传入,检查实例状态的默认策是SerialPingStrategy,该策略会使用传入规则,轮询实例检查其状态,在网络不好或实例过多的情况下,会存在性能问题。检查策略也可以自定义传入。定义了IRule对象,该对象主要用于定义负载均衡策略,ILoadBalancer会将自己通过构造函数传入IRule,IRule通过choose函数取得serverList,并返回规则下的某个server。该均衡器默认的IRule为RoundRobinRule,策略为线性轮询服务实例返回。
- NoOpLoadBalancer,这个类继承AbstractLoadBalancer,从名字可以看出,反正就是什么也不做。。。
- DynamicServerlistloadBalancer,继承BaseLoadBalancer,实现了服务清单在运行过程中动态更新的能力,同时具备服务清单过滤的功能。大家可以自己看下,我也没仔细看>_<。
- ZoneAwareLoadBalancer,继承DynamicServerlistloadBalancer,功能上是最完善,最强大的,由于DynamicServerlistloadBalancer使用轮询方式调用实例,在区域不同的情况下,可能存在网络延迟等情况影响性能,所以出现了ZoneAwareLoadBalancer,它具有区域亲和性,会优先选择同区域的实例。它使用ZoneAvoidanceRule作为负载均衡策略。
IRule:负载均衡策略接口
- AbstractloadBalancerRule,实现了一些基本的方法。定义了ILoadBalancer对象。
- RandomRule:随机选择策略。
- RoundRobinRule:线性轮询策略
- RetryRule:内部定义了另一个轮行策略,具备了判断实例选择检测实例是否存活,未存活时,轮询选择其余实例,并判断实例状态,还设置了超时功能,在指定时间内,未能选择出能使用的实例,则返回null。
- WeightedResponseTimeRule:对RoundRobinRule的扩展,里面定义了一个算法计算实例的权重,权重与实例响应时间有关,反正最终效果就是响应时间短的实例更容易被选择到。
- ClientConfigEnabledRoundRobinRule:实现和RoundRobinRule一致,用于其他类通过继承它进行扩展。
- BestAvailableRule继承于ClientConfigEnabledRoundRobinRule,它通过遍历所有实例,过滤故障实例,找出并发请求最少的一个实例返回。谁最闲找谁做事。
- PredicateBasedRule:该规则先实现过滤(某种判断实例是否故障,且较空闲的算法),然后遍历找出一个实例。(这个没怎么懂)。
- AvailabilityFilteringRule:继承了PredicateBasedRule,直接遍历实例,根据规则,找到一个合适的实例就返回。
- ZoneAvoidanceRule:继承PredicateBasedRule,具备区域亲和性的策略,先通过区域过滤出同区域的实例,再选择一个实例。如果没有同区域的实例,则线性遍历其他实例。
IPing:检测实例是否可用的接口
- AbstractLoadBalancerPing:实现IPing,定义了AbstractLoadBalancer。
- NoOpPing:实现IPing,返回true,表示默认所有实例可用。
- DummyPing:默认返回true,并构造了一个initWithNiwsConfig空方法,应该是用来提供给开发者自己继承实现的类。
- NIWSDiscoveryPing:这个是和Eureka结合使用时,以注册中心管理的实例状态为准,状态为UP的实例返回为可用。
- PingConstant:实现IPing,可以通过setConstant来设置当前或所有实例的状态。
- PingUrl:实现IPing,通过发送http请求判断实例返回值的状态码是否为200,判断实例是否存活。默认地址是http或https://ip:端口,可以通过setPingAppendString,往ip后再拼接字符构成地址。
以上三个接口是Ribbon最主要的几个接口,其余接口在这里不做介绍。
下面讲一下Ribbon使用的默认接口,注意,与Eureka整合后,接口有一定变化。
- ILoadBalancer,用的ZoneAwareLoadBalancer
- IRule,用的ZoneAvoidanceRule
- IPing,用的NoOpPing,默认都可以
- ServerList<Server>,用的ConfigurationBasedServerList,以配置实例列表决定,配置方式为:<servername>.ribbon.listOfServers=localhost:8001,localhost:8002, localhost:8003
- ServerListFilter<Server>,默认使用ZonePreferenceServerListFilter,优先过滤同区域的实例。
- IClientConfig,Ribbon的客户端配置,默认使用DefaultClientConfigimpl
在和Eureka整合后,接口实例使用有以下变化:
- ServerList<Server>,由DiscoveryEnabledNIWSServerList替换。该类实现将服务实例清单列表的管理交由Eureka的注册中心维护。表示Ribbon直接从Eureka注册中心获取服务列表。
- IPing被.NIWSDiscoveryPing来替换,表示实例的状态由Eureka注册中心维护,注册中心列表中实例为UP状态则返回该实例可用。
经过上面的介绍之后,我们来看如何自定义这些策略的实现类。自己如果要实现这些接口也行。
通过查看Ribbon源码,找到以下这个类,它的构造函数中定义了这些配置的字段。
public PropertiesFactory() {
classToProperty.put(ILoadBalancer.class, "NFLoadBalancerClassName");
classToProperty.put(IPing.class, "NFLoadBalancerPingClassName");
classToProperty.put(IRule.class, "NFLoadBalancerRuleClassName");
classToProperty.put(ServerList.class, "NIWSServerListClassName");
classToProperty.put(ServerListFilter.class, "NIWSServerListFilterClassName");
}
我们可以看到,它支持5个接口的实现类配置。如:通过<servername>.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule,配置servername的负载均衡策略为随机选择实例。不加服务名的配置则表示全局生效。好叻,写完了,亲测有效哦,大家可以试着定制自己的负载均衡的配置了!
Spring Cloud Netflix Ribbon详细介绍及自定义规则策略的更多相关文章
- SpringCloud学习笔记(19)----Spring Cloud Netflix之服务网关Zuul自定义过滤器
zuul不仅只是路由,还可以自定义过滤器来实现服务验证. 实现案例:自定义过滤器,检验头部是否带有token,如果token=wangx,则通过校验,若不存在或不为wangx则返回提示token错误. ...
- SpringCloud学习笔记(8)----Spring Cloud Netflix之负载均衡-Ribbon的负载均衡的策略
一. 内置 负载均衡策略的介绍的 IRule的实现类 2. 通过代码实现负载均衡 在第六节Riddom的使用的工程中,随机策略配置类 package com.wangx.cloud.springclo ...
- Spring Cloud Gateway Ribbon 自定义负载均衡
在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...
- 从零开始学spring cloud(六) -------- Ribbon
一.Ribbon介绍 Ribbon就是客户端侧负责均衡实现的一种方式,那么Ribbon是什么呢? Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端侧负载均衡算法.Ribb ...
- spring cloud连载第三篇之Spring Cloud Netflix
1. Service Discovery: Eureka Server(服务发现:eureka服务器) 1.1 依赖 <dependency> <groupId>org.spr ...
- Spring Cloud Netflix概览和架构设计
Spring Cloud简介 Spring Cloud是基于Spring Boot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策 ...
- 基于Spring Cloud Netflix的TCC柔性事务和EDA事件驱动示例
Solar Spring Cloud为开发者提供了快速构建分布式系统中的一些常见工具,如分布式配置中心,服务发现与注册中心,智能路由,服务熔断及降级,消息总线,分布式追踪的解决方案等. 本次实战以模拟 ...
- Spring Cloud netflix 概览和架构设计
pring Cloud是基于Spring Boot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等 ...
- Spring Cloud Netflix多语言/非java语言支持之Spring Cloud Sidecar
Spring Cloud Netflix多语言/非java语言支持之Spring Cloud Sidecar 前言 公司有一个调研要做,调研如何将Python语言提供的服务纳入到Spring Clou ...
随机推荐
- 【Web前端】VS code 快捷键tips 【陆续记录】
学习资料为:chuanzhiheima培训资料,freecodecamp300小时基础前端,<精编CSS第三版>,<Node.js 开发指南>(BYvoid编著,淘宝买的二手书 ...
- C#(1)运用C#实现一键从Word文档转换TXT文本的功能
有想直接从Word转TXT文本的可以看看,懒得复制粘贴的也可以使用下,方便而快捷!! 首先打开vs2012创建一个简单的form窗体: 里面主要的就是一个存放Word文档的button和一个执行的bu ...
- 如何制作gif图片?教你把gif图片缩小100倍大小的妙招!
移动互联网是短视频的时代,5G的到来更是让短视频蓬勃发展,视频的发展让人们看到了动态的机会,图片也需要动起来,图片动起来应该是比较早的,gif图片很早就有,我们常见的动态表情,现在用的比较多的是视频的 ...
- 【React Native】react-native之集成支付宝支付、微信支付
一.在使用支付宝支付.微信支付之前导入桥接好的头文件 github地址:https://github.com/xujianfu/react-native-pay 二.集成支付宝支付流程 RN支付宝需要 ...
- Servlet 使用介绍(3)
说明 本篇记录一个Servlet的创建过程和基本使用.由于,Servlet是基于Http协议使用的,所以,可以在http协议的基础上作一些改变,来修改适用我自己的servlet. Servlet使用 ...
- Data Management Technology(2) -- Data Model
1.Data Model Model Is the abstraction of real world Reveal the essence of objects, help people to lo ...
- form-data、x-www-form-urlencoded、raw、binary的区别(非原创)
文章大纲 一.form-data介绍二.x-www-form-urlencoded介绍三.raw介绍四.binary介绍五.参考文章 一.form-data介绍 http请求中的multipart/f ...
- rsync nfs web01总结
目录 rsync nfs web01总结 要求 部署rsync服务端(172.16.1.41) 部署rsync客户端(172.16.1.31.172.16.1.7) 部署web代码 NFS服务端部署 ...
- python列表转换为字符串
对于非纯字符串组成的列表,需要使用map(str, 列表)转换,纯字符串组成的列表则不需要转换 list1 = [1, 2, 3, 4, 5]c = ','.join(map(str,list1))p ...
- datatable与实体类之间相互转化的几种方法
#region DataTable转换成实体类 /// <summary> /// 填充对象列表:用DataSet的第一个表填充实体类 /// </summary> /// & ...