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,优先级最高,会覆盖配置文件中相同的配置项。

SpringCloud Netflix Ribbon的更多相关文章

  1. SpringCloud Netflix Ribbon(负载均衡)

    ⒈Ribbon是什么? Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负 ...

  2. SpringCloud学习笔记(四、SpringCloud Netflix Ribbon)

    目录: Ribbon简介 Ribbon的应用 RestTemplate简介 Ribbon负载均衡源码分析 Ribbon简介: 1.负载均衡是什么 负载均衡,根据其字面意思来说就是让集群服务具有共同完成 ...

  3. SpringCloud系列之客户端负载均衡Netflix Ribbon

    1. 什么是负载均衡? 负载均衡是一种基础的网络服务,它的核心原理是按照指定的负载均衡算法,将请求分配到后端服务集群上,从而为系统提供并行处理和高可用的能力.提到负载均衡,你可能想到nginx.对于负 ...

  4. SpringCloud(4)---Ribbon服务调用,源码分析

    SpringCloud(4)---Ribbon 本篇模拟订单服务调用商品服务,同时商品服务采用集群部署. 注册中心服务端口号7001,订单服务端口号9001,商品集群端口号:8001.8002.800 ...

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

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

  6. java框架之SpringCloud(4)-Ribbon&Feign负载均衡

    在上一章节已经学习了 Eureka 的使用,SpringCloud 也提供了基于 Eureka 负载均衡的两种方案:Ribbon 和 Feign. Ribbon负载均衡 介绍 SpringCloud ...

  7. spring-cloud配置ribbon负载均衡

    spring-cloud配置ribbon负载均衡 ribbon提供的负载均衡就是开箱即用的,简单的不能再简单了 为了顺利演示此demo,你需要如下 需要提前配置eureka服务端,具体看 https: ...

  8. 浅谈SpringCloud (三) Ribbon负载均衡

    什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...

  9. SpringCloud之Ribbon:负载均衡

    Spring Cloud集成了Ribbon,结合Eureka,可实现客户端的负载均衡. 下面实现一个例子,结构下图所示. 一.服务器端 1.创建项目 开发工具:IntelliJ IDEA 2019.2 ...

随机推荐

  1. laravel中redis数据库的简单使用

    1.简介 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s . 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Set ...

  2. Leetcode Week4 Find Minimum in Rotated Sorted Array II

    Question Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforeha ...

  3. 【PAT甲级】1118 Birds in Forest (25分)(并查集)

    题意: 输入一个正整数N(<=10000),接着输入N行数字每行包括一个正整数K和K个正整数,表示这K只鸟是同一棵树上的.输出最多可能有几棵树以及一共有多少只鸟.接着输入一个正整数Q,接着输入Q ...

  4. linux - 查看 python 版本

    命令 python -V 结果

  5. 开放系统互联(OSI)模型

    开放系统互联(OSI)模型 是由国际标准化组织(ISO)于1984年提出的一种标准参考模型,是一种关于由不同供应商提供的不同设备和应用软件之间的网络通信的概念性框架结构.它被公认为是计算机通信和 in ...

  6. JS的冒泡事件

      在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的 ...

  7. url跳转问题

    window.history.replaceState(null, null, "/callPlanning/1") //替换路径不刷新页面 window.location.rep ...

  8. AcWing 1027. 方格取数

    #include<iostream> using namespace std ; ; *N][N][N]; int w[N][N]; int n; int main() { cin> ...

  9. python中os.sep的作用以及sys._getframe().f_back.f_code.co_xxx的含义

    https://blog.csdn.net/gufenchen/article/details/98338552

  10. 【Python】遍历循环