教程仓库:github Spring-Cloud-Alibaba-Learning
教程索引页:index Spring-Cloud-Alibaba-Learning
源码地址
本篇内容的项目地址为:手写负载均衡器
目标
- 自定义一个简易版负载均衡器
- 使用自定义的负载均衡器,完成service-a对service-b的远程调用
前置知识
- 对日志有所了解(本仓库中主要使用lombok slf4j)
- 已学习完1.Nacos下的全部内容
流程
本节只涉及service-a下的编码,不涉及service-b的编码。(service-b沿用1.Nacos最后一个版本的代码即可)
-
手写一个简单的负载均衡器
这里的负载均衡器很简单,就是传入一个节点数组的size,随机返回一个节点的下标。
/** * 负载均衡器 */ public class LoadBalancer { /** * 在[0,size)中选择一个整数 */ public static int selectOneRandomly(int size){ if(size == 0)return -1; return ThreadLocalRandom.current().nextInt(size); } }
-
修改RemotingController,调用自定义负载均衡器来实现负载均衡
修改的核心代码如下
List<ServiceInstance> instances = discoveryClient.getInstances("service-b"); //discoveryClient.getInstances是不会返回null的, //如果找不到会返回new ArrayList<>(),所以不用判断instances为null if(instances.size() == 0)return "failed"; //调用负载均衡器,确定请求的目标地址 int targetIndex = LoadBalancer.selectOneRandomly(instances.size()); String targetUrl = instances.get(targetIndex).getUri().toString() + "/test/{argue}";
测试
-
启动Nacos
-
启动service-a
-
启动若干个service-b实例(设为不同端口即可)
-
调用service-a下的remote服务,查看日志:
可以看到请求的目标地址的端口是随机出现的,说明负载均衡执行成功。
上篇:Spring Cloud Alibaba教程——Ribbon概述
下篇: