软件系统开发定制Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)

文章目录


Pre

中提到了同一个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


工程

接着 中的工程,我们继续改造。

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 */@Slf4jpublic class SameClusterPriorityRule extends AbstractLoadBalancerRule {    @Autowired    private NacosDiscoveryProperties discoveryProperties;    @Override    public void initWithNiwsConfig(IClientConfig iClientConfig) {    }    @Override    public Server choose(Object key) {        try {            //第一步:获取当前服务所在的集群            String currentClusterName = discoveryProperties.getClusterName();            //第二步:获取一个负载均衡对象            BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) getLoadBalancer();            //第三步:获取当前调用的微服务的名称            String invokedSerivceName = baseLoadBalancer.getName();            //第四步:获取nacos clinet的服务注册发现组件的api            NamingService 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;    }}    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90

随机权重策略

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);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22


配置

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

spring:  cloud:    nacos:      discovery:        server-addr: 1.117.97.88:8848        cluster-name: BeiJingCluster  application:    name: artisan-order-center
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

spring:   cloud:    nacos:      discovery:        server-addr: 1.117.97.88:8848        cluster-name: GuangDongCluster  application:    name: artisan-product-center
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

验证

artisan-cloud-customcfg-ribbon-order      ----    cluster-name: BeiJingCluster artisan-cloud-customcfg-ribbon-product   ----     cluster-name: BeiJingCluster 	 artisan-cloud-customcfg-ribbon-product   ----     cluster-name: GuangDongCluster 	 
  • 1
  • 2
  • 3
  • 4

启动一个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 】

再次调用 ,观察日志

这样就实现了刚才的需求


源码

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发