Live2D

springCloud融合nacos配置中心

  1. 使用nacos作为springCloud配置中心,实现动态配置。
  2. 实现步骤
  • 导入maven
<!--配置服务发现-->
	<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
		<!--配置动态刷新支持@refreshscop-->
	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
		<!--配置中心的核心依赖,有了这个东西,去application.yml文件中配置一下nacos的地址等信息就能完成配置中心实现-->
	<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  • 配置application.yml(springCloud版本在2.4之后)/bootstrap.yml(springClou版本在2.4之前)具体内容如下:
server:
  port: 1
spring:
  application:
    name: 1
  cloud:
    nacos:
      config: #这里是配置中心的设置
        #server-addr: 127.0.0.1:8888 #nacos地址,统一配置
        namespace: 8bd92052-fd57-4024-8110-2709d1866c73 # nacos配置文件的命名空间ID
        #data-id:  # 数据ID,用于配置分组和文件后缀之前的唯一标识
        #group: PRODUCTION # 分组,默认是 DEFAULT_GROUP
        #prefix: ${spring.application.name} # 前缀,默认为${spring.application.name}
        #file-extension: yaml # 文件后缀名,默认为 yaml
        refresh-enabled: true # 是否支持动态刷新
      #discovery: #这里是注册中心配置
      #server-addr: 127.0.0.1:8848 #nacos地址,统一配置
      #namespace: public # 命名空间ID
  • 到这里配置中心的设置就完成了,只要保证服务和Nacos正常通信那就没问题了,后续只需要关注Nacos中的配置文件内容就可以了,这里贴一个我的Nacos配置文件截图:
    image
  1. 动态配置属性值,举个例子:再某个Nacos配置文件application.yaml文件中我设置了属性“username”为张三,如下:
username: 张三  #启动服务后将Value改为“李四”

在我启动服务“practice”后,更改username的值为“李四”
然后我在某个controller中使用@Value调用它,如下:

@RestController
@RequestMapping("/user")
public class UserController() {
	@Value("${username}")
	private String username;
	
	@GetMapping
	public String getUsername() {
		return username;
	}
}

此时调用“localhost:8080/user"发现得到的结果还是“张三”,嗯?没起作用是怎么回事呢!查阅资料中...,哎,最后发现,对于配置文件配置的属性值,想要实现Nacos动态配置,需要在类作用于加上注解:@RefreshScope,代码如下:

@RefreshScope
@RestController
@RequestMapping("/user")
public class UserController() {
	@Value("${username}")
	private String username;
	
	@GetMapping
	public String getUsername() {
		return username;
	}
}

加上注解后,我修改username=“王五”,访问接口,得到的返回信息依旧是“张三”,嗯?又没起作用!
通过查资料发现,配置@RefreshScop的Bean想要刷新,有以下几种方式

  1. Spring Boot应用包含Spring Boot Actuator依赖,并且启用了/actuator/refresh端点(这东西应该是默认启用的,老版本可能需要手动配置),您可以通过发送一个POST请求到这个端点来触发配置刷新
curl -X POST http://your-service:port/actuator/refresh
  1. 硬编码
@Autowired  
private RefreshScope refreshScope;  

public void refreshConfigurations() {  
    // 刷新所有在@RefreshScope下的bean  
    refreshScope.refreshAll();  
    // 或者,如果你只想刷新特定的bean,可以这样做(但通常不推荐,因为它依赖于内部实现)  
    // refreshScope.refresh("yourBeanName");  
}
  1. 发布RefreshEvent事件,不推荐
posted @ 2024-06-21 15:50  六爻呈乾  阅读(12)  评论(0编辑  收藏  举报