前面我们介绍过:
NACOS保姆笔记(1)——NACOS的安装和启动
NACOS保姆笔记(2)——Spring Cloud Alibaba Nacos服务注册与发现
本篇主要介绍下Nacos和spring cloud alibaba来组合实现配置中心
Nacos端
三个参数
在开始新建一个配置文件之前,我们先要了解在Nacos配置中心中,命名空间(Namespace)、DataID和Group,类似于Java中的包名、类名和文件名。
- Namespace:用于区分不同的部署环境或租户,是最高层级的隔离。
一般用作开发环境的归类,比如开发环境dev,测试环境test,生产环境prod等。它是Nacos鉴权的分割维度。也就是不同Namespace采用不同的鉴权账号。
- DataID:是配置集的唯一标识,用于精确定位到具体的配置集。
一般用作应用归类。通常是由${prefix}-${spring.profile.active}.${file-extension}组成的。
其中:
- ${prefix}默认为spring.application.name的值,
- ${spring.profile.active}为当前环境对应的profile,
- ${file-extension}为配置内容的数据格式。
另外,DataID与应用程序的spring.application.name同名比较好,因为nacos链接时会默认以应用name去找DataID。
- Group:用于对配置集进行分组,以区分同一Namespace下DataID相同的配置集。
Group提供了更细粒度的配置集分组管理功能。也就是同一个Group下可以多个DataID
在实际应用中,可以根据具体需求和场景灵活选择和使用这些配置选项来实现高效、灵活的配置管理。
新建配置
有了以上3个参数的理解,我们快速开始新建一个配置吧。
按顺序先在“菜单-命名空间”里新建一个Namespace叫:demo-v2-dev;
再到“菜单-配置管理-配置列表-创建配置”。此时填写DataID为应用程序名字demo或demo.properties,然后Goup写demo_v2_group。至于MD5不要填。
配置内容呢,就和我们平时的application.properties文件一样写,比如:
spring.datasource.url=jdbc:mysql://localhost:3306/yourdb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#随便自定义一些参数
user=admin
password=pw
保存之后,一个新的配置文件就在nacos端等待被使用了。
应用端
应用端我们用了Spring Cloud Alibaba,如果不考虑服务与发现的话,我们就只管Nacos配置中心部分,则只需要在pom增加config即可:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
然后最重要的是properties文件里:
# 应用服务 WEB 访问端口
server.port=8080
spring.application.name=helloworld
# nacos配置
spring.cloud.nacos.config.server-addr=ip:8848
#namespace
spring.cloud.nacos.config.namespace=0678d38c-e0f7-49aa-a07b-2f041ec
#dataID
spring.config.import=nacos:${spring.application.name}?refresh=true
#group
spring.cloud.nacos.config.group=group_hello
#username&password,要对该namespace有读权限
spring.cloud.nacos.config.username=dev-user
spring.cloud.nacos.config.password=dev-user
到此,其实就可以严重是否成功了。编译时,会发现编译信息里提示连接nacos成功,且精准关联到相应的DataID和Group了。
有些情况下编译会报错:
***************************
Description:
No spring.config.import property has been defined
Action:
Add a spring.config.import=nacos: property to your configuration.
If configuration is not required add spring.config.import=optional:nacos: instead.
To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.
这种情况就不要犟,跟着提示走,把spring.config.import加进去就行。
也看一下java部分的代码吧
若选择用Controller做实验,则参考如下:
@RestController
@RefreshScope
public class TestController {
@Value("${user}")
private String user;
@Value("${password}")
private String password;
@GetMapping("/hello")
public String getUser() {
return user+"---"+password;
}
}
这里要注意下@RefreshScope的注解,他可以让实时更新Nacos端的参数信息。就是程序启动后,Nacos的配置参数变化了,那么用了它之后,也能及时更新到新参数。
若选用实体类做实验,则参考如下:
@Component
public class ConfigClient {
@Value("${user}")
private String user;
@Value("${password}")
private String password;
@PostConstruct
public void printConfigAtStartup() {
printConfig();
}
public void printConfig() {
System.out.println("Database Username: " + user);
System.out.println("Database Password: " + password);
}
}
这里要注意下@PostConstruct的注解,它用于执行一些启动时的初始化工作,比如资源的加载、配置的读取和验证等。
实际上,Config类也是要被多个其他类调用的,不会向上面postconstruct一样理论化使用场景。这里我们可以用Environment:
@Component
@RefreshScope
public class NacosConfig {
private static Environment environment;
@Autowired
public NacosConfig(Environment environment) {
NacosConfig.environment = environment;
}
public static String getUserName() {
return environment.getProperty("username");
}
}
需要调用的时候呢,直接在其他类里String userName = NacosConfig.getUserName()就可以了
如果不要静态的呢,稍微改动下:
@Component
@RefreshScope
public class NacosConfig {
private final Environment environment;
@Autowired
public NacosConfig(Environment environment) {
this.environment = environment;
}
public String getUserName() {
return environment.getProperty("userName");
}
}
然后其他类调用的时候,加上@Autowired注解
@Autowired
NacosConfig config;
@Value("${userName}")
public String userName;
@GetMapping("/hello")
public String getUser() {
return userName+"----"+NacosConfig.getUserName();
}
return的前后两种都一样,都具备自动刷新nacos配置值的效果,也就是nacos配置参数的热更新。
至于JDBC等一些参数,就不用特殊获取了,就当本地配置参数一样用。
好了,本期笔记先到这。下一期我们讲一下: