Ribbon 提供了几个负载均衡的组件,其目的就是让请求转给合适的服务器处理,因此,如何选择合适的服务器变成了负载均衡机制的核心,Ribbon 提供了如下负载均衡规则:

  • RoundRobinRule:默认规则,通过简单的轮询服务列表来选择服务器
  • AvailabilityFilteringRule:可用性筛选规则
    • 忽略无法连接的服务器,默认情况下,如果3次连接失败,该服务将会被置为"短路"的状态,该状态持续30秒;如果再次连接失败,"短路"状态的持续时间将会以几何级数增加,可以通过 niws.loadbalancer.<clientName>.connectionFailureCountThreshold 属性,来配置连接失败的次数;
    • 忽略并发过高的服务器,如果连接到该服务器的并发数过高,也会被这个规则忽略,可以通过修改 <clientName>.ribbon.ActiveConnectionsLimit 属性来设定最高并发数。
  • WeightedResponseTimeRule:为每个服务器赋予一个权重值,服务器的响应时间越长,该权重值就越少,这个规则会随机选择服务器,权重值有可能会决定服务器的选择
  • ZoneAvoidanceRule:该规则以区域、可用服务器为基础进行服务器选择,使用区域(Zone)对服务器进行分类
  • BestAvailableRule:忽略"短路"的服务器,并选择并发数较低的服务器
  • RandomRule:随机选择可用服务器
  • RetryRule:含有重试的选择逻辑,如果使用 RoundRobinRule 选择的服务器无法连接,那么将会重新选择服务器

Ribbon 提供的负载规则基本可以满足大部分的需求,如果有更为复杂的要求,则可以自定义负载规则,如果需要实现自定义规则,需要实现 com.netflix.loadbalancer.IRule 接口,示例如下:

package org.lixue.ribbon.client;

import com.netflix.loadbalancer.ILoadBalancer;

import com.netflix.loadbalancer.IRule;

import com.netflix.loadbalancer.Server;

import java.util.List;

public class MyRule implements IRule{

private ILoadBalancer loadBalancer;

/**

*选择服务器

*/

public Server choose(Objectkey){

List<Server>allServers=loadBalancer.getAllServers();

if(allServers.size()>0){

//固定返回最后一个

return allServers.get(allServers.size()-1);

}else

return null;

}

public void setLoadBalancer(ILoadBalancerlb){

this.loadBalancer=lb;

}

public ILoadBalancer getLoadBalancer(){

returnthis.loadBalancer;

}

}

可以直接使用编码方式来设置负载规则,示例如下:

package org.lixue.ribbon.client;

import com.netflix.client.ClientFactory;

import com.netflix.config.ConfigurationManager;

import com.netflix.loadbalancer.ILoadBalancer;

import com.netflix.loadbalancer.IRule;

import com.netflix.loadbalancer.Server;

public class RibbonClient{

public static void main(String[]args)throws Exception{

ConfigurationManager.loadCascadedPropertiesFromResources("ribbon-client");

ILoadBalancerloadBalancer=ClientFactory.getNamedLoadBalancer("MyRibbonClient");

IRule chooseRule=new MyRule();

chooseRule.setLoadBalancer(loadBalancer);

for(int i=0;i<10;i++){

Server server=chooseRule.choose(null);

System.out.println("request"+server.getHostPort());

}

}

}

也可以使用配置的方式来设置负载规则,配置属性名 NFLoadBalancerRuleClassName ,配置值为自定义负载规则类的完整名称(命名空间和类名),修改 src/main/resources 目录下的 ribbon-client.properties 配置如下:

#配置服务器列表

MyRibbonClient.ribbon.listOfServers=localhost:8080,localhost:8002

#配置负载均衡规则IRule的实现类

MyRibbonClient.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.WeightedResponseTimeRule

#配置负载均衡实现类

MyRibbonClient.ribbon.NFLoadBalancerClassName=com.netflix.loadbalancer.ZoneAwareLoadBalancer

修改代码如下:

package org.lixue.ribbon.client;

import com.netflix.client.ClientFactory;

import com.netflix.config.ConfigurationManager;

import com.netflix.loadbalancer.*;

public class RibbonClient{

public static void main(String[]args)throwsException{

ConfigurationManager.loadCascadedPropertiesFromResources("ribbon-client");

ILoadBalancerloadBalancer=ClientFactory.getNamedLoadBalancer("MyRibbonClient");

for(inti=0;i<10;i++){

Serverserver=loadBalancer.chooseServer(null);

if(server!=null){

System.out.println("request"+server.getHostPort());

}

}

}

}

