springCloud融合nacos配置中心
- 使用nacos作为springCloud配置中心,实现动态配置。
- 实现步骤
- 导入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配置文件截图:
- 动态配置属性值,举个例子:再某个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想要刷新,有以下几种方式
- Spring Boot应用包含Spring Boot Actuator依赖,并且启用了/actuator/refresh端点(这东西应该是默认启用的,老版本可能需要手动配置),您可以通过发送一个POST请求到这个端点来触发配置刷新
curl -X POST http://your-service:port/actuator/refresh
- 硬编码
@Autowired
private RefreshScope refreshScope;
public void refreshConfigurations() {
// 刷新所有在@RefreshScope下的bean
refreshScope.refreshAll();
// 或者,如果你只想刷新特定的bean,可以这样做(但通常不推荐,因为它依赖于内部实现)
// refreshScope.refresh("yourBeanName");
}
- 发布RefreshEvent事件,不推荐
本文来自博客园,作者:六爻呈乾,转载请注明原文链接:https://www.cnblogs.com/ilycq/p/18260348