当前位置: 首页 > news >正文

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函数 将可复⽤的功能代码进⾏封装&#xff0c;类似与vue2混⼊。 三、ref&#xff1a;获取元素或者组件 let …...

三小时使用鸿蒙OS模仿羊了个羊,附源码

学习鸿蒙arkTS语言&#xff0c;决定直接通过实践的方式上手&#xff0c;而不是一点点进行观看视频再来实现。 结合羊了个羊的开发思路&#xff0c;准备好相应的卡片素材后进行开发。遇到了需要arkTS进行解决的问题&#xff0c;再去查看相应的文档。 首先需要准备卡片对应的图片…...

如何使用 ArcGIS Pro 制作热力图

热力图是一种用颜色表示数据密度的地图&#xff0c;通常用来显示空间分布数据的热度或密度&#xff0c;我们可以通过 ArcGIS Pro 来制作热力图&#xff0c;这里为大家介绍一下制作的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数…...

SpringBoot之集成Redis

SpringBoot之集成Redis 一、Redis集成简介二、集成步骤2.1 添加依赖2.2 添加配置2.3 项目中使用 三、工具类封装四、序列化 &#xff08;正常都需要自定义序列化&#xff09;五、分布式锁&#xff08;一&#xff09;RedisTemplate 去实现场景一&#xff1a;单体应用场景二&…...

mybatis-plus与mybatis同时使用别名问题

在整合mybatis和mybatis-plus的时候发现一个小坑&#xff0c;单独使用mybatis&#xff0c;配置别名如下&#xff1a; #配置映射文件中指定的实体类的别名 mybatis.type-aliases-packagecom.jk.entity XML映射文件如下&#xff1a; <update id"update" paramete…...

MySQL基础知识——MySQL日志

一条查询语句的执行过程一般是经过连接器、 分析器、 优化器、 执行器等功能模块&#xff0c; 最后到达存储引擎。 那么&#xff0c; 一条更新语句的执行流程又是怎样的呢&#xff1f; 下面我们从一个表的一条更新语句进行具体介绍&#xff1a; 假设这个表有一个主键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” 是一个权限拒绝的错误提示&#xff0c;意味着用户无法获得所请求资源的访问权限。出现 “Access denied” 错误的原因可以有多种可能性&#xff0c;包括以下几种常见原因&#xff1a; 错误的用户名或密码&#xff1a;输入的用户名或密码不正确&#xff0c;导…...

python语言之round(num, n)小数四舍五入

文章目录 python round(num, n)小数四舍五入python round(num, n)基础银行家舍入&#xff08;Bankers Rounding&#xff09;利息被银行四舍五入后&#xff0c;你到底是赚了还是亏了&#xff1f; python小数位的使用decimal模块四舍五入(解决round 遇5不进) python round(num, n…...

安全风险攻击面管理如何提升企业网络弹性?

从研究人员近些年的调查结果来看&#xff0c;威胁攻击者目前非常善于识别和利用最具有成本效益的网络入侵方法&#xff0c;这就凸显出了企业实施资产识别并了解其资产与整个资产相关的安全态势的迫切需要。 目前来看&#xff0c;为了在如此复杂的网络环境中受到最小程度上的网络…...

常用的几款性能测试软件

Apache JMeter是一款免费、开源的性能测试工具&#xff0c;广泛应用于Web应用程序和服务的性能测试。它支持模拟多种不同类型的负载&#xff0c;可以测试应用程序在不同压力下的性能表现&#xff0c;并提供丰富的图表和报告来分析测试结果。 优点&#xff1a; 免费且开源&…...

谷歌google浏览器无法更新Chrome至最新版本怎么办?浏览器Chrome无法更新至最新版本

打开谷歌google浏览器提示&#xff1a;无法更新Chrome&#xff0c;Chrome无法更新至最新版本&#xff0c;因此您未能获得最新的功能和安全修复程序。点击「重新安装Chrome」后无法访问此网站&#xff0c;造成谷歌浏览器每天提示却无法更新Chrome至最新版本。 谷歌google浏览器无…...

认识异常(1)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…...

C++矩阵

C矩阵【基本】&#xff08;will循环&#xff09; #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是一个用于在本地运行大型语言模型&#xff08;LLM&#xff09;的开源框架。它旨在简化在Docker容器中部署LLM的过程&#xff0c;使得管理和运行这些模型变得更加容易。Ollama提供了类似OpenAI的API接口和聊天界面&#xff0c;可以非常方便地部署最新版本的GPT模型并通过…...

CSS实现卡片在鼠标悬停时突出效果

在CSS中&#xff0c;实现卡片在鼠标悬停时突出&#xff0c;通常使用:hover伪类选择器。 :hover伪类选择器用于指定当鼠标指针悬停在某个元素上时&#xff0c;该元素的状态变化。通过:hover选择器&#xff0c;你可以定义鼠标悬停在元素上时元素的样式&#xff0c;比如改变颜色、…...

