日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2025/3/21 javascript 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Pre
  • 需求
  • 工程
  • Code
    • 繼承AbstractLoadBalancerRule實現自定義Rule
    • 隨機權重策略
  • 配置
  • 驗證
  • 源碼


Pre

Spring Cloud Alibaba - 05 Nacos 領域模型_NameSpac/Group/Cluster

中提到了同一個Namespace下 + 同一個Group下, 不同Cluster 內的服務,可以互相訪問.

如果我們要想實現一個 同集群優先權重負載均衡算法, 怎么辦呢?

比如實現如下調用


需求

舉個例子: 有兩個微服務artisan-order-center, artisan-product-center 。我們在北京機房部署一套artisan-order-center,artisan-product-center。為了容災處理,我們在廣東同樣部署一套artisan-order-center,artisan-product-center 。

但是 北京的artisan-order-center 訪問廣東的 artisan-product-center 畢竟不如調用本地的artisan-product-center快。 如果本地的artisan-product-center掛掉了,那么再訪問廣東的artisan-product-center。


工程

接著 Spring Cloud Alibaba - 10 Ribbon 自定義負載均衡策略(權重算法) 中的工程,我們繼續改造。

Code

繼承AbstractLoadBalancerRule實現自定義Rule

package com.artisan.customrules;import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.ribbon.NacosServer; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.AbstractLoadBalancerRule; import com.netflix.loadbalancer.BaseLoadBalancer; import com.netflix.loadbalancer.Server; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils;import java.util.ArrayList; import java.util.List;/*** @author 小工匠* @version 1.0* @description: 同一個集群優先調用策略* @date 2022/2/3 0:47* @mark: show me the code , change the world*/@Slf4j public class SameClusterPriorityRule extends AbstractLoadBalancerRule {@Autowiredprivate NacosDiscoveryProperties discoveryProperties;@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}@Overridepublic Server choose(Object key) {try {//第一步:獲取當前服務所在的集群String currentClusterName = discoveryProperties.getClusterName();//第二步:獲取一個負載均衡對象BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) getLoadBalancer();//第三步:獲取當前調用的微服務的名稱String invokedSerivceName = baseLoadBalancer.getName();//第四步:獲取nacos clinet的服務注冊發現組件的apiNamingService namingService = discoveryProperties.namingServiceInstance();//第五步:獲取所有的服務實例List<Instance> allInstance = namingService.getAllInstances(invokedSerivceName);List<Instance> theSameClusterNameInstList = new ArrayList<>();//第六步:過濾篩選同集群下的所有實例for (Instance instance : allInstance) {if (StringUtils.endsWithIgnoreCase(instance.getClusterName(), currentClusterName)) {theSameClusterNameInstList.add(instance);}}Instance toBeChooseInstance;//第七步:選擇合適的一個實例調用if (theSameClusterNameInstList.isEmpty()) {toBeChooseInstance = ArtisanWeightedBalancer.chooseInstanceByRandomWeight(allInstance);log.info("發生跨集群調用--->當前微服務所在集群:{},被調用微服務所在集群:{},Host:{},Port:{}",currentClusterName, toBeChooseInstance.getClusterName(), toBeChooseInstance.getIp(), toBeChooseInstance.getPort());} else {toBeChooseInstance = ArtisanWeightedBalancer.chooseInstanceByRandomWeight(theSameClusterNameInstList);log.info("同集群調用--->當前微服務所在集群:{},被調用微服務所在集群:{},Host:{},Port:{}",currentClusterName, toBeChooseInstance.getClusterName(), toBeChooseInstance.getIp(), toBeChooseInstance.getPort());}return new NacosServer(toBeChooseInstance);} catch (NacosException e) {log.error("同集群優先權重負載均衡算法選擇異常:{}", e);}return null;} }

隨機權重策略

package com.artisan.customrules;import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.client.naming.core.Balancer;import java.util.List;/*** @author 小工匠* @version 1.0* @description: 根據權重選擇隨機選擇一個* @date 2022/2/3 0:28* @mark: show me the code , change the world*/public class ArtisanWeightedBalancer extends Balancer {public static Instance chooseInstanceByRandomWeight(List<Instance> hosts) {return getHostByRandomWeight(hosts);} }


配置

artisan-cloud-customcfg-ribbon-order 中的 nacos配置

spring:cloud:nacos:discovery:server-addr: 1.117.97.88:8848cluster-name: BeiJingClusterapplication:name: artisan-order-center

artisan-cloud-customcfg-ribbon-product 中的 nacos配置

spring: cloud:nacos:discovery:server-addr: 1.117.97.88:8848cluster-name: GuangDongClusterapplication:name: artisan-product-center

驗證

artisan-cloud-customcfg-ribbon-order ---- cluster-name: BeiJingCluster artisan-cloud-customcfg-ribbon-product ---- cluster-name: BeiJingCluster artisan-cloud-customcfg-ribbon-product ---- cluster-name: GuangDongCluster

啟動一個artisan-cloud-customcfg-ribbon-order和兩個 artisan-cloud-customcfg-ribbon-product 工程后,

通過artisan-cloud-customcfg-ribbon-order 【BeiJingCluster 】訪問 artisan-cloud-customcfg-ribbon-product

查看artisan-cloud-customcfg-ribbon-order 日志


我們下線 artisan-cloud-customcfg-ribbon-order 【BeiJingCluster 】

再次調用 ,觀察日志

這樣就實現了剛才的需求


源碼

https://github.com/yangshangwei/SpringCloudAlibabMaster

總結

以上是生活随笔為你收集整理的Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。