Consumindo API usando http
Esse contexto será desenvolvido utilizando um microsserviços chamado “ms-order” e outro chamado “ms-delivery”. O primeiro exporá as API’s e o segundo microsserviços efetuará as requisições via HTTP para obtenção dos detalhes de um pedido no “ms-order”.
Prepare o ambiente inicial com o Docker
Este exemplo utilizará o MongoDB como banco de dados e o RabbitMQ como fila no ambiente local do Docker. Certifique-se de ter o Docker em excursão com os containers do MongoDB e RabbitMQ ativos. Entre no tópico do RabbitMQ para aprender como criar a exchange “Devprime” e as filas orderevents e deliveryevents.
Criando o microsserviços “ms-order”
Nesse microsserviço utilizaremos um exemplo de negócio do marketplace ‘order’. Abaixo execute o Devprime CLI.
dp new ms-order --state mongodb --stream rabbitmq --marketplace order --init
Ao finalizar o primeiro microsserviço estará pronto para produção e com as API’s construidas pelo acelerador do Devprime CLI. Execute o microsserviços “ms-order”
.\run.ps1 ou ./run.sh (Linux, macOS)
Abra o microsserviço “ms-order” navegador na url “https://localhost:5001 ou http://localhost:5000” e efetue um post na API para criar um pedido.
Criando o microsserviços “ms-delivery”
Agora criaremos o ms-delivery e adicinaremos na sequência um aggregate root chamado “Delivery”.
dp new ms-delivery --state mongodb --stream rabbitmq
Entre na pasta ms-delivery e adicione um Aggregate Root
dp add aggregate Delivery
Após executar os comandos abra o arquivo “Delivery.cs” na pasta ms-delivery/src/Core/Domain/Aggregates/Delivery e adicione o código abaixo no aggregate root “Delivery"para complementar a funcionalidade necessária a nossa implementação.
code src/Core/Domain/Aggregates/Delivery/Delivery.cs
|
|
Após adicionar o código execute o acelerador do Devprime CLI para construir as implementações básicas do microsserviço “ms-delivery”
dp init
Ao final você já terá o microsserviço “ms-delivery” pronto para utilizarmos. Para atender o nosso cenário faremos algumas customizações. No primeiro momento é importante lembrar de alterar as portas no Adapter de Web no arquivo de configuração ms-delivery/src/App/appsettings.json para 5002 e 5003 para evitar conflito com o “ms-order” quando em excursão.
code src/App/appsettings.json
|
|
Após alterar pode executar o projeto e confirmar a mudança de portal pelo log do Devprime. É importante reforçar a presença o log automático fornecido pelo adapter de Observability. Finalize o projeto e siga os próximos passos.
Criando um DomainEvent e um DTO
Nós vamos agora criar um evento de dominío ‘DeliveryGetOrder’ e um Handler para implementarmos a chamada de acesso externo utilizando http. O Devprime CLI oferece um acelerador para adicionar eventos de dominíos.
Nós precisaremos de um Data Transfer Object (DTO) para converter o resultado da API “ms-order”. O primeiro passo será criar a pasta src/Core/Application/EventHandlers/Delivery/Model caso não exista e adicionar um novo arquivo “OrderCreated.cs” com o texto abaixo.
Abra o arquivo pelo Visual Studio Code (vscode).
code src/Core/Application/EventHandlers/Delivery/Model/OrderCreated.cs
Adicione o código e salve.
|
|
Agora que você já tem um Data Transfer Object (DTO) nós vamos adicionar um evento de domínio. E para facilitar o processo utilizaremos um acelerador do Devprime CLI.
dp add domainevent DeliveryGetOrder -agg Delivery
Após confirmar abra o arquivo “DeliveryGetOrderEventHandler.cs” na pasta /src/Core/Application/EventHandlers/Delivery e implememte a consulta ao serviço externo utilizando o Adapter Services pelo comando “Dp.Services.HTTP.DpGet”.
Abra o arquivo pelo Visual Studio Code (vscode).
code src/Core/Application/EventHandlers/Delivery/DeliveryGetOrderEventHandler.cs
Altere o código para avaliarmos o retorno “result”. Em caso de sucesso com o código “200” nós retornaremos o valor do pedido.
|
|
Ness exemplo o Adapter de Services acessará uma API baseada no Devprime via HTTP e utilizando o comando “DpGet” especifico para API’s baseadas no Devprime. Ao utilizar o DpGet ele já identifica o resultado e converte no formato “OrderCreated” automatiamente simplificando o processo.
Adicionando um DomainEvent no Aggretate
A última etapa é modificar o método “Add()” presente no Aggretate root “Delivery”. Adicione a implementação para emitir o evento “DeliveryGetOrder()” que será interceptado pelo Handler “DeliveryGetOrderEventHandler” implementado anteriormente.
code src/Core/Domain/Aggregates/Delivery/Delivery.cs
|
|
Se conseguirmos obter o valor do pedido nós vamos atualizar o aggregate e emitir o evento “DeliveryCreated” propagando o fato de negócio. Em caso negativo nós emitiremos um PublicException
que retornará ao chamador dessa API uma informação de falha no processo.
Demonstrando o cenário de Delivery
Para inicia a demonstração do cenário é necessário executar o microsserviços “ms-order” e “ms-delivery” ao mesmo tempo. Como estão em portas diferentes nós conseguiremos demonstrar o cenário com tranquilidade.
microsserviços: Order
- Abra o navegador na API do microsserviços “ms-order” em [http://localhost:5000 ou https://localhost:5001]
- Efetue um post na API ‘/v1/order” colocando preenchendo o customerName e total.
|
|
- Faça um get na API ‘/v1/order’ e localize o código do pedido ‘id’
microsserviços: Delivery
- Abra o navegador na API do microsserviços “ms-order” em [http://localhost:5002 ou https://localhost:5003]
- Efetue um post na API ‘/v1/delivery’ informando o código do pedido em ‘orderID’.
|
|
- O microsserviços “ms-delivery” irá consultar a API order utilizando o Adapter Services e retornar o valor total do pedido. O próximo passo é criar um registro no microsserviço de delivery e emitir um evento no Stream
|
|
Você também consegue acompanhar do lado do microsserviço Order a solicitação ‘GET’
- Nesse novo cenário gere uma GUID com orderID inexistente e efetue um post na API ‘/v1/delivery’.
|
|
- Ao consultar o microsserviço “Order” sobre um pedido inexistente a API de Delivery retorna um erro.
|
|
Última modificação September 2, 2023 (710d0ffd)Parabéns 🚀🚀🚀.