简介
说明
本文介绍SpringCloud整合Nacos使用@RefreshScope实现自动刷新配置。
官网
动态更新的介绍
动态更新的含义:修改应用的配置之后,无需重启应用,就能使用新的配置。
本文的版本
- spring-boot-starter-parent:2.4.13
- spring-cloud-dependencies:2020.0.1
- spring-cloud-alibaba-dependencies:2021.1
- nacos服务端:1.4.3
效果展示
1.启动Nacos服务端
本处我使用Windows启动Nacos单机:startup.cmd -m standalone
2.Nacos服务端新增命名空间

结果:

3.Nacos服务端新增配置


4.启动应用
5.测试接口

6.更新Nacos配置
由hello改成:hi

7.再次测试接口

代码
依赖
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.13</version>
<relativePath/>
</parent>
<groupId>com.knife.example</groupId>
<artifactId>order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>order</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId> springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--SpringBoot2.4.x之后默认不加载bootstrap.yml文件,需要在pom里加上依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<!--支持feign缓存-->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<!--先只取bootstrap.yml等,不取application*.yml文件-->
<resource>
<directory>src/main/resources</directory>
<!-- 是否替换yml或者properties里@xx@表示的maven properties属性值 -->
<filtering>true</filtering>
<excludes>
<exclude>application*.yml</exclude>
</excludes>
</resource>
<!--添加application.yml等文件-->
<resource>
<directory>src/main/resources</directory>
<!-- 是否替换yml或者properties里@xx@表示的maven properties属性值 -->
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
<!--<include>**/application-${profileActive}.yml</include>-->
</includes>
</resource>
</resources>
</build>
</project>
配置
bootstrap.yml
spring:
application:
name: order
profiles:
active: @profileActive@
cloud:
nacos:
server-addr: @nacos.server-addr@
username: @nacos.username@
password: @nacos.password@
config:
file-extension: yml
namespace: ${spring.profiles.active}
# # 公共的配置文件
# shared-configs:
# - data-id: common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# group: DEFAULT_GROUP
# refresh: true
discovery:
namespace: ${spring.profiles.active}
application.yml
server: port: 9012
测试代码
package com.knife.example.business.order.core.test;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RefreshScope
public class TestController {
@Value("${custom.name}")
private String name;
@GetMapping("test")
public String test() {
return name;
}
}
注意事项
1.失效问题
假如Controller注入Service,Service上使用了@RefreshScope并使用@Value获取配置,那么Controller上必须也加上@RefreshScope,否则无法实现动态刷新。
更多失效情况详见:Spring Cloud-@RefreshScope动态刷新的注意事项 – 自学精灵
2.依赖
其实,@RefreshScope是spring-cloud-context这个依赖中的,引入openfeign时就自动引入了。也可以只引入这个依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
</dependencies>

请先 !