教程倉庫: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概述
下篇: