Hernani Almeida
Posted on March 12, 2024
Ferramentas necessárias:
- Java
- Docker
- IDE de sua preferencia
- Configuração do ambiente conforme a parte 2 do artigo
Vamos criar três aplicações com os nomes de Adress-Service(Java), UserRegistration e Validated-Document-Service(Kotlin) no spring starter com as seguintes dependências necessárias
Essas apis receberam o payload via tópico kafka conforme listener do kafka configurado nelas e integrarão com outro service nosso construído em Nodejs/Graph que nos retornara os dados que precisamos, a AdressService ira buscar e adicionar o endereço do usuário no payload enquanto que a Validated-Document-Service ira validar se o documento do usuário não esta guardado dentro de uma lista de documentos bloqueados.
Feito isso a mensagem e enviada para o topico a api User-Registration que com o payload com os dados completo do usuário armazeno-os no banco de dados postgres.
Abaixo deixarei o link para acessar o código das aplicações no github.
API Saga Pattern - AdressService(Java)
API Saga Pattern - ValidatedService(Kotlin)
API Saga Pattern - UserRegistration(Kotlin)
Essas apis integrarão com outra api nossa construído em Nodejs/Graphql que nos fornecerão os dados de endereço do usuário e a lista de documentos bloqueados.
API Saga Pattern - DataService(Nodejs/Graphql)
Podemos testar agora a saga para cadastrar um usuário e validar o comportamento dos microservices se integrando entre si através da orientação a eventos.
Acesse nossa primeira api atraves do swagger por este link.
No endpoint /user vamos fazer a requisição inicial passando nome, cpf valido e o cep do usuario.
Logs do fluxo da nossa saga na api orquestradora
Vamos pegar o transactionId no payload de retorno da requisição que fizemos acima e consultar via endpoint /user/event
Isso nos retornara todo o processo que aconteceu na nossa transação com sucesso.
{
"id": "65efb539e7a8223c9344944f",
"userId": "65efb538e7a8223c9344944e",
"transactionId": "1710208312995_b931560b-58d2-4d8a-8351-3abdcf2e7268",
"payload": {
"id": "65efb538e7a8223c9344944e",
"transactionId": "1710208312995_b931560b-58d2-4d8a-8351-3abdcf2e7268",
"name": "Teste",
"document": "91549825020",
"cep": "18608-456",
"createdAt": "2024-03-12T01:51:52.996"
},
"source": "ORCHESTRATOR",
"status": "SUCCESS",
"eventHistory": [
{
"source": "ORCHESTRATOR",
"status": "SUCCESS",
"message": "Saga started!",
"createdAt": "2024-03-11T22:51:53.032"
},
{
"source": "ADRESS_VALIDATION_SERVICE",
"status": "SUCCESS",
"message": "adress was validated successfully! {}",
"createdAt": "2024-03-11T22:51:53.188"
},
{
"source": "VALIDATED_SERVICE",
"status": "SUCCESS",
"message": "Document was validated successfully! {}",
"createdAt": "2024-03-11T22:51:53.287"
},
{
"source": "REGISTRATION_SERVICE",
"status": "SUCCESS",
"message": "user persisted with successfully! {}",
"createdAt": "2024-03-11T22:51:54.476"
},
{
"source": "ORCHESTRATOR",
"status": "SUCCESS",
"message": "Saga finished successfully!",
"createdAt": "2024-03-11T22:51:54.741"
}
],
"createdAt": "2024-03-12T01:51:54.999"
}
Vamos repetir esse processo porem passando um cpf que contem na lista de documentos bloqueados
Veja pelos logs da nossa api orquestradora que ocorreu um erro na api de validated-document e que a partir dai foi enviada, via kafka, uma mensagem de rollback para api validated-service e adress-service para que ambas apaguem o que já haviam feito nessa transação
Vamos pegar o transactionId no payload de retorno da requisição que fizemos acima e consultar via endpoint /user/event o retorno dessa saga.
{
"id": "65efb708e7a8223c93449451",
"userId": "65efb708e7a8223c93449450",
"transactionId": "1710208776483_c53613c4-4779-4402-9702-77f9e376c2a5",
"payload": {
"id": "65efb708e7a8223c93449450",
"transactionId": "1710208776483_c53613c4-4779-4402-9702-77f9e376c2a5",
"name": "Teste",
"document": "86060970044",
"cep": "18608-490",
"createdAt": "2024-03-12T01:59:36.483"
},
"source": "ORCHESTRATOR",
"status": "FAIL",
"eventHistory": [
{
"source": "ORCHESTRATOR",
"status": "SUCCESS",
"message": "Saga started!",
"createdAt": "2024-03-11T22:59:36.507"
},
{
"source": "ADRESS_VALIDATION_SERVICE",
"status": "SUCCESS",
"message": "adress was validated successfully! {}",
"createdAt": "2024-03-11T22:59:36.579"
},
{
"source": "VALIDATED_SERVICE",
"status": "ROLLBACK_PENDING",
"message": "Fail to validate adress: Document {} has some pendency in our base",
"createdAt": "2024-03-11T22:59:36.635"
},
{
"source": "VALIDATED_SERVICE",
"status": "FAIL",
"message": "Rollback executed on validated-document validation!",
"createdAt": "2024-03-11T22:59:36.733"
},
{
"source": "ADRESS_VALIDATION_SERVICE",
"status": "FAIL",
"message": "Rollback executed on adress validation!",
"createdAt": "2024-03-11T22:59:36.876"
},
{
"source": "ORCHESTRATOR",
"status": "FAIL",
"message": "Saga finished with errors!",
"createdAt": "2024-03-11T22:59:36.933"
}
],
"createdAt": "2024-03-12T01:59:36.955"
}
Vlw pessoal por visualizarem mais esse artigo e deixo aqui minhas redes sociais para quem quiser me adicionar e trocar uma ideia sobre desenvolvimento de softwares para aprendermos juntos.
Posted on March 12, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.