Ribbon 负载均衡机制的更多相关文章

  1. SpringCloud系列——Ribbon 负载均衡

    前言 Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制.我们在上篇(猛戳:SpringCloud系列——Feign 服务调用)已经实现了多个服务之间的Feign调用 ...

  2. Spring Cloud微服务开发笔记5——Ribbon负载均衡策略规则定制

    上一篇文章单独介绍了Ribbon框架的使用,及其如何实现客户端对服务访问的负载均衡,但只是单独从Ribbon框架实现,没有涉及spring cloud.本文着力介绍Ribbon的负载均衡机制,下一篇文 ...

  3. spring cloud学习笔记二 ribbon负载均衡

    Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求.Ribb ...

  4. 微服务(三) Eureka注册中心和Ribbon负载均衡

    1. Eureka注册中心 1.1 Eureka的结构和作用 在上一篇文章中 微服务(二)服务拆分及远程调用 order-service在发起远程调用的时候,该如何得知user-service实例的i ...

  5. (4)什么是Ribbon负载均衡

    4.Ribbon负载均衡 上一节中,我们添加了@LoadBalanced注解,即可实现负载均衡功能,这是什么原理呢? 4.1.负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的 ...

  6. Azure的负载均衡机制

    负载均衡一直是一个比较重要的议题,几乎所有的Azure案例或者场景都不可避免,鉴于经常有客户会问,所以笔者觉得有必要总结一下. Azure提供的负载均衡机制,按照功能,可以分为三种:Azure Loa ...

  7. nginx 健康检查和负载均衡机制分析

    nginx 是优秀的反向代理服务器,这里主要讲它的健康检查和负载均衡机制,以及这种机制带来的问题.所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖 于具体实现,各个实现定义不一样),不再往这 ...

  8. 分析NGINX 健康检查和负载均衡机制

    nginx 是优秀的反向代理服务器,这里主要讲它的健康检查和负载均衡机制,以及这种机制带来的问题.所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖于具体实现,各个实现定义不一样),不再往这个 ...

  9. Spring Cloud微服务Ribbon负载均衡/Zuul网关使用

    客户端负载均衡,当服务节点出现问题时进行调节或是在正常情况下进行 服务调度.所谓的负载均衡,就是当服务提供的数量和调用方对服务进行 取舍的调节问题,在spring cloud中是通过Ribbon来解决 ...

随机推荐

  1. 2019-04-03-day025-异常与日志

    内容回顾 考试 6个小时 120分 (100+20) 15:00-18:00 笔试 60分 19:00-22:00 上机考试 40分 + 20分 60分及格不算附加题 简答题 读程序 简单编程 编程题 ...

  2. Day19作业及默写

    三级菜单 menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车 ...

  3. 2019-03-21-day016-正则表达式

    昨日内容回顾 基本数据类型 编码 流程控制 文件操作 函数-内置函数 装饰器 常用模块: 序列化模块 随机数模块 os模块 sys模块 时间模块 hashlib collections re 1天半 ...

  4. HDU 1796 How many integers can you find(容斥原理)

    题目传送:http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=20918&pid=1002 Problem Description    ...

  5. 【linux基础】CMake如何生成动态链接库文件

    CMakeLists.txt SET(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib) ADD_LIBRARY(filename SHARED ${CURREN ...

  6. 删除Git管理的文件

    首先进入由Git管理的文件夹下: 我们直接使用rm命令符删除git1.txt文件 那么你去删除一个版本库里的文件,工作区的文件就和版本库里的不一样了,现在我们采用git status来查看一下状态. ...

  7. WEBBASE篇: 第一篇, HTML知识1

    HTML知识1 1,web概述 WEB就是互联网上的一种应用程序 - 网页程序: 程序结构: (1)C / S: C:Client 客户端:S:Server 服务器: (2)B / S: B:Brow ...

  8. [LeetCode&Python] Problem 905: Sort Array By Parity

    Given an array A of non-negative integers, return an array consisting of all the even elements of A, ...

  9. QT学习相关

    1. vs2012的编译器对execution_character_set("utf-8")无反应的bug在vs2013中解决 2. 安装上vs2013后,重装的qt插件,发现不能 ...

  10. HDU - 1174:爆头 (三维平面点到射线的距离)

    pro:给定警察的射击位置,设计方向,敌人的位置,敌人的头部半径,问子弹是否可以射到头部. sol:即问头部中点到子弹射线的距离是否小于等于头部半径. 和二维的点到直线一样的操作. det/dot: ...