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. Codeforces Round #620 (Div. 2) A-F代码 (暂无记录题解)

    A. Two Rabbits (手速题) #include<bits/stdc++.h> using namespace std; typedef long long ll; int ma ...

  2. Milking Time POJ - 3616 dp 感觉像背包

    #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...

  3. dubbo的服务consumer与provider使用的api版本不一致,是否有影响

    dubbo的服务consumer与provider使用的api版本不一致,是否有影响 最近新接手一个项目,看到定义的dubbo接口有些很奇葩的设定. 一.消费端 与 服务端 调用的接口中的数据包装类型 ...

  4. QT版本

    最近在linux下安装qt:发现主要的问题是qt的版本问题:下面来谈谈各个版本的理解 Qt 的版本是按照不同的图形系统来划分的,目前分为五个版本: Win: 适用于Miccrosoft Windows ...

  5. 笔记本u盘插上不显示

    u盘突然拔出笔记本再次插入时不显示: 解决方法:我的电脑-设备管理器-其他设备(你的U盘驱动)-卸载 再重新插上去,即可显示

  6. redis 安装以及配置

    centos 安装 yum install redis-server 配置 配置文件redis.conf 配置访问密码 # requirepass foobared requirepass 指定密码1 ...

  7. [Codechef - AASHRAM] Gaithonde Leaves Aashram - 线段树,DFS序

    [Codechef - AASHRAM] Gaithonde Leaves Aashram Description 给出一棵树,树的"N"节点根植于节点1,每个节点'u'与权重a[ ...

  8. TD - 数据验证

    基本方法 this.assetCounts.focus();//聚焦 this.btnSave.cancel();//按钮取消 this.assetPerson.isValid()//是否有效,tru ...

  9. LoadRunner使用记录

    基本术语 性能测试--通过自动化的测试工具模拟多种正常.峰值以及异常负载条件来对系统的各项性能指标进行测试. 负载测试和压力测试都属于性能测试,两者可以结合进行. 负载测试,确定在各种工作负载下系统的 ...

  10. 刷题75. Sort Colors

    一.题目说明 题目75. Sort Colors,给定n个整数的列表(0代表red,1代表white,2代表blue),排序实现相同颜色在一起.难度是Medium. 二.我的解答 这个是一个排序,还是 ...