目錄
- Spring Cloud開發實踐(一): 簡介和根模塊
- Spring Cloud開發實踐(二): Eureka服務和介面定義
- Spring Cloud開發實踐(三): 介面實作和下游呼叫
- Spring Cloud開發實踐(四): Docker部署
- Spring Cloud開發實踐(五): Consul - 服務注冊的另一個選擇
- Spring Cloud開發實踐(六): 基于Consul和Spring Cloud 2021.0的演示專案
- Spring Cloud開發實踐(七): 集成Consul配置中心
Spring Cloud Consul Config
Consul 通過 Key/Value 功能集中管理存盤配置資訊, 通過 Spring Cloud Consul Config 可以實作 Config Server 和 Client 的關聯. 在 Spring 啟動的 bootstrap 階段, 配置會被載入環境背景關系.
配置前綴, 路徑和優先級
默認情況下, 配置的路徑前綴是 /config , 不同的 application 和 profile 對應不同的配置路徑, 例如對應應用 "testApp" 和 "dev" profile 的配置, 會涉及以下路徑
config/testApp,dev/
config/testApp/
config/application,dev/
config/application/
這個串列從上往下分別對應的配置優先級從高到低, 優先級高的同樣配置項會覆寫優先級低的配置項.
- config/application/ 全域公共配置, 對應使用 config 前綴的所有應用
- config/application,dev/ 全域dev公共配置, 對應使用 config 前綴的所有, 且啟用 dev profile 的應用
- config/testApp/ 對應使用 config 前綴的, 名稱為 testApp 的應用
- config/testApp,dev/ 對應使用 config 前綴的, 名稱為 testApp, 且啟用 dev profile 的應用
注意: 配置對應的 profile 和節點應用名是平級的, config/service-name,dev/data 這樣, data 是配置的子項, 不要把 profile 加到 data 去了
在專案中啟用 Consul Config
如果要使用 Consul 的分布式配置(Distributed Configuration), 需要添加 spring-cloud-starter-consul-config 的依賴
spring-cloud-starter-consul-discovery 不帶 spring-cloud-starter-consul-config, 如果需要用 Consul Config, 需要單獨添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
也可以直接用 spring-cloud-starter-consul-all, 包含了 spring-cloud-starter-consul-discovery 和 spring-cloud-starter-consul-config
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-all</artifactId>
</dependency>
組態檔 application.yml
添加了 consul-config 依賴之后, 在 application.yml 就要增加對應的設定 spring.config.import = consul: 否則啟動會報錯,
Spring Boot 在 2.4 版本之后新增了這個項(spring.config.import property)用于匯入配置, 并且是默認的配置方式.
# properties
spring.config.import=optional:consul:
# yaml
spring:
config:
import: 'consul:'
上面的配置, 如果啟動時import失敗會導致啟動失敗, 如果不強制 import, 可以加上 optional:
# properties
spring.config.import=optional:consul:
# yaml
spring:
config:
import: 'optional:consul:'
上面的這兩個配置, 都會用默認的地址 http://localhost:8500 去請求 Consul 服務, 如果需要自定義地址, 可以通過配置spring.cloud.consul.host和spring.cloud.consul.port,
spring:
cloud:
consul:
host: 10.123.123.123
port: 8501
或者使用
spring.config.import=optional:consul:myhost:8500
對應以上配置, 在 Spring 啟動的 bootstrap 階段會通過 Consul 去獲取 key = config/dummy-service/data 對應的 value (假定這個模塊的 application.name = dummy-service),
對應value格式為 yaml, 需要增加配置
# yaml
spring:
cloud:
consul:
config:
format: YAML
prefix: config
data-key: data
其中
format: YAML設定配置格式prefix: config修改 config/dummy-service/data 的前綴data-key: data修改 config/dummy-service/data 的后綴
默認的請求路徑生成基于
- spring.cloud.consul.config.name , 值默認等于 spring.application.name
- spring.cloud.consul.config.default-context , 這個值默認等于 application
- spring.profiles.active , 可以在啟動時通過 VM Option
-Dspring.profiles.active=xxx指定
如果不想用默認的, 想自己指定, 可以用如下的方式
# properties
spring.config.import=optional:consul:myhost:8500/config/custom/context/one;/config/custom/context/two
上面的設定將只從這兩個Key/Value路徑讀取配置, 注意路徑的對應關系, 在import中體現前綴 config, 但是不體現后綴 data
- /config/custom/context/one/data
- /config/custom/context/two/data
配置自動更新, Config Watch
Consul Config Watch 使用 consul 的路徑前綴對配置更新進行檢查, 當配置變化時會產生一個 Refresh Event, 等價于請求 /refresh actuator endpoint.
默認的檢查頻率為 1000 單位毫秒, 可以通過 spring.cloud.consul.config.watch.delay 配置
如果要禁用配置自動更新, 需要設定 spring.cloud.consul.config.watch.enabled=false
Consul 配置管理
通過 WEB 界面
默認為 http://127.0.0.1:8500 可以在 Key/Value 中直接添加, 記得格式要改為 YAML
通過命令列
讀取
$ ./consul kv get foo
bar
$ ./consul kv get config/application/data
cassandra:
host: 127.0.0.1:9042,127.0.0.2:9042
user: my_user
password: my_pass
使用檔案data.yml中的內容, 直接寫入
$ ./consul kv put config/application/data @data.yml
Success! Data written to: config/application/data
The data can be retrieved the same way,
使用配置
經過以上配置, 在項目中就可以通過 @Configuration 獲取 Consul 中配置的資訊
@Slf4j
@Configuration
public class CommonConfig {
@Value("${common.name}")
private String name = "Dummy";
@Value("${common.code}")
private String code = "001";
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getCode() {return code;}
public void setCode(String code) {this.code = code;}
@PostConstruct
public void postConstruct() {
log.info("name: {}", name);
log.info("code: {}", code);
}
}
參考
- Spring Docs: Distributed Configuration with Consul
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554061.html
標籤:其他
下一篇:返回列表
