Nacos配置热更新的4种方式、读取项目配置文件的多种方式,@value,@RefreshScope,@NacosConfigurationProperties 您所在的位置:网站首页 用什么软件查看电脑配置 Nacos配置热更新的4种方式、读取项目配置文件的多种方式,@value,@RefreshScope,@NacosConfigurationProperties

Nacos配置热更新的4种方式、读取项目配置文件的多种方式,@value,@RefreshScope,@NacosConfigurationProperties

2023-07-12 22:22| 来源: 网络整理| 查看: 265

nacos实现配置文件的热更新,服务不用重启即可读取到nacos配置中心修改发布后的最新值,spring,springboot项目读取本地配置文件的各种方式;文章中介绍了一下注解的使用:@NacosConfigurationProperties,@NacosPropertySource,@ConfigurationProperties,@NacosValue,@value,@RefreshScope,@EnableNacosConfig。 使用nacos的企业越来越多,nacos确实很好用,最近就抽时间研究了一下nacos配置文件的热更新的几种方式,顺便复习了一下读取本地配置文件的几种方式。

文章最后提供源码连接,完全自己写的,绝对可用。

一、nacos配置文件热更新的几种方式

热更新,顾名思义就是在不用重启服务的情况下,实现配置的更新,服务的重启可能对项目的影响很大,所以nacos肯定是支持热更新的,我一共总结了4种方式,可以实现nacos的热更新,网上也找了很多,要么那些文章是从别的地方复制粘贴过来的不能用,要么就是pom依赖不对,总之搞不好,很头疼。所以我自己完整弄一遍(首先要安装好nacos服务端,这里就略过了)。

1、新建项目,pom引入

1、父模块引入pom

4.0.0 org.example NacosConfig pom 1.0-SNAPSHOT NacosValueExample 2.2.8.RELEASE Hoxton.RELEASE 2.2.0.RELEASE 0.2.2-RC1 org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring-cloud-alibaba.version} pom import com.alibaba.nacos nacos-spring-context ${nacos-spring-context.version}

2、子模块引入pom

org.springframework.boot spring-boot-starter-web com.alibaba.nacos nacos-spring-context com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config org.springframework.cloud spring-cloud-context

3、项目结构 在这里插入图片描述

2、使用@RefreshScope+@Value实现nacos热更新

1、在nacos配置中心新建config-teacher.yaml配置文件 内容如下:

teacher: name: 老李 age: 45

在这里插入图片描述 配置编辑保存: 在这里插入图片描述 配置中心已有配置文件了: 在这里插入图片描述 2、项目中新建bootstrap.yml配置文件,将config-teacher.yaml配置进去

spring: application: name: test-config cloud: # nacos 配置 nacos: config: file-extension: yaml refresh-enabled: true enabled: true server-addr: 127.0.0.1:8848 group: DEFAULT_GROUP #添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group 的配置值一致。 #group: NACOS-DEMO ## 可以配置多个 Data Id 同时配置时,他的优先级关系是 [n]其中 n 的值越大,优先级越高。 extension-configs[0]: data-id: config-student.yaml group: DEFAULT_GROUP refresh: true extension-configs[1]: data-id: config-teacher.yaml group: DEFAULT_GROUP refresh: true discovery: server-addr: 127.0.0.1:8848

3、启动类

@SpringBootApplication // 增加@EnableNacosConfig才能使用@NacosValue注解和@NacosConfigurationProperties注解获取nacos配置中心的配置文件内容 @EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848")) public class ConfigApplication { public static void main(String[] args) { SpringApplication.run(ConfigApplication.class, args); } }

4、读取配置文件代码

