Exemplo n.º 1
0
        private static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureHostConfiguration(configurationBuilder => {
            configurationBuilder.AddCommandLine(args);
        })
        .ConfigureAppConfiguration((ctx, builder) =>
        {
            builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();
        })
        .UseSerilog((ctx, cfg) =>
        {
            var credentials = new NoAuthCredentials(ctx.Configuration.GetConnectionString("loki"));

            cfg.MinimumLevel.Verbose()
            .Enrich.FromLogContext()
            .Enrich.WithProperty("Application", ctx.HostingEnvironment.ApplicationName)
            .Enrich.WithProperty("Environment", ctx.HostingEnvironment.EnvironmentName)
            .WriteTo.Console(new RenderedCompactJsonFormatter())
            .WriteTo.LokiHttp(credentials);
        })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddSingleton <IEventDeserializer>(new JsonEventDeserializer(new[]
            {
                typeof(CustomerCreated).Assembly
            }));

            services.AddHttpClient <ICustomersApiClient, CustomersApiClient>("customersApiClient", (ctx, httpClient) =>
            {
                var config             = ctx.GetRequiredService <IConfiguration>();
                var endpoint           = config["CustomersApi"];
                httpClient.BaseAddress = new System.Uri(endpoint);
            })
            .AddPolicyHandler(HttpClientPolicies.GetRetryPolicy());

            services.AddSingleton <INotificationsFactory, NotificationsFactory>();
            services.AddSingleton <INotificationsService, FakeNotificationsService>();

            services.AddSingleton(ctx =>
            {
                var kafkaConnStr    = hostContext.Configuration.GetConnectionString("kafka");
                var eventsTopicName = hostContext.Configuration["eventsTopicName"];
                var groupName       = hostContext.Configuration["eventsTopicGroupName"];
                return(new EventConsumerConfig(kafkaConnStr, eventsTopicName, groupName));
            });

            services.AddHostedService(ctx =>
            {
                var logger               = ctx.GetRequiredService <ILogger <EventConsumer <Account, Guid> > >();
                var eventsDeserializer   = ctx.GetRequiredService <IEventDeserializer>();
                var consumerConfig       = ctx.GetRequiredService <EventConsumerConfig>();
                var notificationsFactory = ctx.GetRequiredService <INotificationsFactory>();
                var notificationsService = ctx.GetRequiredService <INotificationsService>();
                var consumer             = new EventConsumer <Account, Guid>(eventsDeserializer, consumerConfig, logger);

                return(new AccountEventsWorker(notificationsFactory, notificationsService, consumer, logger));
            });
        });
Exemplo n.º 2
0
 private static void AddConnectorsHttpClients(IServiceCollection services,
                                              Dictionary <string, string> supplierPaths)
 {
     foreach (var(supplierKey, basePath) in supplierPaths)
     {
         services.AddHttpClient(supplierKey, client =>
         {
             client.BaseAddress = client.BaseAddress = new Uri(basePath);
             client.DefaultRequestHeaders.Add("Accept", "application/json");
             client.Timeout = TimeSpan.FromMinutes(10);
         }).SetHandlerLifetime(TimeSpan.FromMinutes(10))
         .AddPolicyHandler(HttpClientPolicies.GetStandardRetryPolicy())
         .AddHttpMessageHandler <ProtectedApiBearerTokenHandler>();
     }
 }
