文章目录

  • 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 自定义负载均衡策略(同集群优先权重负载均衡算法)相关推荐

  1. Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)

    文章目录 Pre 工程 首先屏蔽细粒度配置 然后通过代码设置一个全局配置 指定 GlobalRibbonConfig GlobalRibbonConfig 设置负载均衡策略 开发自定义策略 (权重访问 ...

  2. Spring Cloud Alibaba gateway ribbon 自定义负载均衡规则。发散灰度发布,金丝雀测试等

    上一篇介绍了,ribbon的组件.本篇要自己写一个灰度方案.其实就是一个很简单的思维扩散. 需求 前端header请求携带version字段.路由服务根据version去需要对应版本的服务集合,进行或 ...

  3. dubbo调用失败策略_面试官:dubbo负载均衡策略,集群容错策略,动态代理策略有哪些...

    面试官心理分析 继续深问吧,这些都是用 dubbo 必须知道的一些东西,你得知道基本原理,知道序列化是什么协议,还得知道具体用 dubbo 的时候,如何负载均衡,如何高可用,如何动态代理. 说白了,就 ...

  4. Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些?

    Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些? 面试题 dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢? 面试官心理分析 继续深问吧,这些都是用 dubbo 必须 ...

  5. Spring Cloud Alibaba - 14 OpenFeign自定义配置 + 调用优化 + 超时时间

    文章目录 打印Feign调用日志 日志级别 三部曲 step1 添加Feign的自定义配置 step2 声明式接口指定配置 Step3 声明式接口包日志级别调整为DEBUG 验证 基于yml文件细粒度 ...

  6. Spring Cloud Alibaba - 07 Ribbon 应用篇及内置的负载均衡算法

    文章目录 Ribbon整合三部曲 artisan-cloud-ribbon-order step1 搞依赖 step2 搞注解 (在RestTemplate上加入@LoadBalanced注解) St ...

  7. Spring Cloud Alibaba 微服务1,系统架构演变 + Nginx反向代理与负载均衡

    目录 专栏导读 一.系统架构演变 二.什么是Nginx? 三.servername匹配规则 四.正向代理与反向代理 1.正向代理 2.反向代理 3.LVS 五.负载均衡策略 1.轮询 2.权重 3.i ...

  8. dubbo负载均衡策略和集群容错策略

    dubbo负载均衡策略 random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权 ...

  9. Spring Cloud Alibaba - 08 Ribbon 两种方式实现细粒度自定义配置控制微服务的负载均衡策略

    文章目录 需求 工程 java代码实现细粒度配置 (不推荐) 配置实现细粒度配置 (推荐) 源码 需求 假设我们有个场景: Order-Center 需要采用随机算法调用产品中心 , 而采用轮询算法调 ...

最新文章

  1. 列举ospf的5种报文类型_这5种“专升本”你都知道吗?那个含金量更高呢?报考如何选择?...
  2. html5图像调整大小,JavaScript调整HTML5画布中图像的大小
  3. LeetCode Reverse Words in a String III
  4. C. Number of Pairs
  5. 国科大高级人工智能2-人工神经网络(MLP、Hopfield)
  6. 21.和和instance of
  7. 用JS实现的常见几种排序算法
  8. 自动锁定计算机怎么设置,win10如何设置自动锁定屏幕_win10设置自动锁屏的步骤...
  9. eclipse Git使用教程
  10. php 字符显示不出来,ps文字显示不出来怎么办?
  11. android视频录制旋转,android – 录制的视频在上传到互联网后旋转90度
  12. Oracle数据库表空间数据文件最大容量以及存满时处理方法
  13. 内存颗粒位宽和容量_【科普】内存颗粒版本判断方法和编号解析V2.0
  14. python报错(一):takes no arguments
  15. Linux学习笔记(3)- 网络编程以及范例程序
  16. java excel 导出数据文件格式无效
  17. 【服务器数据恢复】存储之间迁移数据时数据损坏的数据恢复案例
  18. 热敏电阻VS模拟温度传感器
  19. 数字基建-高速公路智慧建造管控平台
  20. 互联网巨头挺进银行的逻辑分析

热门文章

  1. N叉树的深度 python实现
  2. php连接到mysql数据库,PHP MySQL:连接到MySQL数据库
  3. 11. Leetcode 713. 乘积小于K的子数组 (数组-同向双指针-滑动窗口)
  4. Leetcode 103. 二叉树的锯齿形层序遍历 (每日一题 20210924)
  5. Leetcode 989. 数组形式的整数加法 (每日一题 20210826 同类型题)
  6. Leetcode - 144. Binary Tree Preorder Traversal (层次遍历)
  7. NTU 课程笔记: PNP
  8. 文巾解题 82. 删除排序链表中的重复元素 II
  9. MATLAB应用实战系列(七十七)-【图像处理】COVID-19 防疫应用口罩检测
  10. matlab中step_使用MATLAB中bertool进行通信仿真