增加了使用領事配置.NET核心應用程序的支持。與Git2Consul一起工作。
ConvertConsulKVPairToConfig策略通過Nuget軟件包管理器或CSPROJ文件中的PackageReference添加Winton.Extensions.Configuration.Consul 。
該庫提供了一種稱為IConfigurationBuilder的AddConsul的擴展方法,就像其他配置提供商一樣。通常在ASP.NET Core應用程序的Program或Startup類中配置IConfigurationBuilder 。有關IConfigurationBuilder的更多信息,請參見Microsoft的文檔。
一個最小示例如下所示:
builder
. AddConsul ( $ " { env . ApplicationName } / { env . EnvironmentName } " ) ;假設該應用程序在“開發”環境中運行,並且應用程序名稱為“網站”,則將從領事中的Website/Development密鑰中加載JSON配置對象。
AddConsul的過載具有類型Action<IConsulConfigurationSource>的其他第三個參數,該參數允許設置以下概述的選項。
ConsulConfigurationOptions
Action<ConsulClientConfiguration>可用於配置基礎領事客戶端。
ConsulHttpClientHandlerOptions
Action<HttpClientHandler>可用於配置基礎領事客戶端的HTTP處理程序選項。
ConsulHttpClientOptions
Action<HttpClient>可用於配置基礎領事客戶端的HTTP選項。
KeyToRemove
領事鍵的部分從配置密鑰中刪除。默認情況下,在解析配置時,將通過刪除配置所在的位置中的cons鍵來創建鍵。此默認為Key 。
OnLoadException
Action<ConsulLoadExceptionContext>可用於配置應處理第一個負載期間的異常。
OnWatchException
Func<ConsulWatchExceptionContext, TimeSpan> ,可用於配置應處理更改時的異常。返回的TimeSpan用於在重試之前設置延遲。 ConsulWatchExceptionContext提供了可用於實現後退策略或完全取消觀看的數據。
Optional
指示配置是否可選的bool 。如果為false ,則如果給定鍵缺少配置,則將在第一個加載期間投擲。默認為false 。
Parser
要使用的解析器,該解析器應與駐領事中存儲的配置的格式匹配。默認為JsonConfigurationParser 。要么使用Winton.Extensions.Configuration.Consul.Parsers下的那些,要么通過實現IConfigurationParser創建自己的parser。
PollWaitTime
客戶應在輪詢更改時等待時間的時間。如果設置得太低,則可能導致發出過多的要求進行領事。請注意,此設置不會影響更新的速度,因為當值更改時,長時間的輪詢查詢會立即返回。最好將此視為在沒有變化的情況下,在長期投票循環中發出調用的頻率。默認為5分鐘。
ReloadOnChange
bool指示在領事中更改配置時是否重新加載配置。如果為true它將觀看已配置的鍵進行更改。當發生更改時,配置將被異步重新加載,並觸發IChangeToken ,以表示配置已重新加載。默認為false 。
ConvertConsulKVPairToConfig
一個Func<KVPair, IEnumerable<KeyValuePair<string, string>>>它使您可以完全控製完全合格的領事鑰匙和原始領事價值;默認實現將:
Parser來解析領事值KeyToRemove前綴但是,在設置此成員時,除非您的ConvertConsulKVPairToConfig函數使用它們,否則您繞過默認密鑰和值處理,而Parser和KeyToRemove無效。
默認情況下,此配置提供商將在指定的根鍵下從領事中加載所有鍵值對,但是默認情況下,它假定葉鍵的值編碼為JSON。
以領事KV商店的特定實例為以下示例:
- myApp/
- auth/
{
"appId": "guid",
"claims": [
"email",
"name"
]
}
- logging/
{
"level": "warn"
}
在這種情況下,我們可以將領事添加為類似的配置來源:
var configuration = builder
. AddConsul ( "myApp" , cancellationToken )
. Build ( ) ;最終的配置將包含用於auth和logging部分。作為一個具體示例configuration.GetValue<string>("logging:level")將返回"warn"和configuration.GetValue<string>("auth:claims:0")將返回"email" 。
但是,有時,領事中的配置被存儲為一組擴展的密鑰。例如,以這種格式採用consul-cli加載配置等工具。
在這種情況下,配置可以被認為是領事中特定根鍵下的樹。例如,繼續上面的示例,該配置將存儲為:
- myApp/
- auth/
- appId/
"guid"
- claims/
0/
"email"
1/
"name"
- logging/
- level/
"warn"
如上所述,此配置提供商默認情況下處理遞歸密鑰。這裡唯一的區別是值不再編碼為JSON。因此,為了加載此配置,必須更改解析器。這可以像添加配置提供商時一樣完成:
builder
. AddConsul (
"myApp" ,
options =>
{
options . Parser = new SimpleConfigurationParser ( ) ;
} ) ; SimpleConfigurationParser期望在樹上的每個葉子鍵處遇到標量值。
如果您需要支持擴展的鍵和JSON值,則可以通過將它們放置在不同的根鍵並添加多個配置源來實現。例如:
builder
. AddConsul (
"myApp/expandedKeys" ,
options =>
{
options . Parser = new SimpleConfigurationParser ( ) ;
} )
. AddConsul ( "myApp/jsonValues" , cancellationToken ) ;ConvertConsulKVPairToConfig策略有時,您可能需要更多地控制原始領事KV對轉換為IConfiguration數據。在這種情況下,您可以設置自定義ConvertConsulKVPairToConfig函數:
builder
. AddConsul (
"myApp" ,
options =>
{
options . ConvertConsulKVPairToConfig = kvPair =>
{
var normalizedKey = kvPair . Key
. Replace ( "base/key" , string . Empty )
. Replace ( "__" , "/" )
. Replace ( "/" , ":" )
. Trim ( '/' ) ;
using Stream valueStream = new MemoryStream ( kvPair . Value ) ;
using var streamReader = new StreamReader ( valueStream ) ;
var parsedValue = streamReader . ReadToEnd ( ) ;
return new Dictionary < string , string > ( )
{
{ normalizedKey , parsedValue }
} ;
} ;
} ) ;
注意:通過自定義此 ConvertConsulKVPairToConfig策略,您繞過了配置的Parser和KeyToRemove的任何自動調用,以便您有責任按照您的情況使用它們。