配置中心nacos

配置文件在项目中出现的问题

我们一般把配置文件以yml或properties的形式放在项目中,修改了配置文件之后,只有重启服务后,配置文件才能生效

配置中心优点

1.动态更新配置文件

2.统一配置管理

配置文件分级管理

与服务器状态保持一致

文件管理

问题

(配置中心>命令行>配置文件)

发布配置文件到配置中心

1.新建命名空间

2.在配置列表中新建配置

DataId配置规范

${prefix}-${spring.profiles.active}.${file-extension}

${prefix}: 前缀 - 服务名

${spring.profiles.active}: 环境名

${file-extension}: 文件后缀名

将配置格式改为yaml,然后将将本地的项目的application配置文件复制到配置中,并注释掉本地配置(避免启动项目时两者发生冲突)

3.导入依赖

因为要在微服务启动时就要访问到nacos配置中心,所以需要导入依赖开启nacos配置中心支持

因为本地application.yml文件放入nacos中后无法访问到配置中心的配置,先要读取到bootstrap文件中nacos的有关配置信息读取到配置中心的位置后,才能读取到nacos中的配置文件,所以bootstrap.yml(启用级配置)要优先application.yml(应用级配置)配置文件先加载,

由于bootstrap.yml权限太高现在已经被springcloud禁用,需要导入bootstrap.yml启用

1
2
3
4
5
6
7
8
9
10
11
12
<!--        开启对bootstrap.yml的支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

<!-- 开启nacos配置中心支持-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>

4.新建本地bootstrap.yml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
cloud:
nacos:
config:
server-addr: localhost:8848 #配置中心的地址
#namespace -> group ->${prefix}-${spring.profiles.active}.${file-extension}
namespace: res134 #指定命名空间
group: DEFAULT_GROUP #分组
#nacos的用户名和密码
username: nacos
password: nacos
prefix: res-foods #服务名
file-extension: yml #后缀名
profiles:
active: dev #环境名

配置完成后进行测试,看看日志信息中是否读取是nacos中的配置

新增产品配置

项目上线配置

新增一个res-foods-prod.yml的产品配置,只需对原配置文件端口号和bootstrap.yml中的环境配置项进行修改即可,后续配置待定进行修改

1
2
3
4
5
6
7
8
#res-foods-prod.yml
server:
port: 9200

#bootstrap.yml
spring:
profiles:
active: prod

动态刷新配置

新增一个显示日期的服务,用户DI注入从属性文件读取配置的方式读取到配置文件中显示日期的格式,通过修改配置中心配置文件中日期格式来感知自动刷新配置(修改配置文件后不需要重启本地服务-动态刷新配置)

要求:

引入了actuator的依赖

1
2
3
4
5
><!-- 端点监控  用来监控当前服务节点运行状态-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

因为@RefreshScope 底层结合了actuator支持,且开放了refreshSocpe端点

在修改配置文件的同时,nacos实际上向项目中resfood服务的refreshSocpe端点发送了一个请求(http://localhost:9200/actuator/refresh在尾部衔接一个参数)来告知你的属性值进行了更改

1.在Controller类中新增一个服务用于显示系统当前的时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RestController
@RequestMapping("resfood")
@Slf4j
//动态刷新配置
@RefreshScope //这个注解只能在类和方法上标明,并且要求actuator暴露endpoints端点
public class ResFoodController {
@Value("${res.pattern.dateFormat}")
//利用di机制,从属性文件读取配置,这里是时间显示的格式
private String dateFormatString;

@RequestMapping(value = "timeService",method={RequestMethod.GET})
public Map<String,Object> timeService(){
Date date = new Date();
DateFormat df = new SimpleDateFormat(dateFormatString);
String dString = df.format(date);
Map<String ,Object> map = new HashMap<>();
map.put("code",1);
map.put("obj",dString);
return map;
}
}

2.在产品配置文件中声明时间格式

1
2
3
res:
pattern:
dateFormat: yyyy:MM:dd hh:mm:ss

3.启动项目并访问新增的这个服务

4.修改日期格式

自动感知属性值的变化

5.再次访问这个服务

通过这个过程理解动态刷新配置的作用

配置文件的版本控制

nacos提供了历史版本功能, 可以通过界面提供的历史版本模块来查看和管理配置的历史版本

可以通过详情查看当前版本的详情

可以通过回滚来恢复历史的版本

可以通过比较两个版本对比当前版本与历史版本的不同或基于历史版本所进行修改的详细内容

共享配置

更新数据源