基于nacos注册中心的ribbon定制规则
前面说到基于nacos的注册发现有可以扩展实现我们自己的负载均衡算法(Nacos数据模型),来实现同集群调用,是基于spring.cloud.nacos.discovery.cluster-name参数。另外基于spring.cloud.nacos.discovery.metadata参数也可以实现金丝雀发布调用。这里就使用ribbon来实现这两种负载均衡算法。
直接使用feign调用,因为feign里面就是用的ribbon,引入feign依赖也就引入了ribbon
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.继承com.netflix.loadbalancer.AbstractLoadBalancerRule 实现自己的负载均衡算法,从NacosDiscoveryProperties中获取实例信息,然后筛选出来cluster-name和metadata中version相同的实例,进行调用。
package com.nijunyang.order.ribbon.rule; import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.ribbon.NacosServer;
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.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List; /**
* Description: 集群和版本规则
* Created by nijunyang on 2020/12/14 21:36
*/
@Slf4j
public class ClusterWithVersionRule extends AbstractLoadBalancerRule { @Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties; /**
* 重写choose方法
* @param key
* @return
*/
@SneakyThrows
@Override
public Server choose(Object key) {
//获取服务配置的集群名
String clusterName = nacosDiscoveryProperties.getClusterName();
//当前的版本号 配置文件配置的metadata信息
String currentVersion = nacosDiscoveryProperties.getMetadata().get("version");
//获取负载均衡器
BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) getLoadBalancer();
//调用服务的名字
String invokedServerName = baseLoadBalancer.getName();
//获取namingServer(包含nacos注册发现相关api)
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
//获取被调用的服务的所有实例
List<Instance> invokedAllInstanceList = namingService.getAllInstances(invokedServerName);
//同集群同版本
List<Instance> theSameClusterAndVersionList = new ArrayList<>();
//跨集群同版本
List<Instance> theSameVersionList = new ArrayList<>();
for (Instance instance : invokedAllInstanceList) {
if (clusterName.equalsIgnoreCase(instance.getClusterName())
&& currentVersion.equalsIgnoreCase(instance.getMetadata().get("version"))) {
theSameClusterAndVersionList.add(instance);
} else if (currentVersion.equalsIgnoreCase(instance.getMetadata().get("version"))) {
theSameVersionList.add(instance);
}
}
Instance invokedInstance;
if (theSameClusterAndVersionList.isEmpty()) {
//跨集群同版本调用, 随机选一个
if (theSameVersionList.isEmpty()) {
throw new RuntimeException("无对应版本服务");
}
SecureRandom random = new SecureRandom();
int i = random.nextInt(theSameVersionList.size());
invokedInstance = theSameVersionList.get(i);
} else {
//同集群同版本调用 随机选一个
SecureRandom random = new SecureRandom();
int i = random.nextInt(theSameClusterAndVersionList.size());
invokedInstance = theSameClusterAndVersionList.get(i);
}
return new NacosServer(invokedInstance);
} @Override
public void initWithNiwsConfig(IClientConfig iClientConfig) { }
}
2.配置自定义的负载均衡算法
spring:
application:
name: order
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #不用写协议
# namespace: 688bf906-8b48-4ee2-a433-828f042ec860 #test id
# group: pay
cluster-name: CD
metadata:
version: v2 ribbon:
NFLoadBalancerRuleClassName: com.nijunyang.order.ribbon.rule.ClusterWithVersionRule #指定全局的负载均衡算法
eager-load:
enabled: true #饥饿加载(ribbon客户端不是在服务启动的时候加载的,所以可能第一次调用会很慢,甚至超时)
clients: stock #指定哪些服务使用饥饿加载
#按服务指定负载均衡算法
stock:
ribbon:
NFLoadBalancerRuleClassName: com.nijunyang.order.ribbon.rule.ClusterWithVersionRule
eager-load:
enabled: true
当需要指定某一服务使用某一负载均衡算法的时候,不要让spring容器扫描到该规则。在配置文件中如上配置即可。
完整代码:https://github.com/bluedarkni/study/tree/master/cloud-alibaba
基于nacos注册中心的ribbon定制规则的更多相关文章
- Spring Cloud 系列之 Alibaba Nacos 注册中心(一)
前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...
- 手动造轮子——为Ocelot集成Nacos注册中心
前言 近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断. ...
- Spring Cloud 系列之 Alibaba Nacos 注册中心(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Alibaba Nacos 注册中心(一) 本篇文章讲解 Nacos 注册中心集群环境搭建. Nacos 集群环境搭建 ...
- SpringCloud Alibaba实战(7:nacos注册中心管理微服务)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...
- Nacos注册中心之概要设计
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 前言 在之前的文章中分析了Nacos配置中心,配置中心的核心是配置的创建.读取.推送. 注册中 ...
- Nacos注册中心和配置中心流程原理
一.Nacos注册中心 1.服务启动后---->服务注册原理 springCloud集成Nacos实现原理: 服务启动时,在spring-cloud-commons包下 spring.facto ...
- 5-2 Nacos注册中心
Nacos注册中心 什么Nacos Nacos是Spring Cloud Alibaba提供的一个软件 这个软件主要具有注册中心和配置中心的功能 我们先学习它注册中心的功能 微服务中所有项目都必须注册 ...
- Spring Cloud Alibaba 使用nacos 注册中心
### 背景 上一文我们讲到了如何去搭建注册中心,这一次我们讲述如何使用nacos作为注册中心 ### spring-cloud-alibaba-basis 创建基础依赖 首先我们创建一个spring ...
- Spring Cloud Alibaba(4)---Nacos(注册中心)
Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...
随机推荐
- php(tp5)生成条形码
因为公司业务需要,研究了一下条形码 1.下载barcodegen扩展包 官网地址:https://www.barcodebakery.com 2.下载完后解压至 extend 文件夹里面,然后复制以下 ...
- 他凭借这70份PDF,3170页文件,成功斩获了含BATJ所有的offer
前言 最近我一直在面试高级工程师,不管初级,高级,程序员,我想面试前,大家刷题一定是是少不了吧. 我也一样,我在网上找了很多面试题来看,最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,索性 ...
- 真的可惜,四面阿里,结果我被JVM垃圾回收机制与 OOM异常卡住了
前言 为什么需要垃圾回收 首先我们来聊聊为什么会需要垃圾回收,假设我们不进行垃圾回收会造成什么后果,我们举一个简单的例子 我们住在一个房子里面,我们每天都在里面生活,然后垃圾都丢在房子里面,又不打扫, ...
- ssh命令的常用使用场景
目录 一.最简单的登陆 二.登陆+执行命令 三.端口转发 四.参考 一.最简单的登陆 就是简单登陆一下主机,默认端口22 ssh {hostname}@{host_ip} ➜ Charles ssh ...
- Java蓝桥杯——递归练习题:走台阶(偶数版)
递归练习题:走台阶(偶数版) 小明刚刚看完电影<第39级台阶>.离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个 ...
- Java基础教程——线程池
启动新线程,需要和操作系统进行交互,成本比较高. 使用线程池可以提高性能-- 线程池会提前创建大量的空闲线程,随时待命执行线程任务.在执行完了一个任务之后,线程会回到空闲状态,等待执行下一个任务.(这 ...
- Java集合【7】--List接口超级详细解析
目录 1.List接口的特性 2.List接口的源码解析 3.相关子类介绍 3.1 ArrayList 3.1.1 成员变量 3.1.2 构造方法 3.1.3 常用增删改查方法 添加元素 查询元素 更 ...
- LaTex中的中文处理方法
相关代码与注释: 显示效果:
- jvm系列(一)运行时数据区
C++程序员肩负着每一个对象生命周期开始到终结的维护责任.Java程序员则可以借助自动内存管理机制,不需要自己手动去释放内存.由虚拟机进行内存管理,不容易出现内存泄漏和内存溢出的问题,但是一旦出现这些 ...
- 20200116_centos7.2 下 mysql_5.7修改root密码
1. 需改my.cnf文件 [root@rakinda-iot-platform ~]# vim /etc/my.cnf 2. 新增一行, 登录时跳过密码, 保存后退出, 重启mysql system ...