1.Ribbon介绍因为微服务是目前互联网公司比较流行的架构 , 所以spring就提供了一个顶级框架-spring cloud , 来解决我们在开发微服务架构中遇到的各种各样的问题 , 今天的主角是spring cloud 框架中集成的组件Ribbon , 那么Ribbon能解决什么问题呢 , 我们来思考下面的问题 。
? 微服务架构中的每个服务为了高可用 , 很大程度上都会进行集群 , 我们假设现在集群了3个user服务 , 同时能提供相同的服务 , 问题来了 , 我们如何决定调用这3个user服务中的哪一个呢?
? 根据不同分析角度 , 会有不同的答案 , 也可以理解为根据不同的情况 , 我们可以写不同的算法 , 来决定到底此时此刻 , 调用这3个user服务的哪一个 , 那么 , Ribbon就给我们提供了不同的算法 , 我们可以根据业务场景 , 调整配置文件 , 决定到底使用哪个算法 , 这样 , 算法中就会计算出调用哪个user服务了 。
2.准备工作1)我们准备一个eureka注册中心
2)再准备一个order服务
3)再准备3个相同代码的user服务 , 这样 , order服务通过eureka注册中心 , 就可以发现user的3个服务
3.Ribbon的常用负载均衡策略Ribbon是通过IRule的这个接口来选择3个user服务中的哪个的 , 但是实际执行的代码肯定是继承了这个接口的实现类 , 所以选择不同的实现类 , 就会选择不同负载均衡策略
public interface IRule {Server choose(Object var1);void setLoadBalancer(ILoadBalancer var1);ILoadBalancer getLoadBalancer();}
3.1. RoundRobinRule 轮询策略此策略是Ribbon的默认策略 , 是按照顺序 , 依次对所有的user服务进行访问 。
通过重写IRule的choose方法 , 来选择并返回决定调用的user服务 , 在下面的源码中 , List allServers = lb.getAllServers(); 获得了所有的3个user服务实例 , int nextServerIndex = this.incrementAndGetModulo(serverCount); 保存了当前调用的user实例的序号 , 然后就可以按照顺序调用下一个user服务了
public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {log.warn("no load balancer");return null;} else {Server server = null;int count = 0;while(true) {if (server == null && count++ < 10) {List<Server> reachableServers = lb.getReachableServers();List<Server> allServers = lb.getAllServers();int upCount = reachableServers.size();//总服务实例数量int serverCount = allServers.size();if (upCount != 0 && serverCount != 0) {int nextServerIndex = this.incrementAndGetModulo(serverCount);server = (Server)allServers.get(nextServerIndex);if (server == null) {Thread.yield();} else {if (server.isAlive() && server.isReadyToServe()) {return server;}server = null;}continue;}log.warn("No up servers available from load balancer: " + lb);return null;}if (count >= 10) {log.warn("No available alive servers after 10 tries from load balancer: " + lb);}return server;}}}
debug的图例:
文章插图
3.2. RoundRobinRule 随机策略
就和这个策略的名字一样 , 是对user的3个服务的随机调用 , 所以不存在规律 , 如下源码中int index = this.chooseRandomInt(serverCount); 通过随机数来选择下标 , 所以对user服务的调用是随机的
public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;} else {Server server = null;while(server == null) {if (Thread.interrupted()) {return null;}List<Server> upList = lb.getReachableServers();List<Server> allList = lb.getAllServers();int serverCount = allList.size();if (serverCount == 0) {return null;}int index = this.chooseRandomInt(serverCount);server = (Server)upList.get(index);if (server == null) {Thread.yield();} else {if (server.isAlive()) {return server;}server = null;Thread.yield();}}return server;}}
debug的图例:文章插图
3.3. WeightedResponseTimeRule响应时间加权重策略
根据user的3个服务的响应时间来分配权重 , 响应时间越长的服务 , 权重越低 , 那么被调用的概率也就越低 。相反 , 响应时间越短的服务 , 权重越高 , 被调用的概率也就越高
响应时间加权重策略的实现分为两步:
推荐阅读
- 惊蛰的习俗有哪些,功能饮料有哪些品牌
- 顾渚茶园新貌,历史上进贡时间最长的茶顾渚紫笋
- 古树普洱茶的介绍,曼松古树为何价高
- 古道汇集八方客,正在迅速消失的茶马古道马帮
- 功效奇特的中国藤茶,野生藤茶功效和作用
- 贵台红加盟信息,如何才能买到好的普洱茶春茶
- 足球经理|培养职业精神在大学语文教育中的意义
- |五个锦囊,送给初入审计的你
- 人际关系|毕业多年才看清,工作能力突出的却当不了领导,深层原因让人感叹
- 招聘|大学毕业生找到一份销售工作,却发现做的事违背良心,该怎么办?