private static Action <WebHostBuilderContext, IServiceCollection> ConfigureServices( NethiumConfig nethiumConfig, IConsulHandler consulHandler, IConsulBuilder consulBuilder ) => (context, collection) => { var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(context.Configuration["Nethium:ServerSecretKey"] ?? throw new ArgumentNullException("Nethium:ServerSecretKey", "ServerSecretKey not specified in config"))); var tokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = signingKey, RequireExpirationTime = true, ValidateLifetime = true, ValidateAudience = false, ValidateActor = false, ValidateIssuer = false }; collection.AddSingleton( new JwtHeader(new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256))); collection.AddHttpContextAccessor(); collection.AddHttpClient(); collection.Configure <ServerIdentifier>(context.Configuration.GetSection("Nethium")); collection.Configure <ConfigurationOptions>(o => { o.Prefix = nethiumConfig.Prefix !; o.ConfigurationPrefix = nethiumConfig.ConfigurationPrefix; o.Separator = nethiumConfig.Separator !; o.Watch = nethiumConfig.Watch; o.AutoReload = nethiumConfig.AutoReload ?? false; }); collection.AddSingleton(consulHandler); collection.AddSingleton(consulBuilder); collection.AddScoped <IAuthHandler, StubAuthHandler>(); collection.AddScoped <ISwaggerStubHandler, SwaggerStubHandler>(); collection.AddScoped <IConsulKvEndpoint, ConsulKvEndpoint>(); collection.AddScoped <IConsulServiceEndpoint, ConsulServiceEndpoint>(); collection.AddScoped <IServicesLocator, ConsulServicesLocator>(); collection.AddScoped(typeof(IServiceFactory <>), typeof(SwaggerServiceFactory <>)); collection.AddScoped(typeof(IServiceChooseStrategy <>), typeof(NearestStrategy <>)); collection.AddHostedService <NethiumHostedService>(); collection.AddOpenApiDocument(); collection .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = tokenValidationParameters; }); };
private static Action <ConsulClientConfiguration> ClientConfiguration( IConfiguration?bootstrapConfig, NethiumConfig nethiumConfig ) => config => { if (bootstrapConfig != null) { config.Address = bootstrapConfig["Nethium:Consul:Address"] != null ? new Uri(bootstrapConfig["Nethium:Consul:Address"]) : config.Address; config.Datacenter = bootstrapConfig["Nethium:Consul:Datacenter"]; config.Token = bootstrapConfig["Nethium:Consul:Token"]; config.WaitTime = bootstrapConfig["Nethium:Consul:WaitTime"]?.ToTimeSpanSeconds(); } nethiumConfig.ClientConfig?.Invoke(config); };
private static Action <WebHostBuilderContext, IConfigurationBuilder> ConfigureAppConfiguration( ConfigurationOptions configurationOptions, NethiumConfig nethiumConfig, IConsulHandler consulHandler, IConsulBuilder consulBuilder ) => (context, configurationBuilder) => { var consulKvEndpoint = new ConsulKvEndpoint(consulBuilder, nethiumConfig.LoggerFactory?.CreateLogger <ConsulKvEndpoint>()) { WatchExceptionHandler = WatchExceptionHandler }; configurationBuilder .AddJsonFile("nethium.json", true, true) .AddEnvironmentVariables("NETHIUM_") .Add(new ConsulConfigurationSource(configurationOptions, consulHandler, consulKvEndpoint)); };
public static IWebHostBuilder UseNethium(this IWebHostBuilder builder, Action <NethiumConfig> configureNethiumOption) { var nethiumConfig = new NethiumConfig(); configureNethiumOption(nethiumConfig); nethiumConfig.CancellationToken ??= builder.GetShutdownToken(); var bootstrapConfig = nethiumConfig.BootstrapConfig; var logger = nethiumConfig.LoggerFactory?.CreateLogger <NethiumConfig>(); if (bootstrapConfig != null) { nethiumConfig.Prefix ??= bootstrapConfig["Nethium:Consul:Prefix"] ?? throw new ArgumentNullException("Nethium:Consul:Prefix", "Consul:Prefix not specified in config"); nethiumConfig.ConfigurationPrefix ??= bootstrapConfig["Nethium:Consul:ConfigurationPrefix"] ?? nethiumConfig.Prefix; nethiumConfig.Separator ??= bootstrapConfig["Nethium:Consul:Separator"]; nethiumConfig.Watch ??= bootstrapConfig["Nethium:Consul:Watch"]; } var configurationOptions = new ConfigurationOptions { Prefix = nethiumConfig.Prefix !, ConfigurationPrefix = nethiumConfig.ConfigurationPrefix, Separator = nethiumConfig.Separator !, Watch = nethiumConfig.Watch, AutoReload = nethiumConfig.AutoReload ?? false }; var consulHandler = new ConsulHandler { ClientConfigurationOptions = ClientConfiguration(bootstrapConfig, nethiumConfig), CancellationToken = nethiumConfig.CancellationToken }; var consulBuilder = new ConsulBuilder(consulHandler); var consulClientConfiguration = new ConsulClientConfiguration(); consulHandler.ClientConfigurationOptions.Invoke(consulClientConfiguration); foreach (var pair in bootstrapConfig.AsEnumerable()) { logger?.LogInformation(pair.Key + ": " + pair.Value); } logger?.LogInformation(bootstrapConfig?["Nethium:Consul:Watch"]); logger?.LogInformation($"Using consul at address {consulClientConfiguration.Address} " + $"{(string.IsNullOrEmpty(consulClientConfiguration.Datacenter) ? "" : "datacenter " + consulClientConfiguration.Datacenter)}"); logger?.LogInformation($"Consul config prefix {configurationOptions.Prefix}" + $"{(string.IsNullOrEmpty(configurationOptions.ConfigurationPrefix) ? "" : " (" + configurationOptions.ConfigurationPrefix + ") ")}" + $"{(string.IsNullOrEmpty(configurationOptions.Watch) ? "" : "watching " + configurationOptions.Watch + (configurationOptions.AutoReload ? " auto-reload" : " no auto-reload"))}"); if (nethiumConfig.HostConfiguration) { logger?.LogInformation("Injecting Nethium config provider to host configuration"); var consulKvEndpoint = new ConsulKvEndpoint(consulBuilder, nethiumConfig.LoggerFactory?.CreateLogger <ConsulKvEndpoint>()) { WatchExceptionHandler = WatchExceptionHandler }; var configurationBuilder = new ConfigurationBuilder(); if (bootstrapConfig != null) { configurationBuilder.AddConfiguration(bootstrapConfig); } var configurationRoot = configurationBuilder .AddConsul(configurationOptions, consulHandler, consulKvEndpoint) .Build(); builder .UseConfiguration(configurationRoot); } builder .ConfigureServices(ConfigureServices(nethiumConfig, consulHandler, consulBuilder)) .ConfigureAppConfiguration(ConfigureAppConfiguration(configurationOptions, nethiumConfig, consulHandler, consulBuilder)); return(builder); }