Spring Cloud Alibaba教程——手寫負載均衡器

教程倉庫:github Spring-Cloud-Alibaba-Learning


教程索引頁:index Spring-Cloud-Alibaba-Learning



源碼地址

本篇內容的項目地址爲:手寫負載均衡器

目標

  1. 自定義一個簡易版負載均衡器
  2. 使用自定義的負載均衡器,完成service-a對service-b的遠程調用

前置知識

  1. 對日誌有所瞭解(本倉庫中主要使用lombok slf4j)
  2. 已學習完1.Nacos下的全部內容

流程

本節只涉及service-a下的編碼,不涉及service-b的編碼。(service-b沿用1.Nacos最後一個版本的代碼即可)

  1. 手寫一個簡單的負載均衡器

    這裏的負載均衡器很簡單,就是傳入一個節點數組的size,隨機返回一個節點的下標。

    /**
     * 負載均衡器
     */
    public class LoadBalancer {
    
        /**
         * 在[0,size)中選擇一個整數
         */
        public static int selectOneRandomly(int size){
            if(size == 0)return -1;
            return ThreadLocalRandom.current().nextInt(size);
        }
    
    }
    
  2. 修改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}";
    

測試

  1. 啓動Nacos

  2. 啓動service-a

  3. 啓動若干個service-b實例(設爲不同端口即可)

  4. 調用service-a下的remote服務,查看日誌:

    日誌信息

    可以看到請求的目標地址的端口是隨機出現的,說明負載均衡執行成功。



上篇:Spring Cloud Alibaba教程——Ribbon概述
下篇:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章