Neste projeto experimental em Domain-Driven-Design com implementação de Aggregates + Event Sourcing + CQRS + Optimistic Concurrency, a técnica de Event Sourcing é usada como ferramenta de auditoria das modificações do conteúdo do Blog. A fonte dos dados são os Domain Events registrados no Kafka e para permitir consultas de alta performance foi criado um banco de dados MongoDB com o 'último estado já processado dos eventos'. Há um microsserviço auxiliar de autenticação. Tudo isso foi implementado em .NET Core/Standard 2.0 compatível com Docker! Divirta-se!
O Domínio
As Aplicações desta Solução
- Producer: Web API que recebe os comandos de edição de conteúdo, produz Eventos de Domínio e publica as mensagens em um tópico no Kafka.
- Consumer: Aplicativo Console que consome as mensagens do Kafka, deserializa em Eventos de Domínio e aplica nas agregações persistindo no MongoDB o novo estado.
- Auth: Web API que gera tokens de autenticação para acesso ao WebAPI.
Por onde começar?
Há duas formas de iniciar a solução.
1. O jeito fácil
Resolver os pré-requisitos, definir o projeto inicial como sendo o docker-compose e então apertar Ctrl+F5 para executar todas as aplicações. Se tudo estiver correto, digite docker ps no seu terminal para verificar em quais portas cada aplicação está executando. Será algo assim:
A partir daí basta acessar:
- Auth em http://localhost:32775/swagger/
- Producer em http://localhost:32776/swagger/
Leia o o jeito não tão fácil para entender como criar um Token no Auth API para consumir os serviços do Producer API via swagger.
2. O jeito não tão fácil
A outra opção é inicializar aplicação por aplicação, seguindo o seguintes passos:
- Execute o projeto Jambo.Auth.WebAPI e chame o método Account/Token com qualquer usuário e senha. Guarde este token.
- Execute o projeto Jambo.Producer.WebAPI e clique no botão Authorization (topo direito da página).
Digite bearer + valor_do_token e clique em fechar. Algo assim:
Chame os métodos para manutenção dos dados do Blog, Posts e Comentários.
- Execute o projeto Jambo.Consumer.Console e garante que ele contínua em execução.
- Visualize suas modificações
Demo
- Auth API: http://jambo.westus.cloudapp.azure.com:7070/swagger/.
- Producer: http://jambo.westus.cloudapp.azure.com:7080/swagger/.
- Consumer: Executa em background neste servidor.
Próximos passos?
- Publicar os containers no Azure.
- Criar um CI/CD para atualizar os containers a cada commit.
- Criar testes de unidade, testes automatizados.
- Consumir serviços externos.
- Implementação alternativa de barramento: Azure Event Hubs
- Implementação alternativa de snapshot: Azure Cosmos DB
- Implementar um HealthCheck
Pré-requisitos
- Visual Studio 2017 + Update 3
- .NET SDK 2.0
- Docker (Opcional)
- Robomongo (Opcional)
Agradecimentos
Obrigado aos amigos que me estimularam a criar este projeto e estão sempre contribuindo e dando feedback.
- Vinicius Baldotto
- André Paulovich
- André Mendes
Obrigado de verdade!
Deixe o seu feedback
Agradeço todo comentário sobre o projeto. Envie suas dúvidas e sugestões no Fórum.
