Agrega soporte para configurar aplicaciones Core .NET utilizando Consul. Funciona muy bien con git2consul.
ConvertConsulKVPairToConfig Agregue Winton.Extensions.Configuration.Consul a las dependencias de su proyecto, ya sea a través del Administrador de paquetes Nuget o como un PackageReference en el archivo CSProj.
La biblioteca proporciona un método de extensión llamado AddConsul para IConfigurationBuilder de la misma manera que lo hacen otros proveedores de configuración. El IConfigurationBuilder generalmente se configura en el Program o la clase Startup para una aplicación ASP.NET Core. Consulte la documentación de Microsoft para obtener más información sobre IConfigurationBuilder .
A continuación se muestra un ejemplo mínimo:
builder
. AddConsul ( $ " { env . ApplicationName } / { env . EnvironmentName } " ) ; Suponiendo que la aplicación se esté ejecutando en el entorno de 'Desarrollo' y el nombre de la aplicación es 'Sitio web', entonces esto cargará un objeto de configuración JSON desde el Website/Development en Cónsul.
AddConsul tiene una sobrecarga con un tercer parámetro adicional de Action<IConsulConfigurationSource> que permite establecer las opciones que se describen a continuación.
ConsulConfigurationOptions
Una Action<ConsulClientConfiguration> que se puede utilizar para configurar el cliente Cónsul subyacente.
ConsulHttpClientHandlerOptions
Una Action<HttpClientHandler> que se puede usar para configurar las opciones de controlador HTTP del cliente subyacente.
ConsulHttpClientOptions
Una Action<HttpClient> que se puede utilizar para configurar las opciones HTTP del cliente subyacente.
KeyToRemove
La parte de la tecla Cónsul para eliminar de las teclas de configuración. De manera predeterminada, cuando se analiza la configuración, las teclas se crean eliminando la tecla raíz en el cónsul donde se encuentra la configuración. Este valor predeterminado a Key .
OnLoadException
Una Action<ConsulLoadExceptionContext> que se puede usar para configurar cómo se deben manejar excepciones durante la primera carga.
OnWatchException
A Func<ConsulWatchExceptionContext, TimeSpan> que se puede usar para configurar cómo deben manejarse las excepciones al observar los cambios. El TimeSpan que se devuelve se usa para establecer un retraso antes de volver a intentarlo. ConsulWatchExceptionContext proporciona datos que se pueden utilizar para implementar una estrategia de retroceso o para cancelar la observación por completo.
Optional
Un bool que indica si la configuración es opcional. Si es false , se lanzará durante la primera carga si falta la configuración para la tecla dada. El valor predeterminado es false .
Parser
El analizador para usar, lo que debería coincidir con el formato de la configuración almacenada en el cónsul. El valor predeterminado a JsonConfigurationParser . Usarlos en Winton.Extensions.Configuration.Consul.Parsers o cree el suyo implementando IConfigurationParser .
PollWaitTime
La cantidad de tiempo que el cliente debe esperar antes de salir al tiempo de tiempo al sondear para los cambios. Si esto se establece demasiado bajo, puede conducir a solicitudes excesivas que se emiten a Cónsul. Tenga en cuenta que esta configuración no afecta la rapidez con que se propagan las actualizaciones, porque cuando un valor cambia, la consulta de votación larga regresa de inmediato. Es mejor pensar en esto como la frecuencia con la que emite llamadas en el largo bucle de votación en el caso de que no haya cambios. El valor predeterminado a 5 minutos.
ReloadOnChange
Un bool que indica si recargar la configuración cuando cambia en el cónsul. Si true , verá la clave configurada para los cambios. Cuando ocurra un cambio, la configuración se volverá a cargar asincrónicamente y el IChangeToken se activará para indicar que la configuración ha sido recargada. El valor predeterminado es false .
ConvertConsulKVPairToConfig
Un Func<KVPair, IEnumerable<KeyValuePair<string, string>>> que le brinda un control completo sobre el análisis de claves de cónsul totalmente calificadas y valores de cónsul sin procesar; La implementación predeterminada:
Parser configurado para analizar los valores del cónsulKeyToRemove configurado de las teclas Cónsul Sin embargo, al configurar este miembro, si el procesamiento predeterminado de la tecla y el valor del valor, Parser y KeyToRemove no tienen ningún efecto a menos que su función ConvertConsulKVPairToConfig los use.
De manera predeterminada, este proveedor de configuración cargará todos los pares de valor clave de Cónsul bajo la tecla raíz especificada, pero de manera predeterminada supone que los valores de las teclas de hoja están codificados como JSON.
Tome el siguiente ejemplo de una instancia particular de la tienda Cónsul KV:
- myApp/
- auth/
{
"appId": "guid",
"claims": [
"email",
"name"
]
}
- logging/
{
"level": "warn"
}
En este caso, podríamos agregar cónsul como fuente de configuración como así:
var configuration = builder
. AddConsul ( "myApp" , cancellationToken )
. Build ( ) ; La configuración resultante contendría secciones para auth y logging . Como un ejemplo concreto configuration.GetValue<string>("logging:level") devolvería "warn" y configuration.GetValue<string>("auth:claims:0") devolvería "email" .
Sin embargo, a veces, la configuración en el cónsul se almacena como un conjunto de claves expandidas. Por ejemplo, herramientas como la configuración de carga de consul-cli en este formato.
La configuración en este caso puede considerarse como un árbol bajo una tecla raíz específica en el cónsul. Por ejemplo, continuando con el ejemplo anterior, la configuración se almacenaría como:
- myApp/
- auth/
- appId/
"guid"
- claims/
0/
"email"
1/
"name"
- logging/
- level/
"warn"
Como se describe anteriormente, este proveedor de configuración trata con claves recursivas de forma predeterminada. La única diferencia aquí es que los valores ya no están codificados como JSON. Por lo tanto, para cargar esta configuración, el analizador debe cambiarse. Esto se puede hacer así al agregar el proveedor de configuración:
builder
. AddConsul (
"myApp" ,
options =>
{
options . Parser = new SimpleConfigurationParser ( ) ;
} ) ; SimpleConfigurationParser espera encontrar un valor escalar en cada llave de hoja en el árbol.
Si necesita admitir tanto los valores expandidos como los valores JSON, esto se puede lograr colocándolas en diferentes claves raíz y agregando múltiples fuentes de configuración. Por ejemplo:
builder
. AddConsul (
"myApp/expandedKeys" ,
options =>
{
options . Parser = new SimpleConfigurationParser ( ) ;
} )
. AddConsul ( "myApp/jsonValues" , cancellationToken ) ;ConvertConsulKVPairToConfig A veces es posible que necesite más control sobre la conversión de pares de cónsul KV en bruto en datos IConfiguration . En este caso, puede establecer una función ConvertConsulKVPairToConfig personalizada:
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 }
} ;
} ;
} ) ;
PRECAUCIÓN: al personalizar esta estrategia ConvertConsulKVPairToConfig, no pasa por alto cualquier invocación automática delParserconfigurado yKeyToRemovepara que se convierta en su responsabilidad usarlos según sea necesario por su escenario.