https://github.com/vhnegrisoli/sales-microservices-spring-cloud-netflix
Projeto de uma arquitetura de microsserviços utilizando a stack Spring Cloud Netflix (Eureka, Zuul, Feign)
https://github.com/vhnegrisoli/sales-microservices-spring-cloud-netflix
eureka-discovery-service java11 mongodb postgresql rabbitmq spring-boot spring-cloud webflux zuul
Last synced: 3 months ago
JSON representation
Projeto de uma arquitetura de microsserviços utilizando a stack Spring Cloud Netflix (Eureka, Zuul, Feign)
- Host: GitHub
- URL: https://github.com/vhnegrisoli/sales-microservices-spring-cloud-netflix
- Owner: vhnegrisoli
- Created: 2021-04-11T22:31:52.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2021-04-21T01:15:10.000Z (about 4 years ago)
- Last Synced: 2025-01-10T15:48:58.437Z (5 months ago)
- Topics: eureka-discovery-service, java11, mongodb, postgresql, rabbitmq, spring-boot, spring-cloud, webflux, zuul
- Language: Java
- Homepage:
- Size: 484 KB
- Stars: 1
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Projeto - Sales Microservices Spring Cloud Netflix
Projeto de uma arquitetura de microsserviços utilizando Spring Boot e a stack Cloud Netflix (Zuul e Eureka), simulando um
pequeno sistema de vendas utilizando 3 APIs, uma para autenticação JWT, uma para persistir informações sobre produtos com PostgreSQL e uma para registrar as vendas utilizando um banco de dados MongoDB e uma aplicação reativa com Spring Webflux. A arquitetura se comunica assincronamente via RabbitMQ e sincronamente via chamada REST com Spring Cloud OpenFeign.## Objetivos
O objetivo foi criar um projeto prático enquanto realizava o curso [Arquitetura Microserviços com Spring Cloud Netflix](https://www.udemy.com/course/spring-cloud-netflix/) na Udemy do professor Francis Klay Rocha.
## Tecnologias utilizadas
- **Java 11**
- **Spring Boot 2.3**
- **REST API**
- **Spring Cloud Netflix Eureka Service Discovery**
- **Spring Cloud Netflix Zuul**
- **Spring Webflux**
- **Spring Data JPA**
- **Reactive Spring Data MongoDB**
- **Spring Security**
- **MongoDB**
- **PostgreSQL**
- **Docker**
- **Docker-Compose**
- **JWT**
- **Swagger**
- **Gradle**
- **RabbitMQ**## Arquitetura do projeto

## Executando a aplicação
É possível executar as aplicações separadamente, local em sua máquina, ou via Docker-compose.
#### Executando localmente
Para executar localmente, é necessário ter o Gradle, o Java 11 ou superior, uma instância do PostgreSQL, uma instância do MongoDB e uma instância do RabbitMQ em sua máquina.
Para executar as aplicações, basta executar na raiz de cada aplicação Java | Spring o comando:
`gradle build`
Após conseguir ter um build de sucesso, execute com:
`gradle bootRun`
#### Executando via Docker-compose
Caso você tenha o Docker em sua máquina, basta rodar o comando:
`docker-compose up --build`
Para esconder os logs no terminal, rode o comando com a flag `-d`.
### Executando sem os serviços
É possível executar apenas os bancos de dados (PostgreSQL e MongoDB) e a instância do RabbitMQ. Quem
realizará tal ação é o arquivo `docker-compose_without_services.yml`.Para especificar ao `docker-compose` que quer este arquivo, basta rodar o comando:
`docker-compose -f docker-compose_without_services.yml up --build -d`
#### Acesso
As aplicações ficarão nos seguintes endereços:
- Auth API -> http://localhost:8080/auth
- Product API -> http://localhost:8081/product
- Sales API -> http://localhost:8082/sales
- Service Discovery API -> http://localhost:8083
- Gateway API -> http://localhost:3000/apiOutras aplicações:
- RabbitMQ -> http://localhost:5172
- RabbitMQ Dashboard -> http://localhost:15172
- PostgreSQL -> http://localhost:5432
- MongoDB -> http://localhost:27017## Documentação
A documentação de cada API é utilizando o Swagger. Os projetos que possuem documentação do Swagger são: Auth API, Products API e Sales API.
O endereço de acesso de cada documentação é:
- Auth API -> http://localhost:8080/auth/swagger-ui.html
- Product API -> http://localhost:8081/product/swagger-ui.html
- Sales API -> http://localhost:8082/sales/swagger-ui.htmlSwagger do projeto Auth:

Swagger do projeto Product:

Swagger do projeto Sales:

## Service Discovery com Spring Cloud Netflix Eureka
O projeto utiliza o Spring Cloud Netflix Eureka como Service Discovery da arquitetura. O projeto Discovery possui o servidor Eureka, e os outros projetos conectam-se a eles através de um Client com o Eureka.
Após uma aplicação se registrar no Eureka, ele estará listado na dashboard do Eureka, disponível em:
http://localhost:8083/registry
O dashboard pode ser visto conforme a imagem abaixo:

## API Gateway com Zuul
O projeto API Gateway utiliza a tecnologia `Spring Cloud Netflix Zuul Proxy` que permite criar um gateway entre as 3 APIs: Sales, Auth e Product.
O path padrão desse projeto é `/api`.
Para acessar os projetos acima apenas via Gateway:
- Auth: http://localhost:3000/api/auth
- Product: http://localhost:3000/api/product
- Sales: http://localhost:3000/api/salesÉ possível acessar o Swagger pelo Gateway também ao invés de acessar cada API individualmente, basta acessar os caminhos acima, porém, com `swagger-ui.html` ao fim.
## Obter Token de Acesso
Request:
Método: POST
URL: http://localhost:8080/auth/token (http://localhost:3000/api/auth/token via Gateway)
Body:
```
{
"username": "test_user",
"password": "123456"
}
```Response:
Status: 200 | OK
```
{
"username": "test_user",
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}```
Exemplo de uso do Access Token em algum endpoint:
Request:
Método: GET
URL: http://localhost:8081/product (http://localhost:3000/api/product via Gateway)
Headers:
```
{
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}
```Response:
Status: 200 | OK
```
[
{
"productId": 1,
"productDescription": "Man of Steel",
"price": 19.9,
"quantityAvailable": 3,
"category": {
"id": 1,
"description": "Comic Books"
},
"supplier": {
"id": 1,
"name": "Amazon",
"einCnpj": "515151165"
}
},
{
"productId": 2,
"productDescription": "Spider-Man 2",
"price": 14.9,
"quantityAvailable": 1,
"category": {
"id": 3,
"description": "Movies"
},
"supplier": {
"id": 2,
"name": "Ebay",
"einCnpj": "156156181856"
}
},
{
"productId": 3,
"productDescription": "Harry Potter",
"price": 25.9,
"quantityAvailable": 2,
"category": {
"id": 2,
"description": "Books"
},
"supplier": {
"id": 2,
"name": "Ebay",
"einCnpj": "156156181856"
}
},
{
"productId": 4,
"productDescription": "Liga da Justiça 01",
"price": 5.99,
"quantityAvailable": 4,
"category": {
"id": 1,
"description": "Comic Books"
},
"supplier": {
"id": 3,
"name": "Panini",
"einCnpj": "444886664"
}
}
]
```Caso não envie o Header de Authorization em qualquer endpoint protegido, o retorno será:
Status: 403 | Forbidden
```
{
"timestamp": "2021-04-14T18:40:32.903+00:00",
"status": 403,
"error": "Forbidden",
"message": "Access Denied",
"path": "/product/"
}
```## Parando os containers
#### Caso esteja utilizando Windows, basta apenas:
1. Criar um arquivo com a extensão `.bat` e adicionar dentros os seguintes comandos:
```
@ECHO OFF
FOR /f "tokens=*" %%i IN ('docker ps -q') DO docker stop %%idocker container prune
```2. Executar este arquivo. Ao executar, todos os containers rodando serão parados, e pedirá uma confirmação para removê-los. Aperte `y` para sim e `n` para não.
#### Caso esteja utilizando Linux, basta apenas:
Basta rodar o comando:
`docker kill $(docker ps -q)`
Caso dê erro de permissão, rode como:
`sudo docker kill $(sudo docker ps -q)`
E, por fim, para remover os containers:
`docker container prune`
Espero ter ajudado! ;)
## Autor
#### Victor Hugo Negrisoli
#### Desenvolvedor de Software Back-End