1.Ribbon默认使用RoundRobinRule策略轮询选择server

策略名 策略声明 策略描述 实现说明
BestAvailableRule
public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule
选择一个最小的并发请求的server 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
AvailabilityFilteringRule public class AvailabilityFilteringRule extends PredicateBasedRule 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态
WeightedResponseTimeRule public class WeightedResponseTimeRule extends RoundRobinRule 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成status时,使用roubine策略选择server。
RetryRule public class RetryRule extends AbstractLoadBalancerRule 对选定的负载均衡策略机上重试机制 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRule public class RoundRobinRule extends AbstractLoadBalancerRule roundRobin方式轮询选择server 轮询index,选择index对应位置的server
RandomRule
public class RandomRule extends AbstractLoadBalancerRule

随机选择一个server

在index上随机,选择index对应位置的server

ZoneAvoidanceRule

public class ZoneAvoidanceRule extends PredicateBasedRule

复合判断server所在区域的性能和server的可用性选择server

使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

切换策略

  1.  
    @Configuration
  2.  
    public class ConfigBean {
  3.  
     
  4.  
    // @Bean
  5.  
    // public RestTemplate getRestTemplate() {
  6.  
    // return new RestTemplate();
  7.  
    // }
  8.  
     
  9.  
    @Bean
  10.  
    @LoadBalanced//Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。
  11.  
    public RestTemplate getRestTemplate() {
  12.  
    return new RestTemplate();
  13.  
    }
  14.  
     
  15.  
    @Bean
  16.  
    public IRule myRule()
  17.  
    {
  18.  
    //return new RoundRobinRule();
  19.  
    // return new RandomRule();//达到的目的,用我们重新选择的随机算法替代默认的轮询。
  20.  
    return new RetryRule();
  21.  
    }
  22.  
    }

自定义算法:

配置类(必须不能在启动类和启动类下所包含的子包下面)

  1.  
    public class RandomRule_ZY extends AbstractLoadBalancerRule
  2.  
    {
  3.  
     
  4.  
    // total = 0 // 当total==5以后,我们指针才能往下走,
  5.  
    // index = 0 // 当前对外提供服务的服务器地址,
  6.  
    // total需要重新置为零,但是已经达到过一个5次,我们的index = 1
  7.  
    // 分析:我们5次,但是微服务只有8001 8002 8003 三台,OK?
  8.  
    //
  9.  
     
  10.  
     
  11.  
    private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
  12.  
    private int currentIndex = 0; // 当前提供服务的机器号
  13.  
     
  14.  
    public Server choose(ILoadBalancer lb, Object key)
  15.  
    {
  16.  
    if (lb == null) {
  17.  
    return null;
  18.  
    }
  19.  
    Server server = null;
  20.  
     
  21.  
    while (server == null) {
  22.  
    if (Thread.interrupted()) {
  23.  
    return null;
  24.  
    }
  25.  
    List<Server> upList = lb.getReachableServers();
  26.  
    List<Server> allList = lb.getAllServers();
  27.  
     
  28.  
    int serverCount = allList.size();
  29.  
    if (serverCount == 0) {
  30.  
    /*
  31.  
    * No servers. End regardless of pass, because subsequent passes only get more
  32.  
    * restrictive.
  33.  
    */
  34.  
    return null;
  35.  
    }
  36.  
     
  37.  
    // int index = rand.nextInt(serverCount);// java.util.Random().nextInt(3);
  38.  
    // server = upList.get(index);
  39.  
     
  40.  
     
  41.  
    // private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
  42.  
    // private int currentIndex = 0; // 当前提供服务的机器号
  43.  
    if(total < 5)
  44.  
    {
  45.  
    server = upList.get(currentIndex);
  46.  
    total++;
  47.  
    }else {
  48.  
    total = 0;
  49.  
    currentIndex++;
  50.  
    if(currentIndex >= upList.size())
  51.  
    {
  52.  
    currentIndex = 0;
  53.  
    }
  54.  
    }
  55.  
     
  56.  
     
  57.  
    if (server == null) {
  58.  
    /*
  59.  
    * The only time this should happen is if the server list were somehow trimmed.
  60.  
    * This is a transient condition. Retry after yielding.
  61.  
    */
  62.  
    Thread.yield();
  63.  
    continue;
  64.  
    }
  65.  
     
  66.  
    if (server.isAlive()) {
  67.  
    return (server);
  68.  
    }
  69.  
     
  70.  
    // Shouldn't actually happen.. but must be transient or a bug.
  71.  
    server = null;
  72.  
    Thread.yield();
  73.  
    }
  74.  
     
  75.  
    return server;
  76.  
     
  77.  
    }
  78.  
     
  79.  
    @Override
  80.  
    public Server choose(Object key)
  81.  
    {
  82.  
    return choose(getLoadBalancer(), key);
  83.  
    }
  84.  
     
  85.  
    @Override
  86.  
    public void initWithNiwsConfig(IClientConfig clientConfig)
  87.  
    {
  88.  
    // TODO Auto-generated method stub
  89.  
     
  90.  
    }
  91.  
     
  92.  
    }
  1.  
    @Configuration
  2.  
    public class MySelfRule {
  3.  
    @Bean
  4.  
    public IRule myRule() {
  5.  
    // return new RandomRule();// Ribbon默认是轮询,我自定义为随机
  6.  
    return new RandomRule_ZY();// 我自定义为每台机器5次
  7.  
    }
  8.  
    }

