LOGISTICA1
O projeto logistica consiste em uma simples API de controle de entregas.
Um ou mais clientes podem solicitar quantas entregas desejarem e mencionar para qual destinatário será
realizado a entrega.
Para cada entrega é cobrada uma taxa de serviço.
A entrega possui possui 3 status, sendo: PENDENTE, FINALIZADA e CANCELADA.
PENDENTE: Quando um novo pedido de entrega é solicitado.
FINALIZADA: Quando a entrega chega com sucesso ao seu destinatário.
CANCELADA: Quando solicitado o cancelamento.
Obsevação: Somente entregas PENDENTES podem ser FINALIZADAS ou CANCELADAS.
Sempre que uma entrega sofrer uma mudança é registrado uma nova ocorrência, exemplo:
Tabela Ocorrência
id | entrega_id | descricao | data_registro |
---|---|---|---|
1 | 11 | Entrega Registrada | 2023-02-10 00:01:12 |
2 | 11 | Entrega a caminho do destinatário | 2023-02-10 00:32:35 |
3 | 11 | Tentativa de entrega não sucedida. | 2023-02-10 00:37:36 |
4 | 11 | Entrega realizada com sucesso! | 2023-02-10 00:56:53 |
6 | 3 | Entrega cancelada. | 2023-02-10 13:21:42 |
- Java 17
- Spring Boot 2.7.7
- MySQL 8.0.31
- Docker 4.15.0
- Kubernetes 1.25.2
A aplicação cria automáticamente as tabelas no banco de dados quando são executadas pela primeira vez.
A aplicação se comunica com o banco de dados algalog.
Caso queira alterar o nome do banco de dados, altere o arquivo application.properties do projeto.
Utilizando o docker compose, o banco de dados também é criado automaticamente.
A forma mais simples de executar o projeto é através do gerenciador de dependências Maven.
Instalando o Maven (Caso não tenha instalado na máquina)
- Pré-requisito JDK 1.7 ou superior, de preferência a mesma versão projeto.
- Necessário configurar a variável de ambiente JAVA_HOME, no computador.
- Faça o download do maven (https://maven.apache.org/download.cgi), existem vários formatos, mas eu sugiro o -bin.zip (apache-maven-3.9.0-bin.zip), por ser o mais comum.
- Ao final do download do arquivo, descompacte em um pasta de sua preferência (Importante: Essa será a pasta que o maven será instalado).
- Configurando as variáveis de ambiente:
Para o maven funcionar basta adicionar a pasta bin do maven na variável de ambiente PATH. - Para testar e verificar se ocorreu tudo ok com a instalação do maven, digite no cmd o comando mvn
Aparecendo algo como a mensagem abaixo é porque está tudo ok para utiliza-lo.
C:\WINDOWS\system32>mvn
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.143 s
[INFO] Finished at: 2023-02-20T10:42:26-03:00
[INFO] ------------------------------------------------------------------------
-
Faça o download do projeto para sua máquina.
-
Descompacte o arquivo ZIP localmente
Warning Necessário alterar o datasource dentro do arquivo application.properties do projeto.
spring.datasource.url=jdbc:mysql://localhost:3306/algalog
spring.datasource.username= SEU_USER_NAME
spring.datasource.password= SUA_SENHA
-
Acesse a pasta descompactada pelo prompt de comando. Abra o prompt de comando e acesse a pasta descompactada até a pasta logistica-api.
Exemplo: cd logistica-main\backend\logistica-api -
Baixando as dependências do projeto
Execute o comando mvn clean install para baixar as dependências do projeto através do maven.
Você também pode utilizar o mvnw que vem no arquivo ZIP do mesmo jeito mvn clean install. -
Execute aplicação
Execute o comando mvn spring-boot:run para executar a sua aplicação.
Você também pode utilizar o mvnw que vem no arquivo ZIP do mesmo jeito mvnw spring-boot:run.
A mensagem que aparece no final "Tomcat started on port(s): 8080 (http)" significa que a sua aplicação web já está rodando na porta 8080.
Note: Caso queria mudar a porta insira o comando no arquivo application.properties do projeto.
# Application port
server.port=808X
- Você pode acessar todos os endpoints da aplicação através do Postman, disponível em: Logistica.postman_collection.json
Endpoint de entregas: http://localhost:8080/entregas
Docker2
Criação do contêineres
Utilizado o plugin spotify para gerar a imagem do Docker. Necessário habilitá-lo para que o mesmo possa ser utilizado nos projetos.
Acesse a pasta do maven, no seu diretório, e procure pelo arquivo settings.xml . (tente em maven/conf/)
Dentro de <settings> <pluginGroups> adicione a tag:
<pluginGroup>com.spotify</pluginGroup>
As configurações de criação da imagem esta no arquivo Dockerfile da aplicação.
Para construir a imagem do Docker, basta executar os comandos direto do Maven na raiz:
Você pode realizar via cmd ou abrir um terminal através da sua IDE, na pasta aonde se encontra o arquivo logistica-api
exemplo: c:/projeto/logistica-api
Gerando o arquivo .jar do projeto
mvn clean install
Gerando a imagem do Docker
mvn dockerfile:build
Gerando um contêiner usando a imagem do mysql
(Caso não tenha a imagem o Docker irá baixar direto do DockerHub (https://hub.docker.com/_/mysql)
e irá instalar direto no Docker local.
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.31
Executando os serviços em um contêiner Docker
Sendo utilizado o docker-compose para inicializar todos os serviços de uma só vez.
Abra um terminal e navegue até o caminho no diretório onde o arquivo foi criado e execute o comando:
Na primeira vez que o comando for executado, o Docker irá criar o containers dentro do package logistica e logo após dar o start na aplicação.
docker-compose up
Parando os serviços
docker-compose down
Kubernetes3
Criação do Cluster
Criando os elementos mysql-configuration no Cluster:
Os arquivos de configurações estão no arquivo logistica/backend/mysql-configuration
Elementos | Comando | Função |
---|---|---|
Deployment | kubectl create -f mysql-deployment.yaml |
Especificando como a máquina virtual deve ser criada. Definindo qual a imagem a ser utilizada, porta, recursos de máquinas e outras propriedades. |
Services | kubectl create -f mysql-service.yaml |
Um serviço é uma abstração que define um conjunto lógico de pods e uma política para acessá-los. Os Pods recebem um IP durante a sua criação e caso um Pod de um Deployment for reiniciado, o IP poderá mudar. Expondo o(s) Pod(s) em um endereço que não será alterado. |
Config Map | kubectl create -f config-map.yaml |
Os Config Maps são formas de armazenar configurações necessárias para as aplicações de maneira simples dentro do cluster. No config-map criado estou armazenar os dados para a conexão com o MySQL. |
User | kubectl create -f cluster-user.yaml |
Criando uma conta de serviço para o usuário com acesso total ao cluster. Atenção: Está ação não é uma boa prática para um cluster em produção, ela facilita bastante o gerenciamente do cluster em um ambiente de desenvolvimento. |
Ingress | kubectl create -f logistica-ingress.yaml |
O Ingress expõe rotas HTTP e HTTPS de fora do cluster para serviços dentro do cluster. O Ingress redireciona um acesso ao cluster para o Service de uma aplicação. É uma forma de executar os serviços no cluster como se eles estivessem rodando normalmente em nossa máquina. |
Você pode verificar se o Ingress foi corretamente criado utilizando o comando:
kubectl get ingress .
Criando os elementos da API no Cluster:
Os arquivos de configurações estão em ./backend/logistica-api/deploy
API | Elemento | Comando |
---|---|---|
logistica-api | Deployment | kubectl create -f deployment.yaml |
logistica-api | Service | kubectl create -f service.yaml |
Acessando o Kubernetes Dashboard
Abra o cmd e digite o comando kubectl proxy
O comando cria um proxy para acessar a API do Kubernetes, incluindo o
dashboard.
Importante: Esse comando abre um caminho apenas para acessar os serviços do próprio Kubernetes, mas não as aplicações.
O dashboard agora está disponível para ser acessado na URL:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login
O acesso será via Token.
Utilize o comando para gerar o token de acesso.
kubectl -n kubernetes-dashboard create token logistica-admin
o arquivo Logistica.postman_collection.json é uma collection do Postman que possui as chamadas para os serviços da aplicação.
A collection está configurada para chamar os serviços já no Kubernetes.
Para chamar na execução local, basta trocar o nome de localhost para localhost:808X.
Footnotes
-
API:
Algaworks ↩ -
Docker:
Mysql docker: https://hub.docker.com/_/mysql
Livro Back-end Java - Microsserviços, Spring Boot e Kubernetes de Eduardo Felipe Zambom Santana - 2021, Casa do Código / Alura
↩ -
Kubernetes:
Autenticação no Kubernetes: https://kubernetes.io/docs/reference/access-authn-authz/rbac/
Service no Kubernetes: https://kubernetes.io/docs/concepts/services-networking/service/
Ingress no Kubernetes: https://kubernetes.io/docs/concepts/services-networking/ingress/
Token: https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
NGINX: https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/basic-configuration ↩