Nacos配置管理
Nacos除了可以做注册中心,同样可以做配置管理来使用。
1、统一配置管理
多个服务相同配置或者需要动态调整的配置,可以交给统一的配置中心进行管理,服务从配置 中心拉取配置,
如果需要修改配置,只需要修改配置中心的配置,即可实现服务的批量和动态配置更新。
在nacos中添加配置文件
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动,如果application.yml还没有获取到属性,项目启动就会报错,属性解析异常
spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下
读取配置
引入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: user-service
profiles:
# 环境
active: dev
cloud:
nacos:
# nacos 服务端地址
server-addr: localhost:8848
config:
# 文件扩展名
file-extension: yaml
访问测试
在user-service中的UserController中添加业务逻辑,读取 jdbc.username
配置:
@Value("${jdbc.username}")
private String username;
@GetMapping("/config")
public String config(){
return username;
}
2、配置自动刷新
需求:是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。
要实现配置热更新,可以使用两种方式:
方式1: @Value
所在类上
添加 @RefreshScope
方式2: 使用@ConfigurationProperties
注解读取配置
方式1
在@Value注入的变量所在类上添加注解@RefreshScope:
@RestController
@RequestMapping("/user")
@RefreshScope //刷新配置
public class UserController {
方式2
使用@ConfigurationProperties
注解读取配置
在user-service服务中,添加一个类,读取jdbc.username属性:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Configuration
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String username;
private String password;
}
在UserController中使用这个类:
@Autowired
JdbcProperties jdbcProperties;
@GetMapping("/config")
public String config(){
return jdbcProperties.toString();
}
3、多环境配置
开发过程中,同一组配置可能在不同的环境(dev、test、prod…)中,配置的值不一样,如何在多个环境中切换配置?
演示
1)、nacos 配置中心添加 test 环境的配置
2)、修改当前环境
记得将dev修改成test
3)、测试
4、配置共享
当不同环境具有相同的一些配置时,这些配置在每个环境的配置文件中都配置了一份,此时出现了重复配置
如何只配置一次,还能在多个环境中共享配置呢?
其实微服务启动时,会去nacos读取 2 个配置文件,例如:
- 环境配置:
[spring.application.name]-[spring.profiles.active].yaml
,例如:user-service-dev.yaml - 共享配置:
[spring.application.name].yaml
,例如:user-service.yaml
1)添加共享配置
添加共享配置:在nacos中添加一个user-service.yaml文件:
此时nacos中用户服务有3个配置文件:
2)读取共享配置
在user-service服务中,修改UserController类,读取新添加的属性:
//读取公共配置
@Value("${user.auth}")
private Boolean auth;
@Autowired
JdbcProperties jdbcProperties;
@GetMapping("/config")
public String config(){
//return username;
return jdbcProperties.getUsername()+" - "+auth;
}
之后就可以进行测试。
当nacos、服务本地同时出现相同属性时,优先级有高低之分:最低的是本地配置
5、配置隔离
第一步: 新建namespace
- 默认namespace只有一个public
- 新建 dev 和 test 两个命名空间
第二步:添加配置
- 添加user-service.yaml
第三步:开发环境添加配置
添加user-service.yaml
第四步: 读取配置
用户服务读取 test 环境配置
- 配置文件 bootstrap.yml 读取指定的 namespace 、group
spring:
application:
# 服务名
name: user-service
#profiles:
#active: dev # 不需要指定,namespace指定的就是对应环境
cloud:
nacos:
# nacos 服务端地址
server-addr: localhost:8848
config:
file-extension: yaml # 文件扩展名
namespace: 42b87aee-ed82-4b07-ad0d-6138cf4c0c24 # test 环境的namespace
group: USER_GROUP # 组名 区分大小写
第五步:测试
…
namespace下的共享配置
nacos中test环境添加共享配置
在bootstrap.yml中添加配置
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: c05434f9-5d25-49ba-be6e-862b21380d25
group: USER_GROUP
# 主要是下面这个配置
# 当前namespace 下各个service 都共享的配置
shared-configs:
- data-id: common.yaml
group: COMMON_GROUP
refresh: true #是否支持应用中可动态刷新, 默认是不支持的。
之后测试。