另一配置类(在启动类包里面)

  1.  
    @Configuration
  2.  
    public class ConfigBean {
  3.  
     
  4.  
    // @Bean
  5.  
    // public RestTemplate getRestTemplate() {
  6.  
    // return new RestTemplate();
  7.  
    // }
  8.  
     
  9.  
    @Bean
  10.  
    @LoadBalanced//Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。
  11.  
    public RestTemplate getRestTemplate() {
  12.  
    return new RestTemplate();
  13.  
    }
  14.  
     
  15.  
    // @Bean
  16.  
    // public IRule myRule()
  17.  
    // {
  18.  
    // //return new RoundRobinRule();
  19.  
    // return new RandomRule();//达到的目的,用我们重新选择的随机算法替代默认的轮询。
  20.  
    // return new RetryRule();
  21.  
    // }
  22.  
    }

启动类

  1.  
    @SpringBootApplication
  2.  
    @EnableEurekaClient
  3.  
    //在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效
  4.  
    //@RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MySelfRule.class)
  5.  
    @RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MySelfRule.class)
  6.  
    public class DeptConsumer80_App {
  7.  
    public static void main(String[] args) {
  8.  
    SpringApplication.run(DeptConsumer80_App.class, args);
  9.  
    }
  10.  
    }

测试效果为每个server执行5次再轮询

转自:https://blog.csdn.net/flynn_chen/article/details/80631717

SpringCloud的Ribbon自定义负载均衡算法的更多相关文章

  1. SpringCloud全家桶学习之客户端负载均衡及自定义负载均衡算法----Ribbon(三)

    一.Ribbon是什么? Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端  负载均衡的工具(这里区别于nginx的负载均衡).简单来说,Ribbon是Netf ...

  2. Ribbon源码分析(一)-- RestTemplate 以及自定义负载均衡算法

    如果只是想看ribbon的自定义负载均衡配置,请查看: https://www.cnblogs.com/yangxiaohui227/p/13186004.html 注意: 1.RestTemplat ...

  3. SpringCloud Netflix Ribbon(负载均衡)

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

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

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

  5. springcloud 之Ribbon客户端负载均衡配置使用

    pom.xml添加配置说明:这里服务注册与发现用的是Eureka,所以消费者端需要引入eureka,使用EurekaClient来调用服务 <dependency> <groupId ...

  6. SpringCloud实战-Ribbon客户端负载均衡

    前面我们已经完成了注册中心和服务提供者两个基础组件.接着介绍使用Spring Cloud Ribbon在客户端负载均衡的调用服务. ribbon 是一个客户端负载均衡器,可以简单的理解成类似于 ngi ...

  7. SpringCloud之Ribbon:负载均衡

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

  8. Ribbon自定义负载均衡策略,在网关实现类似Ip_hash的负载均衡,ribbon给单个服务配置属性

    背景: 我需要在网关实现一种功能,某个用户的请求永远打在后台指定的服务,也就是根据ip地址进行负载均衡 原理: 在ribbon的配置类下: 那我们自己创建一个IRule的实现类,模仿ZoneAvoid ...

  9. Spring Cloud Gateway Ribbon 自定义负载均衡

    在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...

随机推荐

  1. Linux服务之Samba服务篇

    Samba服务 桑巴Smb是基于cs架构 作用:用于跨平台进行文件共享 优点:兼容性好,较为安全(具备身份验证) 缺点:仅限内网环境使用 应用:一般在办公环境下使用 rz 也是一种可以在Windows ...

  2. RSA算法在Python Django中的简单应用

    说明 RSA算法是当今使用最广泛,安全度最高的加密算法. • RSA算法的安全性理论基础 [引]根据百科介绍,对极大整数做因数分解的难度决定了RSA算法的可靠性.换言之,对一极大整数做因数分解愈困难, ...

  3. Docker学习(5) 在docker中部署静态网站

    在容器中部署静态网站 设置容器的端口映射 在容器中部署静态网站  -  Nginx部署流程 1 创建映射80端口的交互式容器 2 安装Nginx 3 安装文本编辑器vim 4 创建静态页面 5 修改N ...

  4. 使用Jprofiler分析Java项目的内存开销情况并利用强制回收控制内存

    一.问题背景 自己开发的Java项目中占用太多的Heap Space.即使在Eclipse的虚拟机参数中设置"-Xms128m -Xms2048m -XX:MetaspaceSize=512 ...

  5. CVPR2020最新论文扫描盘点(下)

    CVPR2020最新论文扫描盘点(下) 最近计算机视觉三大顶会之一CVPR2020接收结果已经公布,一共有1470篇论文被接收,接收率为22%,相比去年降低3个百分点,竞争越来越激烈.这里整理来自Tw ...

  6. NVIDIA 认证系统

    NVIDIA 认证系统 AI 是这个时代最强大的技术,需要新一代经过调整和测试的计算机来推动其发展. 自 1 月 27 日开始,可从 NVIDIA 合作伙伴处获取用于数据中心的新型加速服务器,推动 A ...

  7. MinkowskiEngine demo ModelNet40分类

    MinkowskiEngine demo ModelNet40分类 本文将看一个简单的演示示例,该示例训练用于分类的3D卷积神经网络.输入是稀疏张量,卷积也定义在稀疏张量上.该网络是以下体系结构的扩展 ...

  8. Django(53)二次封装Response

    前言 有时候我们使用drf的Response,会发现默认返回的格式不太友好,每次我们都需要写入以下的格式 return Response({ "status": 0, " ...

  9. <题解>幻想乡战略游戏

    洛谷题目 看到题面,很容易就想到,这是要你找树上的重心,只不过这个重心是在带边权的树上 所以对于这个我们在树上找这个重心 一开始我想的是,我要更新权值,然后把每个点的答案更新一下 就取最大值,这好像是 ...

  10. 小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!

    大家好,我是冰河~~ 由于在更新其他专题的文章,Spring系列文章有很长一段时间没有更新了,很多小伙伴都在公众号后台留言或者直接私信我微信催更Spring系列文章. 看来是要继续更新Spring文章 ...