【自研网关系列】整合 Nacos 配置拉取与配置变更信息的订阅

2024-04-13 21:44

本文主要是介绍【自研网关系列】整合 Nacos 配置拉取与配置变更信息的订阅,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🌈Yu-Gateway:基于 Netty 构建的自研 API 网关,采用 Java 原生实现,整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施,承载请求路由、安全控制、流量治理等核心网关职能。

🌈项目代码地址:GitHub - YYYUUU42/YuGateway-master

如果该项目对你有帮助,可以在 github 上点个 ⭐ 喔 🥰🥰

🌈自研网关系列:可以点开专栏,参看完整的文档

目录

1、将配置弄到 Nacos 上

2、编写配置中心接口

3、实现流程


1、将配置弄到 Nacos 上

配置在项目底下有

配置文件含义可以在核心请求url的规则匹配类中查看,有详细注解

2、编写配置中心接口

上偏文章主要就是实现注册中心的服务注册功能,这里就实现配置中心的配置拉取以及配置变更监听的功能。

首先还是需要定义一个配置中心接口来初始化配置中心配置以及配置中心信息变更事件

/*** @author yu* @description 配置中心接口方法*/
public interface ConfigCenter {/*** 初始化配置中心配置** @param serverAddr 配置中心地址* @param env        环境*/void init(String serverAddr, String env);/*** 订阅配置中心配置变更** @param listener 配置变更监听器*/void subscribeRulesChange(RulesChangeListener listener);
}
/*** @author yu* @description 规则变更监听器*/
public interface RulesChangeListener {/*** 规则变更时调用此方法 对规则进行更新** @param rules 新规则*/void onRulesChange(List<Rule> rules);
}

3、实现流程

这里依然会用 debug 的方式进行详细讲

完整启动代码:

