一、使用Nacos管理配置
一般我们都将配置交给application管理,但是每个微服务都有自己的application,这样一来不利于维护,接下来咱们就来看看Nacos是如何管理配置的;
一、首先加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
二、创建一个bootstrap.yml文件,并配置:
spring:
application:
name: member
profiles:
active: dev
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
三、在Nacos控制台中添加配置:
参数详解:
Data ID:member对应spring.application.name(应用名称),dev对应spring.profiles.active(开发版本),yaml对应spring.cloud.nacos.config.file-extension(指使用什么类型文件),并且在选择配置格式时必须和Data ID的文件类型一致;
四、使用方面和平常使用配置在项目内的内容一致:
@Value("${my.configuration}")
private String myConfiguration;
@GetMapping("/testConfiguration")
public String testConfiguration(){
return myConfiguration;
}
二、配置属性动态刷新与回滚(附回滚Bug)
只需要添加上@RefreshScope注解即可在配置内容修改时不重启项目自动刷新:
@RestController
@RequestMapping("/member")
//开启动态更新配置内容
@RefreshScope
public class MemberController {
@Value("${my.configuration}")
private String myConfiguration;
@GetMapping("/testConfiguration")
public String testConfiguration(){
return myConfiguration;
}
nacos控制台太提供了回滚功能,只需在历史版本菜单中填上Data ID和Group即可查询到该配置的历史版本,选择需要回滚的版本即可,不过这里有个bug,如果回滚到初始版本,会导致该配置直接被删除,不过也不用太担心,官方表示在Nacos V1.2版本已经修复该bug了;
三、开发、测试、正式版本如何共享配置
在开发、测试、正式三个版本中,肯定有些配置是一致的,那这时候就可以将这些一致的配置共享,不需要去每个版本都设置一遍,减少工作量,通过下面两句启动日志可以发现,member微服务下载配置时先下载member-dev.yaml,接着会再去下载member.yaml,聪明的小伙伴应该已经知道如何做了吧,没错,就是将共享的配置放在member.yaml中即可,也就是应用名称.文件属性的配置文件就是三个版本的共享文件,优先级的话是member-dev.yaml>member.yaml(即指定配置>通用配置);
Loading nacos data, dataId: 'member-dev.yaml', group: 'DEFAULT_GROUP'
Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='member-dev.yaml'}, NacosPropertySource {name='member.yaml'}]}
四,不同应用如何共享配置
不同的应用之间肯定也有相同的配置,比如相同的Nacos注册地址等,下面我们就来看两种应用间的共享配置方式:
方式一:
使用shared-dataids,只需在bootstrap.yml文件中添加上如下配置即可:
spring:
application:
name: member
profiles:
active: prod
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
#共享配置的Data ID,多个使用,分隔
#越靠后,优先级越高;normal.yaml>common.yaml
#.yaml后缀不能少,目前只支持yaml/properties
shared-dataids: common.yaml,normal.yaml
#哪些共享配置支持动态刷新,多个用,隔开
refreshable-dataids: common.yaml,normal.yaml
方式二:
使用ext-config方式配置,同样配置在bootstrap.yml文件中:
spring:
application:
name: member
profiles:
active: prod
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
ext-config:
#共享配置的Data ID,yaml后缀不能少,目前只支持yaml/properties
#越靠后,优先级越高;normal.yaml>common.yaml
- data-id: common.yaml
#common.yaml所在的group
group: DEFAULT_GROUP
#是否允许刷新,默认false
refresh: true
- data-id: normal.yaml
group: DEFAULT_GROUP
refresh: true
我们现在已经学会了自动配置方式,shared-dataids方式,ext-config方式,当这三中方式都有配置时,优先级为:shared-dataids<ext-config<自动
五、本地配置VS远程配置
默认情况下,远程配置的优先级更高,如果想要让本地配置优先级高于远程配置,需在application.yml(看清楚,不是bootstrap.yml)中配置:
spring:
cloud:
config:
#是否允许本地配置覆盖远程配置
allow-override: true
#是否一切以本地配置为准,默认false
override-none: false
#系统环境变量或系统属性才能覆盖远程配置文件的配置
#本地配置文件中配置优先级低于远程配置,默认true
override-system-properties: true
六、搭建生产可用的Nacos集群
因为Nacos的配置都存在内嵌的derby数据库中,这样一来就无法将derby变成高可用模式,那么如何搭建成产可用的Nacos集群呢?详见该手记:http://www.imooc.com/article/288153
七、实践总结
一、能放本地,不放远程
因为放在本地,开发人员能够更好的查看配置信息和排查错误和修改;
二、尽量规避优先级
三、定规范,例如所有配置属性都要加上注释
四、配置管理人员尽量少
因为现在Nacos并没有做权限管理,有些配置等级较高,并不能让所有开发人员都看到;