题记
写这篇文章的时候遇到了很多问题,nacos版本换了1.4.2,其他的就按照下面的配置来就肯定可以。
快速应用配置中心
基本原理
spring启动会经历大概这么一个流程
graph TD
启动 --> 读取application配置文件 --> 创建容器 --> 加载bean
而nacos的配置读取优先级实际是大于application的配置,这时候就需要引入bootstrap.yaml
graph TD
启动 --> 读取bootstrap.yaml --> 连接至naocs读取配置 --> 读取application配置文件 --> 创建容器 --> 加载bean
开始搭建
- 新建bootstrap.yaml文件,并且将properties配置转过来
server:
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
cluster-name: 上海
namespace: 20c0e599-919c-483a-a3d7-c73eaf3b4e7c
ephemeral: false
application:
name: student
- pom引入nacos-conf
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.0.1.0</version>
</dependency>
- 正常往下走会报错,新版springcloud带出来的问题,需要多引一个pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- nacos建立配置文件,namepase是test (DATA ID 要带着yaml后缀,下面的配置格式要选yaml,-test这种写法就是区分开发与测试环境的,跟springboot项目中的一个意思)
- 在bootstrap.yaml引入刚才新建的配置文件
config:
file-extension: yaml
server-addr: 127.0.0.1:8848
namespace: 20c0e599-919c-483a-a3d7-c73eaf3b4e7c
- 新建controller去获取值
@RestController
@RequestMapping
public class TestController {
@Value("${name}")
public String name;
@GetMapping("/hello/name")
public String getName(){
return name;
}
}
- 浏览器访问接口 http://127.0.0.1:8081/hello/name
配置文件命名匹配规则
通过这一串操作,也能看出来是这三个字段关联出nacos中实际的配置文件的,同时也是指定了namepase的命名空间
热配置
nacos带着两种热配置的方式,不需要重启项目就能将配置的修改应用起来
1.@RefreshScope
在引入@value的类上方添加该注解,这个不做过多演示了
2.@ConfigurationProperties
- 先改一下配置文件中的参数
- 将name作为参数放入一个实体类,并且扫描到spring容器中
@Component
@ConfigurationProperties(prefix = "hi")
public class Human {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 引用方式改成注入方式
@RestController
@RequestMapping
public class TestController {
@Resource
public Human human;
@GetMapping("/hello/name")
public String getName(){
return human.getName();
}
}
可以自己验证一下,这样就是热配置了。
@ConfigurationProperties 是springBoot提供的一种注解,nacos在此基础上做到了热配置
多服务共享配置
- bootstrap增加共享的配置
shared-configs:
- dataId: common.yaml
- 新建配置文件(test下新建的)
- controller增加代码
@Value("${hello.common}")
public String common;
@GetMapping("/hello/common")
public String getCommon(){
return common;
}
- 另一个项目也这样配置,就快速复制粘贴了
server:
port: 8082
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
cluster-name: sh
namespace: 20c0e599-919c-483a-a3d7-c73eaf3b4e7c
ephemeral: false
config:
file-extension: yaml
server-addr: 127.0.0.1:8848
namespace: 20c0e599-919c-483a-a3d7-c73eaf3b4e7c
shared-configs:
- dataId: common.yaml
application:
name: teacher
profiles:
active: test
代码
@RestController
@RequestMapping
public class TestController {
@Value("${hello.common}")
public String common;
@GetMapping("/hello/common")
public String getCommon(){
return common;
}
}
http://127.0.0.1:8082/hello/common