Pra este desafio, precisaremos criar a listagem das orders.
Esta listagem precisa ser feita com:
- Endpoint REST (GET /order)
- Service ListOrders com GRPC
- Query ListOrders GraphQL
- - Configurar Rabbitmq através de variáveis de ambiente;
- - Criar arquivo para subir infra através do podman;
- - Configurar Database migration;
- - Configurar rotas de acordo com o método http;
- - Criar query para buscar as orders;
- - Criar teste unitário para a busca de orders;
- - Criar usecase para listar as orders;
- - Criar endpoint http para listar orders;
- - Criar Service GRPC para listar orders;
- - Criar Query GraphQL para listar orders;
- - Criar Containerfile para rodar a aplicação;
- - Configurar arquivos a serem ignorados pelo container;
- - Documentar processo de build da aplicação;
- - Documentar processo para rodar a aplicação;
A aplicação pode ser construída de 2 formas:
- Binário Golang
- Imagem de Container
Para construir a aplicação para rodar como um binário, basta executar o comando:
go build -o desafio-clean-architecture github.com/rodrigoafernandes/desafio-clean-architecture/cmd/ordersystem
Um binário com o nome "desafio-clean-architecture" será gerado no diretório atual
Para construir uma Imagem de Container, desenvolvi um "Containerfile" para facilitar a criação. Existem diversas ferramentas para facilitar a criação da imagem, listarei abaixo tres opções: Buildah, Podman e Docker
Para construir a imagem do container com a ferramenta Buildah, utilize o seguinte comando:
buildah bud -f Containerfile -t rodrigoafernandes/golang-expert/desafio-clean-architecture:1.0.0 .
Para construir a imagem do container com a ferramenta Podman, utilize o seguinte comando:
podman build -f Containerfile -t rodrigoafernandes/golang-expert/desafio-clean-architecture:1.0.0 .
Para construir a imagem do container com a ferramenta Docker, utilize o seguinte comando:
docker build -f Containerfile -t rodrigoafernandes/golang-expert/desafio-clean-architecture:1.0.0 .
Assim como para construir, rodar a aplicação pode ser feito de duas formas: executar o binário ou executar a imagem do container construída.
Caso os componentes de infraestrutura não rodem na mesma rede(localhost), é necessário configura-los através de variáveis de ambiente. As variáveis que a aplicação espera receber para configurar são:
Nome | Finalidade |
---|---|
DB_DRIVER | Nome do driver do Database |
DB_HOST | Host do Database |
DB_PORT | Porta do Database |
DB_USER | Usuário do Database |
DB_PASSWORD | Senha do Usuário do Database |
DB_NAME | Nome do Schema no Database |
WEB_SERVER_PORT | Porta para rodar o WebServer |
GRPC_SERVER_PORT | Porta para rodar o gRPC Server |
GRAPHQL_SERVER_PORT | Porta para rodar o GraphQL Server |
RABBITMQ_USER | Usuário do Rabbimq |
RABBITMQ_PWD | Senha do Usuário do RabbiMQ |
RABBITMQ_HOST | Host do Rabbitmq |
RABBITMQ_PORT | Porta do Rabbitmq |
./desafio-clean-architecture
Para rodar a imagem do container com a ferramenta Podman, utilize o seguinte comando:
podman container run -d --rm --name desafio-clean-architecture -p 8000:8000 -p 8080:8080 -p 50051:50051 -e DB_DRIVER=mysql -e DB_HOST=172.16.10.1 -e DB_PORT=3306 -e DB_PASSWORD=root -e DB_USER=root -e DB_NAME=orders -e WEB_SERVER_PORT=":8000" -e GRPC_SERVER_PORT=50051 -e GRAPHQL_SERVER_PORT=8080 -e RABBITMQ_USER=guest -e RABBITMQ_PWD=guest -e RABBITMQ_HOST=172.16.10.2 -e RABBITMQ_PORT=5672 rodrigoafernandes/golang-expert/desafio-clean-architecture:1.0.0
Caso queira rodar toda a infraestrutura(mysql e rabbitmq) junto com a imagem da aplicação, existem dois arquivos que facilitam a execução dos containers:
- clean-arch-infra.yaml
- clean-arch-infra-with-mysql-volume.yaml O primeiro arquivo, cria a infraestrutura de forma efêmera, ou seja, quando finalizar os containers os dados serão perdidos. Para rodar desta forma, utilize o seguinte comando:
podman play kube clean-arch-infra.yaml
O segundo arquivo, utiliza um volume para armazenar os dados do Mysql, podendo parar os containers e rodar novamente, mantendo os registros criados.
Altere no arquivo "clean-arch-infra-with-mysql-volume.yaml" o valor "" para um diretório que deseja armazenar os dados do container Mysql.
Para rodar utilizando esta forma, utilize o comando:
podman play kube clean-arch-infra-with-mysql-volume.yaml
Para rodar a imagem do container com a ferramenta Docker, utilize o seguinte comando:
docker container run -d --rm --name desafio-clean-architecture -p 8000:8000 -p 8080:8080 -p 50051:50051 -e DB_DRIVER=mysql -e DB_HOST=172.16.10.1 -e DB_PORT=3306 -e DB_PASSWORD=root -e DB_USER=root -e DB_NAME=orders -e WEB_SERVER_PORT=":8000" -e GRPC_SERVER_PORT=50051 -e GRAPHQL_SERVER_PORT=8080 -e RABBITMQ_USER=guest -e RABBITMQ_PWD=guest -e RABBITMQ_HOST=172.16.10.2 -e RABBITMQ_PORT=5672 rodrigoafernandes/golang-expert/desafio-clean-architecture:1.0.0
Após subir os componentes de infraestrutura(MySql e RabbitMQ), é necessário rodar os seguintes comandos:
migrate create -ext=sql -dir=sql/migrations -seq init
migrate -path=sql/migrations -database "mysql://root:root@tcp(localhost:3306)/orders" -verbose up
- Install Golang
- Install GVM(Golang Version Manager)
- Install Golang Migrate DB Tool
- Install GRPC Tools
- Install Evans(gRPC command line cli tool)
- Install Buildah
- Install Podman
- Install Docker
- Build Golang Binary
- Build Container Image With Buildah
- Build Container Image With Podman
- Build Container Image With Docker