SpringCloud Netflix Ribbon
2020-02-14 16:02:55来源:博客园 阅读 ()
SpringCloud Netflix Ribbon
Eureka客户端的负载均衡:从Eureka server拿到节点列表,客户端自己使用负载均衡的算法确定要使用的节点;
Eureka服务端的负载均衡:服务端使用负载均衡的算法,从节点列表中确定要使用的节点,将该节点信息返回给客户端。
Ribbon实现的是客户端的负载均衡,默认使用的策略是轮询。
Ribbon内置的负载均衡策略
- RoundRobinRule 轮询,Ribbon默认的策略。
轮询是最简单的负载均衡算法,将所有节点围城一圈,轮着来,每个节点的负载差不多,适合节点性能都差不多的情况。
加权轮询法 这个不是Ribbon的内置策略,此处只是作为补充。
在轮询的基础上,对每个节点施加权重。节点的性能不同,性能高的权重分配大些,轮到的几率就大些,负载大些。适合节点性能有明显区别的情况。
- RetryRule 重试
先按照RoundRobinRule策略获取provider,若获取失败,则在指定的时限内重试。默认的时限为500毫秒。
- RandomRule 随机
从所有节点中随机选择一个。
- BestAvailableRule 最可用
选择并发量最小的节点(连接的消费者数量最少的节点)。
- AvailabilityFilteringRule 可用过滤
过滤掉处于断路器跳闸状态的provider,或已经超过连接极限的provider,对剩余provider采用轮询策略。
- ZoneAvoidanceRule
根据大区性能、节点可用性综合进行选择。
- WeightedResponseTimeRule 权重响应时间
根据每个provider的平均响应时间计算其权重,响应时间越快权重越大,被选中的机率就越高。刚启动时采用轮询策略,计算出权重后就根据权重进行选择。
使用Ribbon内置的负载均衡策略
使用Eureka导入的依赖已经包含了Ribbon的依赖,所以不必再导依赖。
只需在消费者的引导类中设置Ribbon:
@SpringBootApplication @EnableEurekaClient //作为Eureka Client,也可使用@EnableDiscoveryClient,这两个注解作用差不多 public class UserServer { @Bean @LoadBalanced //使用Ribbon实现负载均衡 public RestTemplate getRestTemplate(){ return new RestTemplate(); } //设置Ribbon使用的负载均衡策略,只需创建一个实例、放到spring容器中即可。 // 若不设置,默认使用轮询。 @Bean public RandomRule getRule(){ return new RandomRule(); } public static void main(String[] args) { SpringApplication.run(UserServer.class, args); } }
使用自定义的负载均衡策略
(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:一个是此服务的所有节点的信息,一个是此服务所有可用节点的信息。
维护过程:Ribbon从Eureka server拿到此服务所有的节点列表,这个节点列表一直保存在缓存中,不修改;将这个列表copy一份作为有效节点列表,也放在缓存中,并定时ping一下列表中的节点,判断节点是否还有效,若无效,则从有效节点列表中删除。
(2)引导类
@SpringBootApplication @EnableEurekaClient //作为Eureka Client,也可使用@EnableDiscoveryClient,这两个注解作用差不多 public class UserServer { @Bean @LoadBalanced //使用Ribbon实现负载均衡 public RestTemplate getRestTemplate(){ return new RestTemplate(); } //使用自定义的策略 @Bean public MyRule getRule(){ return new MyRule(); } public static void main(String[] args) { SpringApplication.run(UserServer.class, args); } }
原文链接:https://www.cnblogs.com/chy18883701161/p/12304655.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:EL表达式
下一篇:MongoDB-2 安装与配置
- 【spring cloud hoxton】Ribbon 真的能被 spring-cloud-load 2020-06-08
- Spring Cloud Ribbon 客户端负载均衡 2020-06-04
- 为什么要用springcloud? 2020-06-02
- SpringCloud Alibaba 简介 2020-05-26
- 客服端负载均衡:Spring Cloud Ribbon 2020-05-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash