為云構(gòu)建的應(yīng)用程序通常需要適應(yīng)在云環(huán)境中運(yùn)行,以分布式方式讀取和共享配置,并在必要時(shí)將配置外部化到環(huán)境中。
Micronaut 的環(huán)境概念默認(rèn)是云平臺(tái)感知的,并盡最大努力檢測(cè)底層的活動(dòng)環(huán)境。
然后,您可以使用 Requires 注釋有條件地加載 bean 定義。
下表總結(jié)了 Environment 接口中的常量并提供了一個(gè)示例:
常量 | 描述 | 需要示例 | 環(huán)境名稱(chēng) |
---|---|---|---|
該應(yīng)用程序作為 Android 應(yīng)用程序運(yùn)行 |
|
|
|
應(yīng)用程序在 JUnit 或 Spock 測(cè)試中運(yùn)行 |
|
|
|
該應(yīng)用程序在云環(huán)境中運(yùn)行(適用于所有其他云平臺(tái)類(lèi)型) |
|
|
|
在亞馬遜 EC2 上運(yùn)行 |
|
|
|
在谷歌 Compute 上運(yùn)行 |
|
|
|
在 Kubernetes 上運(yùn)行 |
|
|
|
在 Heroku 上運(yùn)行 |
|
|
|
在 Cloud Foundry 上運(yùn)行 |
|
|
|
在微軟 Azure 上運(yùn)行 |
|
|
|
在 IBM Cloud 上運(yùn)行 |
|
|
|
在 Digital Ocean 上運(yùn)行 |
|
|
|
在 Oracle Cloud 上運(yùn)行 |
|
|
請(qǐng)注意,您可以激活多個(gè)環(huán)境,例如在 AWS 上的 Kubernetes 中運(yùn)行時(shí)。
此外,使用上表中定義的常量值,您可以創(chuàng)建特定于環(huán)境的配置文件。例如,如果您創(chuàng)建一個(gè) src/main/resources/application-gcp.yml 文件,它只會(huì)在 Google Compute 上運(yùn)行時(shí)加載。
Environment 中的任何配置屬性也可以通過(guò)環(huán)境變量進(jìn)行設(shè)置。例如,設(shè)置 CONSUL_CLIENT_HOST 環(huán)境變量會(huì)覆蓋 ConsulConfiguration 中的主機(jī)屬性。
使用云實(shí)例元數(shù)據(jù)
當(dāng) Micronaut 檢測(cè)到它正在受支持的云平臺(tái)上運(yùn)行時(shí),它會(huì)在啟動(dòng)時(shí)填充接口 ComputeInstanceMetadata。
從 Micronaut 2.1.x 開(kāi)始,此邏輯取決于是否存在適用于 Oracle Cloud、AWS 或 GCP 的適當(dāng)核心云模塊。
所有這些數(shù)據(jù)都合并到正在運(yùn)行的 ServiceInstance 的元數(shù)據(jù)屬性中。
要訪問(wèn)應(yīng)用程序?qū)嵗脑獢?shù)據(jù),您可以使用 EmbeddedServerInstance 接口,并調(diào)用返回元數(shù)據(jù)映射的 getMetadata()。
如果您通過(guò)客戶端遠(yuǎn)程連接,一旦您從 LoadBalancer 或 DiscoveryClient API 檢索到 ServiceInstance,就可以引用實(shí)例元數(shù)據(jù)。
Netflix Ribbon 客戶端負(fù)載均衡器可以配置為使用元數(shù)據(jù)進(jìn)行區(qū)域感知客戶端負(fù)載均衡。
要通過(guò)服務(wù)發(fā)現(xiàn)獲取服務(wù)的元數(shù)據(jù),請(qǐng)使用 LoadBalancerResolver 接口來(lái)解析 LoadBalancer 并通過(guò)標(biāo)識(shí)符獲取對(duì)服務(wù)的引用:
獲取服務(wù)實(shí)例的元數(shù)據(jù)
LoadBalancer loadBalancer = loadBalancerResolver.resolve("some-service");
Flux.from(
loadBalancer.select()
).subscribe((instance) ->
ConvertibleValues<String> metaData = instance.getMetadata();
...
);
EmbeddedServerInstance 可通過(guò)偵聽(tīng) ServiceReadyEvent 的事件偵聽(tīng)器獲得。 @EventListener 注釋使監(jiān)聽(tīng) bean 中的事件變得容易。
要獲取本地運(yùn)行的服務(wù)器的元數(shù)據(jù),請(qǐng)使用 ServiceReadyEvent 的 EventListener:
獲取本地服務(wù)器的元數(shù)據(jù)
@EventListener
void onServiceStarted(ServiceReadyEvent event) {
ServiceInstance serviceInstance = event.getSource();
ConvertibleValues<String> metadata = serviceInstance.getMetadata();
}
分布式配置
如您所見(jiàn),Micronaut 具有一個(gè)健壯的系統(tǒng),用于外部化和調(diào)整配置以適應(yīng)受 Grails 和 Spring Boot 中類(lèi)似方法啟發(fā)的環(huán)境。
但是,如果你想讓多個(gè)微服務(wù)共享配置怎么辦? Micronaut 包括用于分布式配置的 API。
ConfigurationClient 接口有一個(gè) getPropertySources 方法,可以實(shí)現(xiàn)該方法以從分布式源讀取和解析配置。
getPropertySources 返回發(fā)出零個(gè)或多個(gè) PropertySource 實(shí)例的 Publisher。
默認(rèn)實(shí)現(xiàn)是 DefaultCompositeConfigurationClient,它將所有已注冊(cè)的 ConfigurationClient bean 合并到一個(gè) bean 中。
您可以實(shí)現(xiàn)自己的 ConfigurationClient 或使用 Micronaut 提供的實(shí)現(xiàn)。以下部分涵蓋了這些內(nèi)容。
HashiCorp 領(lǐng)事支持
Consul 是由 HashiCorp 提供的流行的服務(wù)發(fā)現(xiàn)和分布式配置服務(wù)器。 Micronaut 有一個(gè)原生的 ConsulClient,它使用 Micronaut 對(duì)聲明式 HTTP 客戶端的支持。
啟動(dòng)領(lǐng)事
開(kāi)始使用 Consul 的最快方法是通過(guò) Docker:
使用 Docker 啟動(dòng) Consul
docker run -p 8500:8500 consul
或者,您可以安裝并運(yùn)行本地 Consul 實(shí)例。
使用 Consul 啟用分布式配置
使用 CLI
如果您使用 Micronaut CLI 創(chuàng)建項(xiàng)目,請(qǐng)?zhí)峁?nbsp;config-consul 功能以在您的項(xiàng)目中啟用 Consul 的分布式配置:
$ mn create-app my-app --features config-consul
要啟用分布式配置,請(qǐng)確保啟用 [bootstrap] 并使用以下配置創(chuàng)建 src/main/resources/bootstrap.[yml/toml/properties] 文件:
Properties | Yaml | Toml | Groovy | Hocon | JSON |
|
|
|
|
|
|
啟用分布式配置后,將要共享的配置存儲(chǔ)在 Consul 的鍵/值存儲(chǔ)中。有很多方法可以做到這一點(diǎn)。
將配置存儲(chǔ)為鍵/值對(duì)
一種方法是將鍵和值直接存儲(chǔ)在 Consul 中。在這種情況下,Micronaut 默認(rèn)在 Consul /config 目錄中查找配置。
您可以通過(guò)設(shè)置 consul.client.config.path 來(lái)更改搜索的路徑
在 /config 目錄中,Micronaut 按優(yōu)先順序在以下目錄中搜索值:
目錄 | 描述 |
---|---|
|
所有應(yīng)用程序共享的配置 |
|
prod 環(huán)境的所有應(yīng)用程序共享的配置 |
|
特定于應(yīng)用程序的配置,示例 /config/hello-world |
|
活動(dòng)環(huán)境的特定于應(yīng)用程序的配置 |
APPLICATION_NAME 的值是您在引導(dǎo)程序配置文件中配置的任何 micronaut.application.name。
要查看實(shí)際效果,請(qǐng)使用以下 cURL 命令在目錄 /config/application 中存儲(chǔ)名為 foo.bar 且值為 myvalue 的屬性。
使用 cURL 寫(xiě)入值
curl -X PUT -d @- localhost:8500/v1/kv/config/application/foo.bar <<< myvalue
如果您現(xiàn)在定義一個(gè) @Value("${foo.bar}") 或調(diào)用 environment.getProperty(..) 值 myvalue 將從 Consul 解析。
在 YAML、JSON 等中存儲(chǔ)配置
一些 Consul 用戶更喜歡將配置存儲(chǔ)在特定格式的 blob 中,例如 YAML。 Micronaut 支持這種模式,并支持以 YAML、JSON 或 Java 屬性格式存儲(chǔ)配置。
ConfigDiscoveryConfiguration 有許多配置選項(xiàng),用于配置發(fā)現(xiàn)分布式配置的方式。
您可以設(shè)置 consul.client.config.format 選項(xiàng)來(lái)配置讀取屬性的格式。
例如,要配置 JSON:
Properties | Yaml | Toml | Groovy | Hocon | JSON |
|
|
|
|
|
|
現(xiàn)在將您的配置以 JSON 格式寫(xiě)入 Consul:
使用 cURL 編寫(xiě) JSON
curl -X PUT localhost:8500/v1/kv/config/application \
-d @- << EOF
{ "foo": { "bar": "myvalue" } }
EOF
將配置存儲(chǔ)為文件引用
另一個(gè)流行的選項(xiàng)是 git2consul,它將 Git 存儲(chǔ)庫(kù)的內(nèi)容鏡像到 Consul 的鍵/值存儲(chǔ)。
您可以設(shè)置一個(gè)包含 application.yml、hello-world-test.json 等文件的 Git 存儲(chǔ)庫(kù),這些文件的內(nèi)容將被克隆到 Consul。
在這種情況下,Consul 中的每個(gè)鍵都代表一個(gè)帶有擴(kuò)展名的文件,例如 /config/application.yml,您必須配置 FILE 格式:
Properties | Yaml | Toml | Groovy | Hocon | JSON |
|
|
|
|
|
|
HashiCorp 金庫(kù)支持
Micronaut 與 HashiCorp Vault 集成,作為分布式配置源。
要啟用分布式配置,請(qǐng)確保啟用 [bootstrap] 并創(chuàng)建一個(gè) src/main/resources/bootstrap.[yml/toml/properties] 文件,其中包含以下配置:
與 HashiCorp Vault 集成
Properties | Yaml | Toml | Groovy | Hocon | JSON |
|
|
|
|
|
|
查看所有配置選項(xiàng)的配置參考。
Micronaut 使用配置的 micronaut.application.name 從 Vault 中查找應(yīng)用程序的屬性源。
目錄 | 描述 |
---|---|
|
所有應(yīng)用程序共享的配置 |
|
特定于應(yīng)用程序的配置 |
|
一個(gè)活動(dòng)環(huán)境名稱(chēng)的所有應(yīng)用程序共享的配置 |
|
活動(dòng)環(huán)境名稱(chēng)的特定于應(yīng)用程序的配置 |
有關(guān)如何設(shè)置服務(wù)器的更多信息,請(qǐng)參閱 HashiCorp Vault 的文檔。
Spring Cloud 配置支持
從 1.1 開(kāi)始,Micronaut 為那些沒(méi)有切換到專(zhuān)用的更完整的解決方案(如 Consul)的人提供了原生的 Spring Cloud 配置。
要啟用分布式配置,請(qǐng)確保啟用 [bootstrap] 并使用以下配置創(chuàng)建 src/main/resources/bootstrap.[yml/toml/properties] 文件:
與 Spring Cloud 配置集成
Properties | Yaml | Toml | Groovy | Hocon | JSON |
|
|
|
|
|
|
retry-attempts 可選,指定重試次數(shù)
retry-delay 是可選的,指定重試之間的延遲
Micronaut 使用配置的 micronaut.application.name 從通過(guò) spring.cloud.config.uri 配置的 Spring Cloud 配置服務(wù)器中查找應(yīng)用程序的屬性源。
有關(guān)如何設(shè)置服務(wù)器的更多信息,請(qǐng)參閱 Spring Cloud Config Server 文檔。
AWS 參數(shù)存儲(chǔ)支持
Micronaut 支持通過(guò) AWS System Manager Parameter Store 共享配置。您需要配置以下依賴(lài)項(xiàng):
Gradle | Maven |
|
|
要啟用分布式配置,請(qǐng)確保已啟用引導(dǎo)程序并使用以下配置創(chuàng)建一個(gè) src/main/resources/bootstrap.yml 文件:
Properties | Yaml | Toml | Groovy | Hocon | JSON |
|
|
|
|
|
|
查看所有配置選項(xiàng)的配置參考。
您可以從 AWS 控制臺(tái) → 系統(tǒng)管理器 → Parameter Store 配置共享屬性。
Micronaut 使用層次結(jié)構(gòu)來(lái)讀取配置值,并支持 String、StringList 和 SecureString 類(lèi)型。
您也可以通過(guò)在下劃線 _ 后包含環(huán)境名稱(chēng)來(lái)創(chuàng)建特定于環(huán)境的配置。例如,如果 micronaut.application.name 設(shè)置為 helloworld,則在 helloworld_test 下指定的配置值將僅應(yīng)用于測(cè)試環(huán)境。
目錄 | 描述 |
---|---|
|
所有應(yīng)用程序共享的配置 |
|
特定于應(yīng)用程序的配置,示例 /config/hello-world |
|
prod 環(huán)境的所有應(yīng)用程序共享的配置 |
|
活動(dòng)環(huán)境的特定于應(yīng)用程序的配置 |
例如,如果在 AWS Parameter Store 中配置了配置名稱(chēng) /config/application_test/server.url,則連接到該參數(shù)存儲(chǔ)的任何應(yīng)用程序都可以使用 server.url 檢索該值。如果應(yīng)用程序?qū)?nbsp;micronaut.application.name 配置為 myapp,則名稱(chēng)為 /config/myapp_test/server.url 的值會(huì)覆蓋該應(yīng)用程序的值。
樹(shù)的每一層都可以由鍵=值對(duì)組成。對(duì)于多個(gè)鍵/值對(duì),將類(lèi)型設(shè)置為 StringList。
對(duì)于特殊的安全信息,例如密鑰或密碼,請(qǐng)使用 SecureString 類(lèi)型。當(dāng)您添加和檢索值時(shí),KMS 將被自動(dòng)調(diào)用,并將使用您帳戶的默認(rèn)密鑰庫(kù)對(duì)其進(jìn)行解密。如果您將配置設(shè)置為不使用安全字符串,它們將以加密方式返回給您,您必須手動(dòng)解密它們。
Oracle Cloud Vault 支持
請(qǐng)參閱使用 Oracle Cloud Vault 文檔的安全分布式配置。
谷歌云發(fā)布/訂閱支持
請(qǐng)參閱 Micronaut GCP Pub/Sub 文檔。
Kubernetes 支持
請(qǐng)參閱 Kubernetes 配置客戶端文檔。
更多建議: