SpringBoot整合Nacos

devtools/2024/12/22 9:11:47/

文章目录

    • nacos
      • nacos下载
      • nacos启动
      • nacos相关配置
        • demo-dev.yaml
        • demo-test.yaml
        • user.yaml
    • 代码
      • pom.xml
      • UserConfig
      • BeanAutoRefreshConfigExample
      • ValueAnnotationExample
      • DemoApplication
      • bootstrap.yml
      • 测试结果
      • 补充.刷新静态配置

nacos_2">nacos

nacos_4">nacos下载

下载地址

一键傻瓜试安装即可,官网写的很清楚这里不在赘述 http://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html

nacos_9">nacos启动

将模式改为单机模式

请添加图片描述

启动成功

请添加图片描述

nacos_20">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

java">@Data
@Configuration
@ConfigurationProperties(prefix = "user")
public class UserConfig {private String name;private Integer age;private String address;}

BeanAutoRefreshConfigExample

java">@RestController
public class BeanAutoRefreshConfigExample {@Autowiredprivate UserConfig userConfig;@GetMapping("/user/hello")public String hello(){return userConfig.getName() + userConfig.getAge() + userConfig.getAddress();}}

ValueAnnotationExample

java">@RestController
@RefreshScope
public class ValueAnnotationExample {@Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}}

DemoApplication

java">@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

java">@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NacosRefreshStaticField {String configPrefix() default "";}

NacosListener

java">@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

java">@Data
@Component
@ConfigurationProperties(prefix = "common")
@RefreshScope
public class CommonWebConfig {private String apiUrl;}

使用

java">@Component
@NacosRefreshStaticField(configPrefix="common")
public class ExampleComponent {public static String apiUrl = SpringUtil.getBean(CommonWebConfig.class).getApiUrl();
}

http://www.ppmy.cn/devtools/2069.html

相关文章

成都百洲文化传媒有限公司开启智慧营销新篇章

在电商行业风起云涌的今天&#xff0c;成都百洲文化传媒有限公司以其独特的视角和专业的服务&#xff0c;成为了行业中的一股清流。专注于电商服务&#xff0c;百洲文化不仅为客户提供了一站式的解决方案&#xff0c;更以其创新的思维引领着行业的发展方向。 一、百洲文化的独…

【5】DongshanPI-Seven 应用开发_网络编程TCPUDP

目录 1、网络编程概念2、网络编程的API2.1 网络通信交互示意图2.2 主要API 3、编程测试3.1 TCP 测试3.1.1 server 程序3.1.2 Client 程序3.1.3 测试结果 3.2 UDP 测试3.2.1 udp server3.2.2 udp client3.2.3 测试结果 1、网络编程概念 1.数据传输三要素&#xff1a;源、目的、…

Leetcode - 周赛393

目录 一&#xff0c;3114. 替换字符可以得到的最晚时间 二&#xff0c;3115. 素数的最大距离 三&#xff0c;3116. 单面值组合的第 K 小金额 四&#xff0c; 3117. 划分数组得到最小的值之和 一&#xff0c;3114. 替换字符可以得到的最晚时间 本题是一道模拟题&#xff0c;…

阿里云服务器怎么更换暴露的IP

很多客户阿里云服务器被攻击IP暴露&#xff0c;又不想迁移数据换服务器&#xff0c;其实阿里云服务器可以更换IP&#xff0c;今天就来和大家说说流程&#xff0c;云服务器创建成功后6小时内可以免费更换公网IP地址三次&#xff0c;超过6小时候就只能通过换绑弹性公网IP的方式来…

Linux网络服务器编程:TCP与UDP详解

文章目录 一、TCP与UDP概述1.1 TCP的原理1.2 UDP的原理1.3 数据流动 二、Socket的使用2.1 TCP Socket示例2.2 UDP Socket示例 三、数据流动时序图3.1 TCP通信详解3.2 UDP通信详解 四、异常情况处理4.1 服务器ACK丢失4.2 第三次握手的ACK丢失 五、总结推荐阅读 Linux网络服务器编…

【机器学习】分类与预测算法评价的方式介绍

一、引言 1、机器学习分类与预测算法的重要性 在数据驱动的时代&#xff0c;机器学习已经成为了处理和分析大规模数据的关键工具。分类与预测作为机器学习的两大核心任务&#xff0c;广泛应用于各个领域&#xff0c;如金融、医疗、电商等。分类算法能够对数据进行有效归类&…

基于react native的android原生微信客服,微信支付以及判断是否安装微信

基于react native的android原生微信客服&#xff0c;微信支付以及判断是否安装微信 引入SDK&#xff08;Android Studio 环境下&#xff09;创建wxapi/WXPayEntryActivity.java&#xff08;用于接收微信响应返回信息&#xff09;CustomerServiceModule.javaCustomerServicePack…

工业级3D可视化工具HOOPS Visualize, 快速构建移动端和PC端工程应用程序!

HOOPS Visualize是一款强大的工业级3D渲染引擎&#xff0c;帮助您打造出众的工程应用程序。HOOPS Visualize的基石是图形内核&#xff0c;这是一种全功能的&#xff0c;以工程为重点的场景图技术&#xff0c;我们称为Core Graphics。Core Graphics集成到一个框架中&#xff0c;…