Skip to content

DDD + Aggregates + Event Sourcing com .NET Core, Kafka e MongoDB (Blog Engine)

License

Notifications You must be signed in to change notification settings

ddd-cqrs-es/jambo

 
 

Repository files navigation

A solution for Blogging based on a Event-Driven architecture with DDD and CQRS. The full solution contains three applications.

  • A Web API which receives Commands to produces Domain Events also receives Queries to return JSON.
  • A Consumer App that reads the Event Stream and do a projection to a MongoDB database.
  • A Web API for authentication and JWT generation.

Requirements

Environment setup

If you already have valid connections strings for Kafka and MongoDB you could skip this topic and go to the Running the applications topic.

  • Run the ./up-kafka-mongodb.sh script to run Kafka and MongoDB as Docker Containers. Please wait until the ~800mb download to be complete.
$ ./up-kafka-mongodb.sh
Pulling mongodb (mongo:latest)...
latest: Pulling from library/mongo
Digest: sha256:2c55bcc870c269771aeade05fc3dd3657800540e0a48755876a1dc70db1e76d9
Status: Downloaded newer image for mongo:latest
Pulling kafka (spotify/kafka:latest)...
latest: Pulling from spotify/kafka
Digest: sha256:cf8f8f760b48a07fb99df24fab8201ec8b647634751e842b67103a25a388981b
Status: Downloaded newer image for spotify/kafka:latest
Creating setup_mongodb_1 ...
Creating setup_kafka_1 ...
Creating setup_mongodb_1
Creating setup_mongodb_1 ... done
  • Check if the data layer is ready with the following commands:
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mongo               latest              d22888af0ce0        17 hours ago        361MB
spotify/kafka       latest              a9e0a5b8b15e        11 months ago       443MB
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                            NAMES
32452776153f        spotify/kafka       "supervisord -n"         2 days ago          Up 2 days           0.0.0.0:2181->2181/tcp, 0.0.0.0:9092->9092/tcp   setup_kafka_1
ba28cf144478        mongo               "docker-entrypoint..."   2 days ago          Up 2 days           0.0.0.0:27017->27017/tcp                         setup_mongodb_1

If Kafka is running good it will be working with the 10.0.75.1:9092 connection string and if MongoDB is running good it will be working at mongodb://10.0.75.1:27017.

The Domain

Domain

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:

Enviando comandos

A partir daí basta acessar:

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:

  1. Execute o projeto Jambo.Auth.WebAPI e chame o método Account/Token com qualquer usuário e senha. Guarde este token.

Auth

Auth com Token

  1. 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: Autorizando Chame os métodos para manutenção dos dados do Blog, Posts e Comentários. Enviando comandos

  1. Execute o projeto Jambo.Consumer.Console e garante que ele contínua em execução.

Comsumer em execução

  1. Visualize suas modificações

Queries

Demo

Próximos passos?

  1. Publicar os containers no Azure.
  2. Criar um CI/CD para atualizar os containers a cada commit.
  3. Criar testes de unidade, testes automatizados.
  4. Consumir serviços externos.
  5. Implementação alternativa de barramento: Azure Event Hubs
  6. Implementação alternativa de snapshot: Azure Cosmos DB
  7. Implementar um HealthCheck

Pré-requisitos

Agradecimentos

Obrigado aos amigos que me estimularam a criar este projeto e estão sempre contribuindo e dando feedback.

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.

Histórico de Versões

  • 10/set/2017: release

About

DDD + Aggregates + Event Sourcing com .NET Core, Kafka e MongoDB (Blog Engine)

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 99.9%
  • Shell 0.1%