GPT建模与预测实战

代码链接见文末 效果图&#xff1a; 1.数据样本生成方法 训练配置参数&#xff1a; --epochs 40 --batch_size 8 --device 0 --train_path data/train.pkl 其中train.pkl是处理后的文件 因此&#xff0c;我们首先需要执行preprocess.py进行预处理操作&#xff0c;配置参数…...

传统方法(OpenCV)_车道线识别

一、思路 基于OpenCV的库&#xff1a;对视频中的车道线进行识别 1、视频处理&#xff1a;视频读取 2、图像转换&#xff1a;图像转换为灰度图 3、噪声去除&#xff1a;高斯模糊对图像进行去噪&#xff0c;提高边缘检测的准确性 4、边缘检测&#xff1a;Canny算法进行边缘检测…...

SRM如何实现采购高效协同?

许多企业上了SRM&#xff0c;却发现供应链还是“跑不起来”&#xff1a;下了订单&#xff0c;仓库不知何时到货&#xff1b;收了货&#xff0c;质检迟迟没任务&#xff1b;质检出问题&#xff0c;采购和财务被蒙在鼓里…… 其核心问题不是SRM没用&#xff0c;而是它和ERP、WMS、…...

LabVIEW串口通信保姆级教程:从虚拟串口配置到数据收发实战(附XCOM调试技巧)

LabVIEW串口通信实战指南&#xff1a;虚拟环境搭建与高效调试全解析 从零搭建虚拟串口开发环境 对于刚接触LabVIEW串口通信的开发者来说&#xff0c;最头疼的往往是硬件设备的缺失。其实借助虚拟串口工具&#xff0c;完全可以模拟真实硬件环境进行开发。这里推荐使用VSPD&#…...

VBA Replace函数实战指南:从基础语法到高效数据处理

1. VBA Replace函数基础入门 刚接触VBA时&#xff0c;Replace函数是我最早掌握的文本处理工具之一。这个看似简单的函数&#xff0c;在实际办公场景中能解决80%的文本替换需求。先来看它的基本语法结构&#xff1a; Replace(expression, find, replace[, start[, count[, compa…...

RK3588 MIPI屏幕点不亮?别慌!用这份DTS屏参调试清单快速排错

RK3588 MIPI屏幕点不亮&#xff1f;这份DTS屏参调试清单帮你快速定位问题 当RK3588开发板连接MIPI屏幕后出现黑屏、花屏或闪屏时&#xff0c;多数开发者会首先怀疑屏幕硬件故障。但根据实际项目经验&#xff0c;80%的显示问题都源于DTS配置参数与屏幕规格不匹配。本文将带你建…...

RePKG:5分钟掌握Wallpaper Engine PKG提取与TEX转换的终极指南

RePKG&#xff1a;5分钟掌握Wallpaper Engine PKG提取与TEX转换的终极指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经面对Wallpaper Engine中精美的动态壁纸资源&am…...

Docker部署避坑:OpenClaw容器内无法使用代理?网络模式选择建议

“在本地跑得好好的OpenClaw&#xff0c;一放到Docker容器里&#xff0c;代理就不生效了……”“明明docker-compose.yml里配了环境变量&#xff0c;容器里curl也能通&#xff0c;但OpenClaw就是不走代理……”“更离谱的是&#xff0c;容器能ping通外网&#xff0c;但OpenClaw…...

Resemble Enhance:AI语音增强技术如何重塑音频质量新标准

Resemble Enhance&#xff1a;AI语音增强技术如何重塑音频质量新标准 【免费下载链接】resemble-enhance AI powered speech denoising and enhancement 项目地址: https://gitcode.com/gh_mirrors/re/resemble-enhance 在数字音频处理领域&#xff0c;噪声干扰和音质退…...

MySQL 5.7和8.0大不同:手把手教你用两种方法给查询结果加序号(附避坑点)

MySQL 5.7与8.0查询结果序号生成实战指南 在数据库查询结果中为每行添加序号是数据分析、报表生成和前端展示的常见需求。MySQL作为最流行的开源关系型数据库&#xff0c;其5.7和8.0版本在实现这一功能时存在显著差异。本文将深入探讨两种主流方法的技术实现、性能对比和实际应…...

学习进步链上存档程序,课程学习,考试记录上链,生成终身学习档案,求职可直接验证,无需假简历。

这个命题应用到每个人的职业生涯起点——学历与技能认证。我们将开发一个 “EduChain - 学习进步链上存档系统”。这个系统的目标是&#xff1a;让你的每一次学习、每一场考试&#xff0c;都变成不可篡改的数字资产&#xff0c;终结简历造假的时代。一、 实际应用场景描述设想这…...

如何用DS4Windows让PS手柄在PC上完美运行:3分钟快速配置指南

如何用DS4Windows让PS手柄在PC上完美运行&#xff1a;3分钟快速配置指南 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否想在Windows电脑上使用PlayStation手柄玩游戏&#xff0c;却…...