Skip to content

Latest commit

 

History

History
351 lines (261 loc) · 13.1 KB

README.md

File metadata and controls

351 lines (261 loc) · 13.1 KB

Order Service license

Este projeto é um exemplo de uma solução de "e-commerce" usando padrões de arquitetura, com 2 principais, que são: SAGA with Choreography e Event Sourcing.

Ele foi criado visando 4 pilares.

  • Resiliência
    Neste projeto foram usados alguns artifícios para manter a resiliência dos serviços, como:

  • Mensageria
    Com o objetivo de manter a máxima resiliência da solução e o mais alto nível possível de disponibilidade foi usado Kafka como um message broker o que permite a comunicação entre os serviços de maneira assíncrona.

  • Gerenciamento de Configuração
    No nosso cenário não foi possível uma implementação aprofundada por uma limitação na linguagem usada no serviço. De todo modo, foi implementado um exemplo de solução usando ETCD como serviço que responde chave/valor e o serviço de produtos capturando dados de comunicação com o Kafka através de uma chamada ao etcd.

  • Service Discovery
    No nosso cenário não foi identificado uma necessidade latente de possuirmos uma implementação deste pilar, pois nenhum serviço conversa com outro diretamente. Ou seja, como a comunicação entre os serviços é assíncrona, vimos que este pilar foi "atendido" quando ativamos o Kafka.

    Entretando, uma maneira de atender a este pilar de maneira elegante seria migrar nosso projeto hoje em docker-compose para kubernetes que nos entregaria soluções de service disovery muito eficiente e de fácil configuração.



Motivadores



Arquitetura do projeto

Arquitetura do projeto



Vídeo do projeto

Vídeo completo



Link dos serviços



Passos para execução do projeto

Subir o projeto

chmod +x start.sh
sh start.sh

Criar categoria

curl -X POST "http://localhost:1001/categories" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"category\":{\"name\":\"Masculino Adulto\"}}"

Criar 2 produtos

curl -X POST "http://localhost:1001/products" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"product\":{\"name\":\"Camisa Azul\",\"value\":16.097,\"category_id\":1}}"
curl -X POST "http://localhost:1001/products" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"product\":{\"name\":\"Camisa Vermelha\",\"value\":11.30,\"category_id\":1}}"

Conferir produto postado no tópico do Kafka para montar um cache de itens no wishlist_service e cart_service


PRODUCTS_CHANNEL


Visualizar os produtos de um determinado gênero

curl -X GET "http://localhost:1001/categories/1/products?popular=false" -H  "accept: application/json"

Visualizar os detalhes de cada produto

curl -X GET "http://localhost:1001/products/1" -H  "accept: application/json"
curl -X GET "http://localhost:1001/products/2" -H  "accept: application/json"

Buscar um produto por palavra-chave

curl -X GET "http://localhost:1001/products?popular=false&q%5Bname_cont%5D=azul" -H  "accept: application/json"

Marcar um item como mais visto

curl -X GET "http://localhost:1001/products/1" -H  "accept: application/json"

Exibir os produtos mais vistos por categorias

curl -X GET "http://localhost:1001/categories/1/products?popular=true" -H  "accept: application/json"

Conferir chaves criadas no Configuration Manager ETCD

docker-compose -f docker-compose-etcd.yml exec etcd /bin/sh -c "etcdctl --endpoints http://etcd:2379 get development/product_service --prefix"

Criar uma lista de desejo vazia

curl -X POST "http://localhost:1002/wishlists" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"wishlist\":{\"client_id\":100}}"

Adicionar itens na sua lista de desejo

curl -X POST "http://localhost:1002/wishlists/1/items" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"item\":{\"product_id\":1}}"

Tentar adicionar um item na lista de desejo com produto inválido

curl -X POST "http://localhost:1002/wishlists/1/items" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"item\":{\"product_id\":999}}"

Conferir item da lista de desejo postado no tópico do Kafka para montar um cache de itens no cart_service


WISHLIST_ITEMS_CHANNEL


Adicionar um item no carrinho

curl -X POST "http://localhost:1006/carts/100/items" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"item\":{\"product_id\":2,\"amount\":3}}"

Tentar adicionar um item no carrinho com produto inválido

curl -X POST "http://localhost:1006/carts/100/items" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"item\":{\"product_id\":99,\"amount\":3}}"

Mover um item da lista de desejo para o carrinho

curl -X POST "http://localhost:1006/carts/100/items" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"item\":{\"wishlist_item_id\":1,\"amount\":5}}"

Conferir item da lista de desejo postado no tópico do Kafka para ser removido da lista de desejo correspondente


DELETE_WISHLIST_ITEM_CHANNEL


Conferir que o item foi removido da lista de desejo

curl -X GET "http://localhost:1002/wishlists/1/items" -H  "accept: application/json"

Conferir que o item foi marcado para ser removido na fila do kafka que mantem o cache de itens


WISHLIST_ITEMS_CHANNEL


Abrir um pedido

curl -X POST "http://localhost:1004/orders/open" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"order\":{\"cart_client_id\":100}}"

Tentatar criar um pedido com um carrinho/cliente inválido

curl -X POST "http://localhost:1004/orders/open" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"order\":{\"cart_client_id\":225}}"

Conferir pedido postado no tópico do Kafka para montar um cache de pedidos no support_service


ORDERS_CHANNEL


Conferir que o pedido ao ser criado solicita o total de itens no carrinho para o serviço cart_service


TOTAL_ITEMS_CHANNEL


Conferir a resposta do total de itens no carrinho feito pelo serviço cart_service para o serviço order_service


TOTAL_ITEMS_REPLY_CHANNEL


Verificar o valor total e a quantidade total de itens no pedido, que são calculados com base no que há no carrinho

curl -X GET "http://localhost:1004/orders/1" -H  "accept: application/json"

Calcular o frete de uma compra com um CEP válido

curl -X POST "http://localhost:1004/orders/1/freight" -H  "accept: */*" -H  "Content-Type: application/json" -d "{\"freight\":{\"zip_code\":\"02512000\"}}"

Tentar calcular o frete de uma compra com um CEP inválido

curl -X POST "http://localhost:1004/orders/1/freight" -H  "accept: */*" -H  "Content-Type: application/json" -d "{\"freight\":{\"zip_code\":\"02599999\"}}"

Conferir o pedido cálculo de frete postado no tópico do Kafka para o serviço freight_service


CALCULATE_FREIGHT_CHANNEL


Conferir o retorno do serviço freight_service postado no tópico referente ao pedido de cálculo de frete que será consumido pelo serviço order_service


CALCULATE_FREIGHT_REPLY_CHANNEL


Acompanhar os dados do seu pedido, com todos os valores calculados

curl -X GET "http://localhost:1004/orders/1" -H  "accept: application/json"

Abrir um chamado técnico de algum problema que está acontecendo

curl -X POST "http://localhost:1003/tickets/open" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"ticket\":{\"description\":\"Problema X Y Z\",\"client_id\":100,\"order_id\":1}}"

Encerrar um chamado técnico

curl -X POST "http://localhost:1003/tickets/closed" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"ticket\":{\"id\":1}}"

Encerrar um pedido

curl -X POST "http://localhost:1004/orders/closed" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"order\":{\"id\":1}}"

Conferir carrinho postado no tópico do Kafka para que seus itens sejam removidos em cart_service


CART_ITEMS_REMOVE_CHANNEL


Conferir carrinho vazio

curl -X GET "http://localhost:1006/carts/100/items" -H  "accept: application/json"

Derrubar o projeto

chmod +x stop.sh
sh stop.sh


Links Úteis

Para futuro