文章目录
特别声明:整理自慕课网大目师兄的微服务视频,链接: https://coding.imooc.com/learn/list/358.html
1.配置文件管理可以帮我们做什么?
- 可以做到不同环境使用不同的配置
- 动态刷新,修改配置属性不用重启应用
- 共享配置文件
2.整合Nacos config
在学习spring-cloud-aibaba第二篇,我们使用Nacos组件实现了服务的注册和发现,现在我们要使用它的配置文件管理这部分功能
2.1 加依赖
因为spring alibaba的版本还是0.9.0.RELEASE,所以groupId是这个,以后改版本了,这个groupId是会变的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.2 加注解
没有注解,过
2.3 写配置
2.3.1 代码端的配置
- resources目录下创建bootstrap.yml,必须是这个名字,潜规则
spring:
cloud:
nacos:
config:
# 指定nacos 控制台地址
server-addr: 118.31.11.178:8848
file-extension: yaml
application:
name: user-center
profiles:
active: dev
2.3.2 Nacos控制台的配置
配置列表---->新增配置
- Data ID
填写规则:bootstrap.yml里的 application.name + profiles.active + file-extension
潜规则,要遵守 - Group
使用默认值就行了,不用动它 - 描述
自由发挥 - 配置格式
目前只支持YAML,Properties,选择和Data ID后缀匹配的格式 - 配置
写具体的配置内容就行了,YAML格式的
jwt.secret: 1234567890
jwt.expirationTimeInSecond: 3600
2.4 测试
属性承载类JwtConfig.java
@Component
@Data
public class JwtConfig {
/**
* token 密钥
*/
@Value("${jwt.secret}")
public String secret;
/**
* token 失效时间,单位秒
*/
@Value("${jwt.expirationTimeInSecond}")
public String expirationTimeInSecond;
}
Controller:
@GetMapping("/getMyProperties")
public Object testProperties() {
return ResponseVO.success(jwtConfig);
}
http://localhost:8082/member/getMyProperties,成功读取到Nacos上的配置
3.Nacos config的一些实用特性
3.1 动态刷新
代码加上@RefreshScope注解,位置在装载配置属性的类上,我这里是JwtConfig.java,也有可能是Controller或者Service之类的
- Controller的使用演示,jwtSecret就是配置的属性
@RestController
@Slf4j
@RequestMapping("/member")
@RefreshScope
public class MemberController {
@Autowired
private MemberService memberService;
@Autowired
private WXConfig wxConfig;
@Autowired
private JwtConfig jwtConfig;
@Value("${jwt.secret}")
private String jwtSecret;
@GetMapping("/getMyProperties")
public Object testProperties() {
return ResponseVO.success(jwtConfig.toString() + " Controller的属性 jwtSecret=" + jwtSecret);
}
- JwtConfig.java的使用演示
@Component
@Data
@RefreshScope
public class JwtConfig {
/**
* token 密钥
*/
@Value("${jwt.secret}")
public String secret;
/**
* token 失效时间,单位秒
*/
@Value("${jwt.expirationTimeInSecond}")
public String expirationTimeInSecond;
}
- 重启项目,http://localhost:8082/member/getMyProperties
- 修改Nacos的配置属性
- 不用重启项目,直接刷新http://localhost:8082/member/getMyProperties,已经可以读取到最新的值了,这就是自动刷新
3.2 配置回滚
- 历史版本列表
- 回滚之前,点击详情检查一下
- 点击回滚
回滚完成之后,再刷新http://localhost:8082/member/getMyProperties,属性值变回之前的了
3.3 配置共享
配置共享分为两部分,1.单服务不同环境配置共享;2.不同服务配置共享
3.3.1 单服务不同环境配置共享
Nacos上新建user-center.yaml,这个文件里的配置就是公用配置,为什么名字要取这个?启动日志里就有
- 新建user-center.yaml
- 更改bootstrap.yml里的profiles.active=prod
Naocs里没有对应prod的配置文件,只能读取公共配置文件user-center.yaml
如果存在user-center-prod.yaml,优先级要高于user-center.yaml
spring:
cloud:
nacos:
config:
# 指定nacos 控制台地址
server-addr: 118.31.11.178:8848
file-extension: yaml
application:
name: user-center
profiles:
# active: dev
active: prod
- 重启服务,刷新http://localhost:8082/member/getMyProperties,读取到了公共配置
3.3.2 不同服务的配置共享
有两种实现方式
3.3.2.1 方式一 shared-dataids
小程序参数和jwt Token的配置是多个应用共用的,所以我把它们提出来
spring:
cloud:
nacos:
config:
# 指定nacos 控制台地址
server-addr: 118.31.11.178:8848
file-extension: yaml
# 不同应用共享配置文件的 Data ID,多个使用,分割
# 越靠后,优先级越高 jwt_common.yaml > wx_common.yaml
# .yaml 不能少,只支持yaml/properties
shared-dataids: wx_common.yaml,jwt_common.yaml
# 支持动态刷新的共享配置文件,多个使用,分割
refreshable-dataids: wx_common.yaml,jwt_common.yaml
application:
name: user-center
profiles:
# active: dev
active: prod
重启user-center
user-center:http://localhost:8082/member/getMyProperties,读取到了jwt-common.yaml
content-center,也新建bootstrap.yml
spring:
cloud:
nacos:
config:
# 指定nacos 控制台地址
server-addr: 118.31.11.178:8848
file-extension: yaml
# 不同应用共享配置文件的 Data ID,多个使用,分割
# 越靠后,优先级越高
# .yaml 不能少,只支持yaml/properties
shared-dataids: jwt_common.yaml
# 支持动态刷新的共享配置文件,多个使用,分割
refreshable-dataids: jwt_common.yaml
application:
name: content-center
content-center:http://localhost:8081/getMyProperties,也读取到了,这就体现了配置的共享
3.3.2.2 方式二 ext-config
这种方式我就不测试了
spring:
cloud:
nacos:
config:
# 指定nacos 控制台地址
server-addr: 118.31.11.178:8848
file-extension: yaml
ext-config:
- data-id: wx_common.yaml
group: DEFAULT_GROUP
refresh: true
- data-id: jwt_common.yaml
group: DEFAULT_GROUP
refresh: true