Exemplo n.º 3
0
        public void ConfigureServices(IServiceCollection services)
        {
            var serializationSettings = new JsonSerializerSettings
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver(),
                Formatting       = Formatting.None
            };

            JsonConvert.DefaultSettings = () => serializationSettings;

            using var vaultClient = StartupHelper.CreateVaultClient(Configuration);

            vaultClient.Login(GetFromEnvironment("Vault:Token")).Wait();

            var jobsSettings = vaultClient.Get(Configuration["Identity:JobsOptions"]).Result;
            var clientSecret = jobsSettings[Configuration["Identity:Secret"]];

            var edoSettings  = vaultClient.Get(Configuration["Edo:EdoOptions"]).Result;
            var authorityUrl = edoSettings[Configuration["Identity:Authority"]];
            var edoApiUrl    = edoSettings[Configuration["Edo:Api"]];

            var supplierPaths = vaultClient.Get(Configuration["Suppliers:Paths"]).Result
                                .Where(i => i.Key != "enabledConnectors")
                                .ToDictionary(i => i.Key, j => j.Value);

            IEnumerable <string> enabledSuppliers;
            var supplierSettingsFromEnvironment = Environment.GetEnvironmentVariable("SUPPLIERS");

            if (supplierSettingsFromEnvironment != null)
            {
                enabledSuppliers = supplierSettingsFromEnvironment.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
            }
            else
            {
                var updaterOptions = vaultClient.Get(Configuration["Suppliers:Options"]).Result;
                enabledSuppliers = updaterOptions["enabled"].Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
            }


            var connectionString = StartupHelper.GetDbConnectionString(vaultClient, Configuration);

            services.AddDbContext <LocationUpdaterContext>(options =>
            {
                options.UseNpgsql(
                    connectionString,
                    b => b.UseNetTopologySuite());
                options.EnableSensitiveDataLogging(false);
                options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
            });

            services.AddTransient <ProtectedApiBearerTokenHandler>();
            services.AddSingleton <TokenProvider>();
            services.AddTransient <JsonSerializer>();

            services.Configure <TokenRequestSettings>(options =>
            {
                var uri = new Uri(new Uri(authorityUrl), "/connect/token");
                options.TokenRequestUrl = uri.ToString();
                options.ClientId        = Configuration["Identity:ClientId"];
                options.ClientSecret    = clientSecret;
                options.Scopes          = new[] { "edo", "connectors" };

                var disableCachingSetting = Environment.GetEnvironmentVariable("DISABLE_TOKEN_CACHE");

                options.IsCachingDisabled = bool.TryParse(disableCachingSetting, out var disableCache) && disableCache;
            });

            services.AddHttpClient(HttpClientNames.Identity, client =>
            {
                client.BaseAddress = new Uri(authorityUrl);
                client.DefaultRequestHeaders.Add("Accept", "application/json");
            }).AddPolicyHandler(HttpClientPolicies.GetStandardRetryPolicy());

            services.AddHttpClient(HttpClientNames.EdoApi, client =>
            {
                client.BaseAddress = new Uri(edoApiUrl);
                client.Timeout     = TimeSpan.FromMinutes(5);
            })
            .SetHandlerLifetime(TimeSpan.FromMinutes(5))
            .AddPolicyHandler(HttpClientPolicies.GetStandardRetryPolicy())
            .AddHttpMessageHandler <ProtectedApiBearerTokenHandler>();

            AddConnectorsHttpClients(services, supplierPaths);

            services.Configure <UpdaterOptions>(o =>
            {
                var batchSizeSetting = Environment.GetEnvironmentVariable("BATCH_SIZE");

                o.BatchSize = int.TryParse(batchSizeSetting, out var batchSize)
                    ? batchSize
                    : 2000;

                var requestDelaySetting = Environment.GetEnvironmentVariable("REQUEST_DELAY");
                o.UploadRequestDelay    = int.TryParse(requestDelaySetting, out var requestDelayMilliseconds)
                    ? TimeSpan.FromMilliseconds(requestDelayMilliseconds)
                    : TimeSpan.FromMilliseconds(150);

                o.Suppliers  = enabledSuppliers;
                o.UpdateMode = Enum.TryParse <UpdateMode>(Environment.GetEnvironmentVariable("UPDATE_MODE"), out var updateMode)
                    ? updateMode
                    : UpdateMode.Differential;
            });

            services.AddHostedService <LocationUpdaterHostedService>();
            services.AddNameNormalizationServices();
            services.AddHttpClient();
            services.AddHealthChecks();
        }