LoadBalance已有策略

  LoadBalance的源码中已有两种策略,RandomLoadBalancer(随机)、RoundRobinLoadBalancer(轮询,默认的负载均衡策略)。

LoadBalance自定义策略

   以下为使用自定义负载均衡策略的样例,根据配置服务提供者的权重,按比例随机访问服务器。仅展示自定义负载均衡策略相关的部分,Eureka等其他相关代码不作展示。提供两个服务提供者,端口分别为11000,11001。

自定义负载均衡策略

public class WeightLoadBalancer implements ReactorServiceInstanceLoadBalancer {final String serviceId;ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;public WeightLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,String serviceId) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;}@Overridepublic Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);return supplier.get(request).next().map(this::select);}private Response<ServiceInstance> select(List<ServiceInstance> instances) {if (instances.isEmpty()) {return new EmptyResponse();}// 简单模拟权重,仅作演示// 11000:3  11001:1int[] ports = {11000, 11000, 11000, 11001};int port = ports[ThreadLocalRandom.current().nextInt(ports.length)];for (ServiceInstance instance : instances) {if (port == instance.getPort()) {return new DefaultResponse(instance);}}return new DefaultResponse(instances.get(0));}
}

LoadBalance配置类

public class MyLoadBalanceConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);// 随机
//        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);// 轮询
//        return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);// 权重,自定义return new WeightLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

启动类设置LoadBalance配置

@SpringBootApplication
@EnableDiscoveryClient
@LoadBalancerClients(@LoadBalancerClient(name = "cloud-payment-service", configuration = MyLoadBalanceConfig.class)
)
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}

调用的Controller

@Controller
@RequestMapping("/order")
public class OrderController {@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping("/loadBalance")public void loadBalance(){ServiceInstance instance = loadBalancerClient.choose("cloud-payment-service");System.out.println("port:" + instance.getPort());}
}

多次访问的效果如下:

port:11000
port:11000
port:11000
port:11000
port:11000
port:11000
port:11001
port:11000
port:11000
port:11000
port:11001
port:11000
port:11000
port:11001

LoadBalance自定义负载均衡策略相关推荐

  1. SpringCloud Ribbon(二)之自定义负载均衡策略IRule

    一.Ribbon负载均衡策略 一个服务对应一个LoadBalancer,一个LoadBalancer只有一个Rule,LoadBalancer记录服务的注册地址,Rule提供从服务的注册地址中找出一个 ...

  2. Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)

    文章目录 Pre 需求 工程 Code 继承AbstractLoadBalancerRule实现自定义Rule 随机权重策略 配置 验证 源码 Pre Spring Cloud Alibaba - 0 ...

  3. Ribbon 自定义负载均衡策略

    Ribbon默认的负载均衡策略默认的有下面几种: 我们也可以自定义负载均衡策略: 修改springcloud-consumer-dept-80的主启动类: 下面开始编写自定义配置类MySelfRule ...

  4. Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)

    文章目录 Pre 工程 首先屏蔽细粒度配置 然后通过代码设置一个全局配置 指定 GlobalRibbonConfig GlobalRibbonConfig 设置负载均衡策略 开发自定义策略 (权重访问 ...

  5. 自定义负载均衡策略:

    我们刚刚讲过,只要实现了IRule就可以完成自定义负载均衡,至于具体怎么来,我们先看看他默认的实现 /*** Copyright 2013 Netflix, Inc.** Licensed under ...

  6. 追踪源码自定义负载均衡策略

    我们来了解一下负载均衡的源码,是怎么实现的,它是怎么实现的,开始我们说了第三种方式只是用了一个注解,实质上是和第二种方式是一模一样的,那么为了方便观察呢,这里使用第二种方式,来查看源码ServiceI ...

  7. spring cloud中通过配置文件自定义Ribbon负载均衡策略

    2019独角兽企业重金招聘Python工程师标准>>> spring cloud中通过配置文件自定义Ribbon负载均衡策略 博客分类: 微服务 一.Ribbon中的负载均衡策略 1 ...

  8. SpringCloud Ribbon中的7种负载均衡策略!

    作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而 ...

  9. tedu 四阶段springcloud学习day02学习总结(idea连接数据库/nacos远端调用及负载均衡策略/Feign方式远端调用)

    目录 查看接口有哪些实现类 ctrl + h 一.cmd方式启动Nacos的命令 二.在IDEA中打开MySQL数据库 第一步: 打开View中数据库的工具栏 第二步:添加数据库为MySql 第三步: ...

最新文章

  1. commons-lang StringUtils#split的坑
  2. agx 安装ros opencv_怎样在ROS下实现基于YOLO的px4无人机目标检测?
  3. Mac OS使用技巧之十三:Finder中标记的使用
  4. P4249-[WC2007]剪刀石头布【费用流】
  5. php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序
  6. C#开发笔记之01-为什么开源框架会大量的使用protected virtual?
  7. 荣耀折叠屏手机发布日期曝光?将主打年轻用户
  8. java拆分list_Java平均拆分list
  9. springboot项目层次结构_Springboot项目结构Springboot项目结构
  10. 基于扩展性考虑,不同场景选择的不同方案
  11. 2021-06-26初识JavaScript
  12. matlab 7.0安装教程
  13. 判断是否为回文字符串
  14. 软件测试的目的、原则及流程
  15. Mezzanine基于 Django 的CMS系统框架搭建
  16. 邮箱注册的html怎么写,邮箱格式怎么写 邮箱的正确写法
  17. SSD硬盘,先不要用在Server上
  18. 关系数据模型和SQL基础
  19. 为什么理工类专业成绩好的人,英语总是很差?
  20. error: cannot connect to daemon解决办法

热门文章

  1. idea创建项目 详细步骤教程
  2. java 中counter什么意思_(java初学)如何使用java写一个页面计数器?
  3. 关于5037端口的占用解决方法
  4. P1424小鱼的航程-C++编程解析-循环
  5. java根据商品编号查找商品_查询商品分类下的所有商品(分类级别不限)
  6. hdu 诡异的楼梯(BFS)
  7. mongoDB备份,还原命令
  8. 深入浅出CChart 每日一课——快乐高四第三十课 麦正帮主,ActiveX控件巨鲸帮巨鲸岛之易语言篇
  9. 南邮CTF:WEB 起名字真难
  10. Linux根目录文件汇总