文章目錄
特別聲明:整理自慕課網大目師兄的微服務視頻,鏈接: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