package com.nacos.example.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; @Component @RefreshScope public class TestValue3 { @Value("${teacher.name}") private String name; @Value("${teacher.age}") private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

5、controller注入:

@RestController @RequestMapping("/config") public class ConfigController { @Autowired private TestValue3 testValue3; @GetMapping(value = "/getValue9") public Object getValue9() { TestValue3 value3 = new TestValue3(); value3.setName(testValue3.getName()); value3.setAge(testValue3.getAge()); return value3; } }

6、访问接口效果: 在这里插入图片描述 我们修改nacos配置中心的config-teacher.yaml文件 在这里插入图片描述 然后重新访问刚刚的接口,服务不重启: 在这里插入图片描述 可以看到,修改后的配置已经读取到了,第一种方式成功!

3、使用@RefreshScope+@ConfigurationProperties实现nacos热更新

1、配置文件不变,读取配置文件的代码:

@Component @RefreshScope @ConfigurationProperties(prefix = "teacher") public class TestRefreshScope1 { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

2、controller注入:

@RestController @RequestMapping("/config") public class ConfigController { @Autowired private TestRefreshScope1 testRefreshScope1; @GetMapping(value = "/getValue5") public Object getValue5() { // 因为RefreshScope使用的动态代理,这里直接返回testRefreshScope1会报错,所以重新new对象从testRefreshScope1获取值在返回 // No serializer found for class org.springframework.context.expression.StandardBeanExpressionResolver TestRefreshScope1 scope1 = new TestRefreshScope1(); scope1.setName(testRefreshScope1.getName()); scope1.setAge(testRefreshScope1.getAge()); return scope1; } }

3、访问接口: 在这里插入图片描述 然后我们修改配置文件的内容: 在这里插入图片描述然后重新访问刚刚的接口,服务不重启: 在这里插入图片描述 已经成功获取到修改后的值。

4、使用@NacosConfigurationProperties实现nacos热更新

1、读取配置代码

@Component @NacosConfigurationProperties(dataId = "config-teacher.yaml", prefix = "teacher", autoRefreshed = true) public class TestNacosConfiguration1 { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

2、controller注入:

@RestController @RequestMapping("/config") public class ConfigController { @Autowired private TestNacosConfiguration1 testNacosConfiguration1; @GetMapping(value = "/getValue7") public Object getValue7() { return testNacosConfiguration1; } }

3、配置文件不修改,访问接口: 在这里插入图片描述 修改nacos配置文件的内容: 在这里插入图片描述 重新请求接口: 在这里插入图片描述 同样获取到了最新的配置。

5、使用@NacosPropertySource和@ConfigurationProperties实现nacos热更新

1、读取配置的代码:

@Component @NacosPropertySource(dataId = "config-teacher.yml", autoRefreshed = true) @ConfigurationProperties(prefix = "teacher") public class TestConfiguration3 { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

2、controller注入:

@RestController @RequestMapping("/config") public class ConfigController { @Autowired private TestConfiguration3 testConfiguration3; @GetMapping(value = "/getValue8") public Object getValue8() { return testConfiguration3; } }

3、访问接口: 在这里插入图片描述 然后我们修改nacos配置中的文件: 在这里插入图片描述 我们重新访问刚刚的接口,服务不重启: 在这里插入图片描述 同样,获取到了最新的nacos配置文件内容。以上就是nacos热更新的4种方式。

二、本地项目配置文件读取的几种方式

注意:需要将nacos相关的配置注释,不然会读取nacos配置中心的文件!这里演示的是读取本地项目的配置文件。

1、使用@Value读取本地配置文件内容

1、新建application.yml配置文件,添加内容:

student: name: 张三 age: 20

读取配置文件代码:

@Component public class TestValue1 { @Value("${student.name}") private String name; @Value("${student.age}") private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

2、controller接口:

@RestController @RequestMapping("/config") public class ConfigController { @Autowired private TestValue1 testValue1; @GetMapping(value = "/getValue1") public Object getValue1() { return testValue1; } }

3、访问接口,获取到配置文件内容: 在这里插入图片描述

2、使用@Value+@PropertySource读取指定配置文件内容

1、新建config2.properties配置文件,添加内容:

teacher.name=李维 teacher.age=32

读取配置文件代码:

@Component @PropertySource(value = "classpath:config2.properties", encoding = "utf-8") public class TestValue2 { @Value("${teacher.name}") private String name; @Value("${teacher.age}") private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

2、controller接口:

@RestController @RequestMapping("/config") public class ConfigController { @Autowired private TestValue2 testValue2; @GetMapping(value = "/getValue2") public Object getValue2() { return testValue2; } }

3、访问接口,获取到配置文件内容: 在这里插入图片描述

3、使用@ConfigurationProperties读取配置文件内容

1、application.yml文件不变:

student: name: 张三 age: 20

读取配置文件代码:

@Component @ConfigurationProperties(prefix = "student") public class TestConfiguration1 { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

2、controller接口:

@RestController @RequestMapping("/config") public class ConfigController { @Autowired private TestConfiguration1 testConfiguration1; @GetMapping(value = "/getValue3") public Object getValue3() { return testConfiguration1; } }

3、访问接口,获取到配置文件内容: 在这里插入图片描述

4、使用@ConfigurationProperties+@PropertySource读取指定配置文件内容

1、config2.properties配置文件不变:

teacher.name=李维 teacher.age=32

读取配置文件代码:

@Component @PropertySource("classpath:config.properties") @ConfigurationProperties(prefix = "teacher") public class TestConfiguration2 { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

2、controller接口:

@RestController @RequestMapping("/config") public class ConfigController { @Autowired private TestConfiguration2 testConfiguration2; @GetMapping(value = "/getValue4") public Object getValue4() { return testConfiguration2; } }

3、访问接口获取: 在这里插入图片描述

源代码gitee地址:https://gitee.com/wangyi0228/nacos-config.git



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有