SpringCloud Netflix Ribbon
Ribbon、Eureka都是Netflix旗下的项目,Eureka Client内置了Ribbon,用于实现负载均衡,默认使用轮询。
Ribbon内置的负载均衡策略
- RoundRobinRule 轮询,默认策略
轮询是最简单的负载均衡算法,每次调用服务拿到节点列表后,从前往后依次轮询类表中的每个节点,谁空闲就调用谁。
测试时往往都是调用列表的第一个节点,因为刷新的手速远远比不上cpu的执行速度,除非是线程阻塞。
轮询适合节点性能都差不多的情况,如果集群节点性能都差不多,一般使用默认的轮询即可。
加权轮询 这个不是Ribbon的内置策略,此处只是作为补充。
在轮询的基础上,对每个节点施加权重。节点的性能不同,性能高的权重分配大些,轮到的几率就大些,负载大些。适合节点性能有明显区别的情况。
- RetryRule 重试
先按照RoundRobinRule策略获取provider,若获取失败,则在指定的时限内重试。默认的时限为500毫秒。
- RandomRule 随机
从所有节点中随机选择一个。
- BestAvailableRule 最可用
选择并发量最小的节点(连接的消费者数量最少的节点)。
- AvailabilityFilteringRule 可用过滤
过滤掉处于断路器跳闸状态的provider,或已经超过连接极限的provider,对剩余provider采用轮询策略。
- ZoneAvoidanceRule
根据大区性能、节点可用性综合进行选择。
- WeightedResponseTimeRule 权重响应时间
根据每个provider的平均响应时间计算其权重,响应时间越快权重越大,被选中的机率就越高。刚启动时采用轮询策略,计算出权重后就根据权重进行选择。
使用Ribbon内置的负载均衡策略
Eureka Client的依赖已经包含了Ribbon的依赖,所以不必再导Ribbon的依赖。
负载均衡策略在消费者中进行配置,比如user-service调用order-service,那就在user-service中配置。有2种配置方式:
- 在springboot配置文件中配置(推荐)
#配置调用order-service的负载均衡策略
order-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
都是一个包下的,把类名换了即可
- 在引导类中配置
@SpringBootApplication
public class UserServiceApplication { @Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
} //使用的负载均衡策略
@Bean
public RandomRule getRule(){
return new RandomRule();
} public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
} }
总结: 指定负载均衡策略的类的路径或者自己创建对应的Bean。
使用自定义的负载均衡策略
(1)新建一个类来写负载均衡策略
//需继承AbstractLoadBalancerRule
public class MyRule extends AbstractLoadBalancerRule{ @Override
public void initWithNiwsConfig(IClientConfig iClientConfig) { } //自定义负载均衡策略,需返回一个节点
@Override
public Server choose(Object o) {
//获取负载均衡器
ILoadBalancer loadBalancer = this.getLoadBalancer(); //获取目标服务的所有节点,包括了无效节点
List<Server> allList = loadBalancer.getAllServers();
//获取目标服务的所有可用节点
List<Server> upList = loadBalancer.getReachableServers(); for (Server server:upList){
//有效且空闲
if (server.isAlive() && server.isReadyToServe()){
//ip
System.out.println(server.getHost());
//port
System.out.println(server.getPort());
//ip:port的形式
System.out.println(server.getHostPort());
return server;
}
} // Server的构造函数:Server(String ip,int port)
// Server server = new Server("127.0.0.1", 10001); return null;
}
}
注意导入的Server是com.netflix.loadbalancer.Server,不要导错了。
我们看到choose会传入一个Object类型的参数,这个参数是Ribbon缓存的目标服务所有节点的信息,会自动传入。
Ribbon对一个服务,会在缓存中维护2个List:一个是此服务的所有节点的信息,一个是此服务所有可用节点的信息。
缓存的节点列表的维护过程:
Eureka Client从Eureka Server拿到此服务的节点列表,这个节点列表一直保存在缓存中,不修改;
将这个列表copy一份作为有效节点列表,也放在缓存中,并定时ping一下列表中的节点,判断节点是否还有效,若无效,则从有效节点列表中删除;
同时,Eureka Client会轮询Eureka Server此节点列表是否有变化、更新,如果有,舍弃本地缓存的节点列表,从Eureka Server重新获取节点列表。
(2)在配置文件或引导类中配置负载均衡策略
要模拟集群可以修改下运行配置
VM options中设置的参数需要加前缀-D,优先级最高,会覆盖配置文件中相同的配置项。
最新文章
- Sublime Text 3 安装Go语言相关插件gosublime
- 详解MySQL三项实用开发知识
- “-bash: svn: command not found”
- 浅析SQL Server 2005中的主动式通知机制
- 你好,C++(14)如何描述“一个名叫陈良乔,年龄33岁,身高173厘米,体重61.5千克的男人”——3.8 用结构体类型描述复杂的事物
- linux网络编程:select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)
- c++ 按行读取txt文本
- ajax客户端请求与服务端响应浅谈
- WebSocke实时通讯协议
- @PathVariable出现点号";.";时导致路径参数截断获取不全的解决办法
- JHipster简介
- 洛谷 P4174 [NOI2006]最大获利 解题报告
- node事件循环和process
- BZOJ4455 小星星
- 设置Azure WebSite黑白名单
- 输出前 k 大的数
- 关于Linux内核版本
- MySql(七):MySQL性能调优——锁定机制与锁优化分析
- 【Linux】shell字符串分割、数组访问、条件判断
- R语言编程中的常见错误
热门文章
- react-react中的css+评论组件
- 对one hot 编码的理解,sklearn. preprocessing.OneHotEncoder()如何进行fit()的?
- deepin开机自动启动服务备忘
- LeetCode 860. 柠檬水找零 (贪心)
- [ZJOI2008] 生日聚会 - dp
- Mariadb Galera Cluster 搭建集群
- WebService 之 SoapHeader
- JS图片轮换
- vue学习指南:第十四篇(详细) - Vue的 路由 第四篇 ( 路由的导航守卫 )
- Hibernate的理论知识点