增加了使用领事配置.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的任何自动调用,以便您有责任按照您的情况使用它们。