Exemplo n.º 1
0
        private static IHost BuildHost()
        {
            return(new HostBuilder()
                   .ConfigureServices((hostContext, services) =>
            {
                var retryPolicy = Policy.Handle <Exception>().WaitAndRetry(new[]
                {
                    TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100),
                    TimeSpan.FromMilliseconds(150)
                });

                var circuitBreakerPolicy =
                    Policy.Handle <Exception>().CircuitBreaker(1, TimeSpan.FromMilliseconds(500));

                var retryPolicyAsync = Policy.Handle <Exception>().WaitAndRetryAsync(new[]
                {
                    TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100),
                    TimeSpan.FromMilliseconds(150)
                });

                var circuitBreakerPolicyAsync = Policy.Handle <Exception>()
                                                .CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(500));

                var policyRegistry = new PolicyRegistry()
                {
                    { CommandProcessor.RETRYPOLICY, retryPolicy },
                    { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy },
                    { CommandProcessor.RETRYPOLICYASYNC, retryPolicyAsync },
                    { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicyAsync }
                };

                var producer = new KafkaMessageProducerFactory(
                    new KafkaMessagingGatewayConfiguration()
                {
                    Name = "paramore.brighter.greetingsender",
                    BootStrapServers = new[] { "localhost:9092" }
                },
                    new KafkaPublication()
                {
                    Topic = new RoutingKey("greeting.event"),
                    MessageSendMaxRetries = 3,
                    MessageTimeoutMs = 1000,
                    MaxInFlightRequestsPerConnection = 1
                })
                               .Create();

                services.AddSingleton <IAmAMessageProducer>(producer);

                services.AddBrighter(options =>
                {
                    options.PolicyRegistry = policyRegistry;
                    options.BrighterMessaging = new BrighterMessaging(new InMemoryOutbox(), producer);
                }).MapperRegistryFromAssemblies(typeof(GreetingEvent).Assembly);

                services.AddHostedService <TimedMessageGenerator>();
            })
                   .UseSerilog()
                   .UseConsoleLifetime()
                   .Build());
        }
Exemplo n.º 2
0
        /// <summary>
        /// This method gets called by the runtime. Use this method to add services to the container.
        /// </summary>
        /// <param name="services"></param>
        public void ConfigureServices(IServiceCollection services)
        {
            var retryPolicy               = Policy.Handle <Exception>().WaitAndRetry(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) });
            var circuitBreakerPolicy      = Policy.Handle <Exception>().CircuitBreaker(1, TimeSpan.FromMilliseconds(500));
            var retryPolicyAsync          = Policy.Handle <Exception>().WaitAndRetryAsync(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) });
            var circuitBreakerPolicyAsync = Policy.Handle <Exception>().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(500));
            var policyRegistry            = new PolicyRegistry()
            {
                { CommandProcessor.RETRYPOLICY, retryPolicy },
                { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy },
                { CommandProcessor.RETRYPOLICYASYNC, retryPolicyAsync },
                { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicyAsync },
                { Catalog.DynamoDbAccess, retryPolicyAsync }
            };

            var gatewayConnection = new KafkaMessagingGatewayConfiguration
            {
                Name             = "paramore.brighter.accounttransfer",
                BootStrapServers = new[] { "localhost:9092" }
            };
            var producer = new KafkaMessageProducerFactory(gatewayConnection).Create();

            services.AddBrighter(options =>
            {
                options.PolicyRegistry           = policyRegistry;
                options.BrighterMessaging        = new BrighterMessaging(new InMemoryOutbox(), producer);
                options.CommandProcessorLifetime = ServiceLifetime.Scoped;
            })
            .AsyncHandlersFromAssemblies(typeof(AddNewAccountHandlerAsync).Assembly)
            .MapperRegistryFromAssemblies(typeof(AccountEvent).Assembly);

            services.AddDarker(options => options.HandlerLifetime = ServiceLifetime.Scoped)
            .AddHandlersFromAssemblies(typeof(GetAccountByIdHandlerAsync).Assembly);

            services.AddOpenApiDocument(config =>
            {
                config.PostProcess = document =>
                {
                    document.Info.Version        = "v1";
                    document.Info.Title          = "Booking API";
                    document.Info.Description    = "book rooms in our hotel";
                    document.Info.TermsOfService = "None";
                    document.Info.Contact        = new NSwag.OpenApiContact
                    {
                        Name  = "Ian Cooper",
                        Email = string.Empty,
                        Url   = "https://twitter.com/icooper"
                    };
                };
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddDbContext <AccountContext>(options =>
                                                   options.UseMySql(Configuration["Database:Accounts"]));
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            var kafkaMessagingGatewayConfiguration
                = new KafkaMessagingGatewayConfiguration()
                {
                Name             = "paramore.brighter.greetingsender",
                BootStrapServers = new[] { "localhost:9092" }
                };

            for (var i = 0; i < args.Length; i += 2)
            {
                var key = args[i];
                var val = default(string);
                if (i + 1 < args.Length)
                {
                    val = args[i + 1];
                }

                switch (key)
                {
                case "--bootstrap-server":
                    kafkaMessagingGatewayConfiguration.BootStrapServers = new[] { val };
                    break;

                default:
                    break;
                }
            }

            var container             = new TinyIoCContainer();
            var messageMapperFactory  = new TinyIoCMessageMapperFactory(container);
            var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory)
            {
                { typeof(GreetingEvent), typeof(GreetingEventMessageMapper) }
            };

            var messageStore = new InMemoryMessageStore();
            var producer     = new KafkaMessageProducerFactory(kafkaMessagingGatewayConfiguration)
                               .Create();

            var builder = CommandProcessorBuilder.With()
                          .Handlers(new HandlerConfiguration())
                          .DefaultPolicy()
                          .TaskQueues(new MessagingConfiguration(messageStore, producer, messageMapperRegistry))
                          .RequestContextFactory(new InMemoryRequestContextFactory());

            var commandProcessor = builder.Build();

            commandProcessor.Post(new GreetingEvent("Wayne"));
        }
