Nacos配置管理
文章目录
1、统一配置管理
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。(将微服务的配置交给Nacos进行管理)
步骤:
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
配置获取的步骤如下:
具体步骤
- 引入nacos-config依赖
首先,在user-service服务中,引入nacos-config的客户端依赖:
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 添加bootstrap.yaml
然后,在user-service中添加一个bootstrap.yaml文件,内容如下:
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
作为文件id,来读取配置。
测试:
将上面配置弄好之后,测试Nacos中的配置是否生效
编写接口如下:
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Value("${pattern.dataformat}") //测试是否可以读取Nacos设置的配置文件的配置信息
private String dataformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dataformat));
}
}
重启服务,测试结果:
说明Nacos中的配置生效了。
2、配置自动刷新(热更新)
Nacos中的配置文件变更后,微服务无需重启就可以感知。不过需要通过下面两种配置实现:
-
方式一:在@Value注入的变量所在类上添加注解
@RefreshScope
@Slf4j @RestController @RequestMapping("/user") @RefreshScope //实现Nacos配置热更新的方式之一 public class UserController { @Autowired private UserService userService; @Value("${pattern.dataformat}") //测试是否可以读取Nacos设置的配置文件的配置信息 private String dataformat; @GetMapping("now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dataformat)); } }
修改配置如下,经测试发现不用重启服务即可更新配置。
-
方式二:使用
@ConfigurationProperties
注解-
新建一个配置类:
@Data @Component @ConfigurationProperties(prefix = "pattern") public class ParttenPropertis { private String dataformat; //上面注解上的前缀与dataformat进行匹配,就可以实现配置的自动更新 }
-
修改接口类中的代码
@Slf4j @RestController @RequestMapping("/user") //@RefreshScope //实现Nacos配置热更新的方式之一 public class UserController { @Autowired private UserService userService; // @Value("${pattern.dataformat}") //测试是否可以读取Nacos设置的配置文件的配置信息 // private String dataformat; @Autowired private ParttenPropertis propertis; //注入ParttenPropertis这个配置类 @GetMapping("now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(propertis.getDataformat())); } }
-
3、多环境配置共享
其实微服务启动时,会去nacos读取多个配置文件,例如:
-
[spring.application.name]-[spring.profiles.active].yaml
,例如:userservice-dev.yaml -
[spring.application.name].yaml
,例如:userservice.yaml
而[spring.application.name].yaml
不包含环境,因此可以被多个环境共享。
3.1、添加一个环境共享配置
我们在nacos中添加一个userservice.yaml文件:
3.2、在user-service中读取共享配置
在user-service服务中,修改PatternProperties类,读取新添加的属性:
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class ParttenPropertis {
private String dataformat; //上面注解上的前缀与dataformat进行匹配,就可以实现配置的自动更新
private String envShardValue;
}
3.3、编写接口测试
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private ParttenPropertis propertis;
@GetMapping("prop")
public ParttenPropertis propertis(){
return propertis;
}
}
3.4、运行两个User Application ,使用不同的profile(多环境)
3.5、测试结果
访问地址进行查看,就可以发现配置已经加载进来了
可以看出来,不管是dev,还是test环境,都读取到了envSharedValue这个属性的值。
注:多种配置的优先级
当Nacos配置文件的配置项和本地配置项相同的时候,就以Nacos上面的配置文件为主。
多种配置的优先级:
4、Nacos集群的搭建
Nacos生产环境下一定要部署为集群状态,部署方式参考文档:nacos集群搭建文档