官方地址:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html
示例:
项目内容如下:
一、nacos编辑配置文件
- dataId:cloud.service-platform.media
- Group:service-platform
- 配置格式没用,只是增加一点颜色,方便编辑
- 配置了一个port8081和urlhead=test
- namespace(tenat):命名空间默认是 public 可以添加 dev prod test (相当于 第一层 互相隔离 每个命名空间下面有自己的组)
- group:组默认是DEFAULT_GROUP(组相当于一个特定场景 )
- dataid :相当于文件名 默认下是服务名(在每个分组下面互相隔离)
二、客户端 pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.7</version>
</dependency>
三、配置application.properties
#nacos地址
nacos.config.server-addr=localhost:8848
#命名空间id
nacos.config.namespace=ns-dev
#用户名
nacos.config.username=nacos
#密码
nacos.config.password=nacos
也可以去掉application.properties配置文件,改用从环境变量获取配置中心地址(下面两种方式)
//此代码加载启动类中
//第二种方式
/**
* 动态配置配置中心地址。全局NacosProperties
* @return Properties
*/
@Bean
public Properties globalNacosProperties() {
Properties properties = new Properties();
//properties.setProperty("serverAddr",System.getProperty("serverAddr"));//从环境变量获取后放入Properties
properties.setProperty("serverAddr","localhost:8848");
properties.setProperty("username","nacos");
properties.setProperty("namespace","ns-dev");
properties.setProperty("password","nacos");
return properties;
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
//第三种方式
public static void main(String[] args) {
//设置环境变量
System.setProperty("nacos.config.serverAddr","localhost:8848");
System.setProperty("nacos.config.username","nacos");
System.setProperty("nacos.config.namespace","ns-dev");
System.setProperty("nacos.config.password","nacos");
SpringApplication.run(DemoApplication.class,args);
System.out.println("启动成功");
}
四、启动类添加@NacosPropertySource注解
@SpringBootApplication
//设置配置源并开启自动更新
@NacosPropertySource(dataId = "cloud.service-platform.media",groupId = "service-platform",autoRefreshed = true)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
五、controller通过@NacosValue注解取值
@RestController
public class DemoController {
//使用@value注解取值,它能取到值,但没有自动更新的功能
@Value(value = "${urlhead}")
private String urlhead;
//使用@nacosValue注解获取值,并开启自动更新
@NacosValue(value = "${urlhead}", autoRefreshed = true)
private String urlheadAutoRefresh;
@RequestMapping("/getValue")
public String getValue() {
System.out.println("urlhead:"+urlhead);
System.out.println("urlheadAutoRefresh:"+urlheadAutoRefresh);
return "";
}
}
六、测试结果
结果可以看出@NacosValue是可以在nacos配置修改后,读取到新值的。但@Value不行。
客户端底层请求nacos配置的位置:
nacos是通过ClientWorker的getServerConfig方法get请求获取的配置文件信息
中途发生的一些小插曲
经检查发现:nacos客户端会把dataId当作文件名。但是客户端不支持media后缀名的配置文件
通过源码分析,发现nacos只支持四种配置解析器:
所以我们可以自定义类实现ConfigParse接口,然后通过SPI方式把类加进来
因为我dataId后缀名不符合要求,但是文件内容依然是Properties的格式,所以我们可以直接继承DefaultPropertiesConfigParse类即可
//自定义类实现ConfigParse接口
public class DefaultMediaConfigParse extends DefaultPropertiesConfigParse {
@Override
public String processType() {
return "media";
}
}
SPI步骤:
1、在classpath下创建两层META-INF/services/文件夹,里面添加文件,文件名为接口的全类路径名
注意:不要直接在idea上创建META-INF.services文件夹,因为创建的只是一层
2、在文件中加上实现类的全类路径名
java spi机制参考:
自定义解析器加入集合处源码
ConfigParseUtils类的toProperties方法中,会把自定义的配置解析器加入到默认解析器的properties集合里面。
现在就有五种解析器了,可以识别并解析media文件了!!