SpringBoot整合Nacos
文章目录
- nacos
- nacos下载
- nacos启动
- nacos相关配置
- demo-dev.yaml
- demo-test.yaml
- user.yaml
- 代码
- pom.xml
- UserConfig
- BeanAutoRefreshConfigExample
- ValueAnnotationExample
- DemoApplication
- bootstrap.yml
- 测试结果
- 补充.刷新静态配置
nacos
nacos下载
下载地址
一键傻瓜试安装即可,官网写的很清楚这里不在赘述 http://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
nacos启动
将模式改为单机模式

启动成功

nacos相关配置

demo-dev.yaml
server:port: 8001config:info: "config info for dev from nacos config center"
demo-test.yaml
server:port: 3333config:info: "config info for test from nacos config center"
user.yaml
user:name: zs1112222age: 10address: 测试地址

代码
整合nacos配置中心,注册中心,完整项目地址 gitee地址
pom.xml
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version>
</parent><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.2.RELEASE</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.2.RELEASE</version></dependency>
</dependencies>
UserConfig
@Data
@Configuration
@ConfigurationProperties(prefix = "user")
public class UserConfig {private String name;private Integer age;private String address;}
BeanAutoRefreshConfigExample
@RestController
public class BeanAutoRefreshConfigExample {@Autowiredprivate UserConfig userConfig;@GetMapping("/user/hello")public String hello(){return userConfig.getName() + userConfig.getAge() + userConfig.getAddress();}}
ValueAnnotationExample
@RestController
@RefreshScope
public class ValueAnnotationExample {@Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}}
DemoApplication
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
bootstrap.yml
spring:profiles:# 指定环境 切换环境active: devapplication:name: democloud:# nacos server dataId# ${spring.application.name)}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}nacos:# Nacos服务注册中心discovery:serverAddr: @serverAddr@group: DEMO_GROUPnamespace: 25af15f3-ae79-41c3-847d-960adb953185username: @username@password: @password@# Nacos作为配置中心config:server-addr: @serverAddr@file-extension: yamlgroup: DEMO_GROUPnamespace: 25af15f3-ae79-41c3-847d-960adb953185username: @username@password: @password@# 加载多配置extension-configs:- data-id: user.yamlgroup: DEMO_GROUPrefresh: true
测试结果


补充.刷新静态配置
有时候一些老项目或者一些写法会遇到静态的配置,这时候可以利用Java的反射特性来刷新静态变量.
大致原理为: 监听nacos配置改动,通过nacos改动确定改动的配置,进而缩小更新范围,通过反射更新变量.
<!-- https://mvnrepository.com/artifact/com.purgeteam/dynamic-config-spring-boot-starter -->
<dependency><groupId>com.purgeteam</groupId><artifactId>dynamic-config-spring-boot-starter</artifactId><version>0.1.1.RELEASE</version>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
@NacosRefreshStaticField
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NacosRefreshStaticField {String configPrefix() default "";}
NacosListener
@Slf4j
@Component
@EnableDynamicConfigEvent
public class NacosListener implements ApplicationListener<ActionConfigEvent> {@Autowiredprivate ApplicationContext applicationContext;@SneakyThrows@Overridepublic void onApplicationEvent(ActionConfigEvent environment) {Map<String, HashMap> map = environment.getPropertyMap();for (Map.Entry<String, HashMap> entry : map.entrySet()) {String key = entry.getKey();Map changeMap = entry.getValue();String before = String.valueOf(changeMap.get("before"));String after = String.valueOf(changeMap.get("after"));log.info("配置[key:{}]被改变,改变前before:{},改变后after:{}",key,before,after);String[] configNameArr = key.split("\\.");String configPrefix = configNameArr[0];String configRealVal = configNameArr[configNameArr.length-1];AtomicReference<Class<?>> curClazz = new AtomicReference<>();Map<String, Object> refreshStaticFieldBeanMap = applicationContext.getBeansWithAnnotation(NacosRefreshStaticField.class);for (Map.Entry<String, Object> mapEntry : refreshStaticFieldBeanMap.entrySet()) {String beanName = mapEntry.getKey();if (ObjectUtil.isEmpty(beanName)) {continue;}String fullClassName = refreshStaticFieldBeanMap.get(beanName).toString().split("@")[0];Class<?> refreshStaticFieldClass;try {refreshStaticFieldClass = Class.forName(fullClassName);} catch (ClassNotFoundException e) {throw new ClassNotFoundException("监听nacos刷新当前静态类属性,未找到当前类",e);}NacosRefreshStaticField refreshStaticConfig = refreshStaticFieldClass.getAnnotation(NacosRefreshStaticField.class);if (Objects.nonNull(refreshStaticConfig) && refreshStaticConfig.configPrefix().equalsIgnoreCase(configPrefix)) {curClazz.set(refreshStaticFieldClass);}}Class<?> aClass = curClazz.get();if (Objects.isNull(aClass)) {return;}// 利用反射动态更新 静态变量Field[] declaredFields = aClass.getDeclaredFields();for (Field declaredField : declaredFields) {if (declaredField.getName().equalsIgnoreCase(configRealVal)) {log.info("刷新当前配置 更新当前类[{}] 静态属性 [{}]",aClass.getSimpleName(),declaredField.getName());declaredField.setAccessible(true);declaredField.set(null,after);}}}}
}
CommonWebConfig
@Data
@Component
@ConfigurationProperties(prefix = "common")
@RefreshScope
public class CommonWebConfig {private String apiUrl;}
使用
@Component
@NacosRefreshStaticField(configPrefix="common")
public class ExampleComponent {public static String apiUrl = SpringUtil.getBean(CommonWebConfig.class).getApiUrl();
}
相关文章:
SpringBoot整合Nacos
文章目录 nacosnacos下载nacos启动nacos相关配置demo-dev.yamldemo-test.yamluser.yaml 代码pom.xmlUserConfigBeanAutoRefreshConfigExampleValueAnnotationExampleDemoApplicationbootstrap.yml测试结果补充.刷新静态配置 nacos nacos下载 下载地址 一键傻瓜试安装即可,官…...
vue3 浅学
一、toRefs 问题: reactive 对象取出的所有属性值都是⾮响应式的 解决: 利⽤ toRefs 可以将⼀个响应式 reactive 对象的所有原始属性转换为 响应式的 ref 属性 二、hook函数 将可复⽤的功能代码进⾏封装,类似与vue2混⼊。 三、ref:获取元素或者组件 let …...
三小时使用鸿蒙OS模仿羊了个羊,附源码
学习鸿蒙arkTS语言,决定直接通过实践的方式上手,而不是一点点进行观看视频再来实现。 结合羊了个羊的开发思路,准备好相应的卡片素材后进行开发。遇到了需要arkTS进行解决的问题,再去查看相应的文档。 首先需要准备卡片对应的图片…...
如何使用 ArcGIS Pro 制作热力图
热力图是一种用颜色表示数据密度的地图,通常用来显示空间分布数据的热度或密度,我们可以通过 ArcGIS Pro 来制作热力图,这里为大家介绍一下制作的方法,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数…...
SpringBoot之集成Redis
SpringBoot之集成Redis 一、Redis集成简介二、集成步骤2.1 添加依赖2.2 添加配置2.3 项目中使用 三、工具类封装四、序列化 (正常都需要自定义序列化)五、分布式锁(一)RedisTemplate 去实现场景一:单体应用场景二&…...
mybatis-plus与mybatis同时使用别名问题
在整合mybatis和mybatis-plus的时候发现一个小坑,单独使用mybatis,配置别名如下: #配置映射文件中指定的实体类的别名 mybatis.type-aliases-packagecom.jk.entity XML映射文件如下: <update id"update" paramete…...
MySQL基础知识——MySQL日志
一条查询语句的执行过程一般是经过连接器、 分析器、 优化器、 执行器等功能模块, 最后到达存储引擎。 那么, 一条更新语句的执行流程又是怎样的呢? 下面我们从一个表的一条更新语句进行具体介绍: 假设这个表有一个主键ID和一个…...
uniapp 地图分幅网格生成 小程序基于map组件
// 获取小数部分 const fractional function(x) {x Math.abs(x);return x - Math.floor(x); } const formatInt function(x, len) {let result x;len len - result.length;while (len > 0) {result 0 result;len--;}return result; }/*** 创建标准分幅网格* param …...
python项目练习——22、人脸识别软件
功能分析: 人脸检测: 识别图像或视频中的人脸,并标记出人脸的位置和边界框。 人脸识别: 识别人脸的身份或特征,通常使用已知的人脸数据库进行训练,然后在新的图像或视频中识别出人脸并匹配到相应的身份。 表情识别: 识别人脸的表情,如高兴、悲伤、愤怒等,并给出相应…...
Linux中账号登陆报错access denied
“Access denied” 是一个权限拒绝的错误提示,意味着用户无法获得所请求资源的访问权限。出现 “Access denied” 错误的原因可以有多种可能性,包括以下几种常见原因: 错误的用户名或密码:输入的用户名或密码不正确,导…...
python语言之round(num, n)小数四舍五入
文章目录 python round(num, n)小数四舍五入python round(num, n)基础银行家舍入(Bankers Rounding)利息被银行四舍五入后,你到底是赚了还是亏了? python小数位的使用decimal模块四舍五入(解决round 遇5不进) python round(num, n…...
安全风险攻击面管理如何提升企业网络弹性?
从研究人员近些年的调查结果来看,威胁攻击者目前非常善于识别和利用最具有成本效益的网络入侵方法,这就凸显出了企业实施资产识别并了解其资产与整个资产相关的安全态势的迫切需要。 目前来看,为了在如此复杂的网络环境中受到最小程度上的网络…...
常用的几款性能测试软件
Apache JMeter是一款免费、开源的性能测试工具,广泛应用于Web应用程序和服务的性能测试。它支持模拟多种不同类型的负载,可以测试应用程序在不同压力下的性能表现,并提供丰富的图表和报告来分析测试结果。 优点: 免费且开源&…...
谷歌google浏览器无法更新Chrome至最新版本怎么办?浏览器Chrome无法更新至最新版本
打开谷歌google浏览器提示:无法更新Chrome,Chrome无法更新至最新版本,因此您未能获得最新的功能和安全修复程序。点击「重新安装Chrome」后无法访问此网站,造成谷歌浏览器每天提示却无法更新Chrome至最新版本。 谷歌google浏览器无…...
认识异常(1)
❤️❤️前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&a…...
C++矩阵
C矩阵【基本】(will循环) #include<iostream> #include<string.h> using namespace std; int main() {int a[100][100]{0};int k 1;int i 0;int j 0;while(k<100){if(j>10){j0;i;}a[i][j]k;j;k;}i 0;j 0;while(true){if(i 9&am…...
解锁智能未来:用Ollama开启你的本地AI之旅
Ollama是一个用于在本地运行大型语言模型(LLM)的开源框架。它旨在简化在Docker容器中部署LLM的过程,使得管理和运行这些模型变得更加容易。Ollama提供了类似OpenAI的API接口和聊天界面,可以非常方便地部署最新版本的GPT模型并通过…...
CSS实现卡片在鼠标悬停时突出效果
在CSS中,实现卡片在鼠标悬停时突出,通常使用:hover伪类选择器。 :hover伪类选择器用于指定当鼠标指针悬停在某个元素上时,该元素的状态变化。通过:hover选择器,你可以定义鼠标悬停在元素上时元素的样式,比如改变颜色、…...
GPT建模与预测实战
代码链接见文末 效果图: 1.数据样本生成方法 训练配置参数: --epochs 40 --batch_size 8 --device 0 --train_path data/train.pkl 其中train.pkl是处理后的文件 因此,我们首先需要执行preprocess.py进行预处理操作,配置参数…...
传统方法(OpenCV)_车道线识别
一、思路 基于OpenCV的库:对视频中的车道线进行识别 1、视频处理:视频读取 2、图像转换:图像转换为灰度图 3、噪声去除:高斯模糊对图像进行去噪,提高边缘检测的准确性 4、边缘检测:Canny算法进行边缘检测…...
Godot PCK文件解包:原理、工具与工程化实践指南
1. 为什么“解包PCK”不是技术炫技,而是实际工作刚需在Godot引擎生态里,“PCK文件”这三个字母背后藏着的不是冷冰板的二进制容器,而是一整套游戏交付逻辑的终点与逆向理解的起点。我第一次真正意识到这点,是在接手一个外包美术团…...
【企业级AI Agent操作安全白皮书】:基于ISO/IEC 27001与NIST AI RMF的6类操作审计红线
更多请点击: https://codechina.net 第一章:AI Agent自主操作软件的定义与安全治理边界 AI Agent自主操作软件是指具备感知环境、规划决策、调用工具(如API、CLI、GUI自动化接口)并闭环执行任务能力的智能体系统。其核心特征在于…...
神经纹理:让3D世界“活”起来的AI魔法,一篇讲透!
神经纹理:让3D世界“活”起来的AI魔法,一篇讲透! 引言:从“贴图”到“思考”的纹理革命 想象一下,一个虚拟角色不仅能动,其皮肤还能随着情绪微微泛红、在阳光下呈现真实的汗渍光泽——这不再是电影特效的…...
大模型训练全流程拆解:7个阶段+12个关键参数,新手也能看懂
大模型训练全流程拆解:7个阶段+12个关键参数,新手也能看懂 副标题: 从0到1构建大模型的完整路径,附实战避坑指南 一、痛点:为什么大模型训练这么复杂? 很多开发者第一次接触大模型训练时,会被各种术语绕晕:预训练、SFT、RLHF、DPO、LoRA… 感觉像在看天书。 更糟糕的…...
通过curl命令调试Taotoken大模型API,快速排查接入问题
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令调试Taotoken大模型API,快速排查接入问题 在接入大模型服务时,直接使用HTTP请求进行调试是一种…...
加拿大AI治理实战:风险分级、监管沙盒与可信AI工程化落地
1. 项目概述:这不是一场技术秀,而是一场制度设计的实战演练“Canada’s AI Ambitions: Navigating the Future of AI Governance”——这个标题里没有一行代码,不提一个模型参数,却直指当前全球AI发展最棘手、最易被忽视的底层命题…...
【收藏干货】2026 版大模型推理底层原理拆解!吃透 Prefill/Decode 与 vLLM 核心优化
近两年大模型技术飞速迭代,全面重构了 AI 应用开发体系。日常开发中大家热议模型参数规模、Agent 智能体、多模态交互能力,可真正落地部署上线后,决定产品最终使用体验的核心,往往并非模型本身性能,而是容易被忽略的大…...
从代购源码到生产环境:反向海淘系统部署与运维实战指南
代码写完之后,真正的考验才刚刚开始。 这是做代购网站开发时经常会遇到的另一个问题——开发的时候感觉一切顺利,一上线就各种出状况。数据库连接数不够、海外用户访问慢、订单高峰期系统卡死……这些问题我在之前的反向海淘项目里都经历过。 这些问题的…...
如何快速实现浏览器隐身:puppeteer-extra-stealth的完整指南
如何快速实现浏览器隐身:puppeteer-extra-stealth的完整指南 【免费下载链接】puppeteer-extra 💯 Teach puppeteer new tricks through plugins. 项目地址: https://gitcode.com/gh_mirrors/pu/puppeteer-extra 你是否曾尝试使用Puppeteer进行网…...
【限时解密】Lindy自动化方案未公开的4层权限熔断机制:为什么92%的企业跳过这步就触发合规雷区?
更多请点击: https://kaifayun.com 第一章:Lindy人力资源自动化方案的合规性底层逻辑 Lindy人力资源自动化方案并非简单地将流程数字化,而是以全球主流劳动法规为约束边界,将合规性内化为系统架构的刚性层。其底层逻辑建立在“规…...