Exemplo n.º 4
0
        static void Main(string[] args)
        {
            var kafkaMessagingGatewayConfiguration = new KafkaMessagingGatewayConfiguration()
            {
                Name             = "paramore.brighter.greetingsender",
                BootStrapServers = new[] { "localhost:9092" }
            };

            for (var i = 0; i < args.Length; i += 2)
            {
                var key = args[i];
                var val = default(string);
                if (i + 1 < args.Length)
                {
                    val = args[i + 1];
                }

                switch (key)
                {
                case "--bootstrap-server":
                    kafkaMessagingGatewayConfiguration.BootStrapServers = new[] { val };
                    break;

                default:
                    break;
                }
            }


            var serviceCollection = new ServiceCollection();

            var producer = new KafkaMessageProducerFactory(kafkaMessagingGatewayConfiguration).Create();

            serviceCollection.AddBrighter(options =>
            {
                var outBox = new InMemoryOutbox();
                options.BrighterMessaging = new BrighterMessaging(outBox, outBox, producer, null);
            }).AutoFromAssemblies();

            var serviceProvider = serviceCollection.BuildServiceProvider();

            var commandProcessor = serviceProvider.GetService <IAmACommandProcessor>();

            commandProcessor.Post(new GreetingEvent("Wayne"));
        }
Exemplo n.º 5
0
        private static IHost BuildHost()
        {
            return(new HostBuilder()
                   .ConfigureLogging(loggingBuilder => loggingBuilder.AddConsole())
                   .ConfigureHostConfiguration((configurationBuilder) =>
            {
                configurationBuilder.SetBasePath(Directory.GetCurrentDirectory());
                configurationBuilder.AddEnvironmentVariables(prefix: "ASP_");
            })
                   .ConfigureServices((hostContext, services) =>
            {
                var gatewayConnection = new KafkaMessagingGatewayConfiguration
                {
                    Name = "paramore.brighter.accounttransfer",
                    BootStrapServers = new[] { "localhost:9092" }
                };

                var retryPolicy = Policy.Handle <Exception>().WaitAndRetry(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) });
                var circuitBreakerPolicy = Policy.Handle <Exception>().CircuitBreaker(1, TimeSpan.FromMilliseconds(500));
                var retryPolicyAsync = Policy.Handle <Exception>().WaitAndRetryAsync(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) });
                var circuitBreakerPolicyAsync = Policy.Handle <Exception>().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(500));
                var policyRegistry = new PolicyRegistry()
                {
                    { CommandProcessor.RETRYPOLICY, retryPolicy },
                    { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy },
                    { CommandProcessor.RETRYPOLICYASYNC, retryPolicyAsync },
                    { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicyAsync }
                };

                services.AddSingleton <IReadOnlyPolicyRegistry <string> >(policyRegistry);
                var producer = new KafkaMessageProducerFactory(gatewayConnection).Create();
                services
                .AddBrighter(options =>
                {
                    options.PolicyRegistry = policyRegistry;
                    options.BrighterMessaging = new BrighterMessaging(new InMemoryOutbox(), producer);
                })
                .MapperRegistryFromAssemblies(typeof(AccountEventMessageMapper).Assembly);

                var useLocalAwsServices = hostContext.Configuration.GetValue <bool>("AWS:UseLocalServices");

                if (useLocalAwsServices)
                {
                    services.AddSingleton <IAmazonDynamoDB>(sp => CreateClient(hostContext.Configuration));
                    services.AddSingleton <IAmazonDynamoDBStreams>(sp => CreateStreamClient(hostContext.Configuration));
                }
                else
                {
                    services.AddAWSService <IAmazonDynamoDB>();
                    services.AddAWSService <IAmazonDynamoDBStreams>();
                }

                var translatorRegistry = new RecordTranslatorRegistry(new TranslatorFactory());
                translatorRegistry.Add(typeof(AccountEvent), typeof(AccountFromRecordTranslator));

                services.AddSingleton <RecordTranslatorRegistry>(translatorRegistry);
                services.AddSingleton <IRecordProcessor <StreamRecord>, DynamoDbRecordProcessor>();
                services.AddSingleton <IStreamReader, DynamoStreamReader>();
                services.AddHostedService <Pump>();
            })
                   .UseSerilog()
                   .UseConsoleLifetime()
                   .Build());
        }