public static void main(String[] args) {//加载网关核心静态配置Config config = ConfigLoader.getInstance().load(args);//插件初始化//配置中心管理器初始化,连接配置中心,监听配置的新增、修改、删除ServiceLoader<ConfigCenter> serviceLoader = ServiceLoader.load(ConfigCenter.class);final ConfigCenter configCenter = serviceLoader.findFirst().orElseThrow(() -> {log.error("can't found ConfigCenter impl");return new RuntimeException("can't found ConfigCenter impl");});//从配置中心获取数据configCenter.init(config.getRegistryAddress(), config.getEnv());configCenter.subscribeRulesChange(new RulesChangeListener() {@Overridepublic void onRulesChange(List<Rule> rules) {DynamicConfigManager.getInstance().putAllRule(rules);}});//启动容器Container container = new Container(config);container.start();//连接注册中心final RegisterCenter registerCenter = registerAndSubscribe(config);//服务停机//收到 kill 信号时触发,服务停机Runtime.getRuntime().addShutdownHook(new Thread() {/*** 服务停机*/@Overridepublic void run() {registerCenter.deregister(buildGatewayServiceDefinition(config),buildGatewayServiceInstance(config));container.shutdown();}});}

首先,还是一样从 META-INF/services 下利用 SPI 获取实现类

ServiceLoader<ConfigCenter> serviceLoader = ServiceLoader.load(ConfigCenter.class);
final ConfigCenter configCenter = serviceLoader.findFirst().orElseThrow(() -> {log.error("can't found ConfigCenter impl");return new RuntimeException("can't found ConfigCenter impl");
});

初始化:将配置中的信息弄到配置中心那里,主要还是创建一个 ConfigService,是 Nacos 提供的与配置中心进行交互的接口

/**
* 初始化配置中心配置
*
* @param serverAddr 配置中心地址
* @param env        环境
*/
@Override
public void init(String serverAddr, String env) {this.serverAddr = serverAddr;this.env = env;try {this.configService = NacosFactory.createConfigService(serverAddr);} catch (NacosException e) {log.error("NacosConfigCenter init failed ", e);throw new RuntimeException(e);}
}

初始化完成后,就要开始订阅配置中心配置变更,

完整代码:

/**
* 订阅配置中心配置变更
*
* @param listener 配置变更监听器
*/
@Override
public void subscribeRulesChange(RulesChangeListener listener) {
try {//初始化通知 DATA_ID是自己定义的 返回值就是一个json configJson : {"rules":[{}, {}]}String msg = configService.getConfig(DATA_ID, env, 5000);log.info("Rules-Config From Nacos: {}", msg);List<Rule> rules = JSON.parseObject(msg).getJSONArray("rules").toJavaList(Rule.class);// 保存配置信息到本地,调用我们的监听器 参数就是我们拿到的ruleslistener.onRulesChange(rules);// 配置远程注册中心配置变更的回调函数configService.addListener(DATA_ID, env, new Listener() {//是否使用额外线程执行@Overridepublic Executor getExecutor() {return null;}//调用监听器的 onRulesChange 方法,将解析得到的 Rule 对象列表作为参数传递给监听器,以通知配置变更。@Overridepublic void receiveConfigInfo(String configInfo) {log.info("new Config from Nacos: {}", configInfo);List<Rule> newRules = JSON.parseObject(configInfo).getJSONArray("rules").toJavaList(Rule.class);listener.onRulesChange(newRules);}});
} catch (NacosException e) {log.error("subscribeRulesChange failed", e);throw new RuntimeException(e);
}
}

第一步就是从 nacos 上拿到配置文件

将规则信息保存配置信息到本地,这个方法的实现在我们启动类处。创建了一个新的 RulesChangeListener 匿名内部类,并重写了 onRulesChange 方法。当配置中心的规则发生变化时,onRulesChange 方法会被调用,然后将新的规则放入 DynamicConfigManager 的规则映射中。

总的来说,这段代码的作用是根据传入的 Rule 对象列表,更新 DynamicConfigManager 类中的三个映射,以便在后续的操作中快速查找和访问 Rule 对象

public void putAllRule(List<Rule> ruleList) {ConcurrentHashMap<String, Rule> newRuleMap = new ConcurrentHashMap<>();ConcurrentHashMap<String, Rule> newPathMap = new ConcurrentHashMap<>();ConcurrentHashMap<String, List<Rule>> newServiceMap = new ConcurrentHashMap<>();for (Rule rule : ruleList) {newRuleMap.put(rule.getId(), rule);List<Rule> rules = newServiceMap.get(rule.getServiceId());if (rules == null) {rules = new ArrayList<>();}rules.add(rule);newServiceMap.put(rule.getServiceId(), rules);List<String> paths = rule.getPaths();for (String path : paths) {String key = rule.getServiceId() + "." + path;newPathMap.put(key, rule);}}ruleMap = newRuleMap;pathRuleMap = newPathMap;serviceRuleMap = newServiceMap;
}

最后就是向 Nacos 的监听器列表添加一个我们的监听器,当 Nacos 的配置发送变更时,就可以监听到这个事件,然后执行我们所希望的逻辑

这篇关于【自研网关系列】整合 Nacos 配置拉取与配置变更信息的订阅的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901298

相关文章

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

IDEA配置Tomcat远程调试

因为不想把本地的Tomcat配置改乱或者多人开发项目想测试,本文主要是记录一下,IDEA使用Tomcat远程调试的配置过程,免得一段时间不去配置到时候忘记(毕竟这次是因为忘了,所以才打算记录的…) 首先在catalina.sh添加以下内容 JAVA_OPTS="-Dcom.sun.management.jmxremote=-Dcom.sun.management.jmxremote.port

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt

微信小程序开发必知必会:文件结构和基本配置

一、微信小程序基本文件结构 1.  project.config.json:项目的基本配置文件,包括项目名称、appid、项目目录、页面文件夹等。     {"setting": {"urlCheck": false,"es6": true,"postcss": true,"nodeModulesPath": "D:\\\\node_modules"},"appid": "wxd678e

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

Pycharm配置conda环境(解决新版本无法识别可执行文件问题)

引言: 很多小伙伴在下载最新版本的pycharm或者更新到最新版本后为项目配置conda环境的时候,发现文件夹目录中无法显示可执行文件(一般为python.exe),以下就是本人遇到该问题后试验和解决该问题的一些方法和思路。 一般遇到该问题的人群有两种,一种是刚入门对pycharm进行conda环境配置的小白(例如我),不熟悉相关环境配置的操作和过程,还有一种是入坑pycharm有段时间的老手