Esse é um projeto para futuras consultas de técnicas empregadas com ASP.NET Core 2.2 aplicando API-Guidelines da Microsoft.
Técnicas
- RESTfull
- Autenticação JWT
- Swagger
- Versionamento de API
- Docker
- HealthCheck - Utilizando a lib Xabaril/AspNetCore.Diagnostics.HealthChecks
- Acessar o endpoint /healthz da api no browser
- Acessar a url http://localhost:8003/healthchecks-ui para visualizar um painel com o monitoramento, disponível somente com docker-compose
- App.Metrics + Prometheus + Grafana
- FluentValidation
- GraphQL
- Acessar a url /ui/playground no browser
- EF
- MySQL
- Migrations
- Resiliência requisições Http(utilizando Polly)
- Retry
- Timeout
- CircuitBreaker
- Caching
- Redis - Baseado nessa implementação
- MessageBrokers
- RabbitMQ
- - Criação customizada de exchanges/queue por Atributos
- RabbitMQ
- SonarQube
Para utilizar o GraphQL é necessário ter um token de autenticação Bearer.
Acessando a url https://localhost:5001/ui/playground
terá disponível uma UI para realizar alguns testes ;)
Para adicionar novos personagens basta realizar as operações do contorller Dragon Ball.
Tipos disponívels:
type Character { id: int, name: string!, bithDate: string!, relatives: [Relative!], kind: Kind! } type Relative { id: int!, name: string!, bithDate: string!, relatives: [Relative!], relativeKind: RelativeKind! } enum Kind { HUMAN = 1, SAYAJIN = 2 } enum RelativeKind { Brother = 1, Sister = 2, Son = 3, Daugther = 4, Spouse = 5, Father = 6 , Mother = 7 }
Queries disponíveis
characters character(id: int)
Mutations disponíveis
createCharacter(character: Character)
O arquivo Dockerfile
já contém as instruções necessárias para serem buildadas, vamos executar o comando abaixo para compilar uma imagem.
docker build -t aspnet-core-webapi .
O arquivo docker-compose.yml
já contém as imagens necessárias para rodar a aplicação, basta executar o comando abaixo:
docker-compose build docker-compose up
A porta do container é 80, porém estará pública na porta 8181.
E acessar a página http://localhost:8181/index.html
Para o exemplo vamos utilizar o docker stack
que tem suporte ao Kubernetes.
Docker stack somente suporte imagens já buildadas
Vamos buildar todos os nossos softwares:
docker-compose build
e começar a brincadeira criando o namespace que vamos utilizar:
kubectl create namespace demo
e então criar o stack:
docker stack deploy --namespace demo -c docker-compose.yml appstack
e vamos validar nosso deployment:
kubectl get all -n demo NAME READY STATUS RESTARTS AGE pod/healthapp-78959fcf7b-5xj6b 1/1 Running 0 12s pod/mongodb-d5cc949f5-pqjqs 1/1 Running 0 12s pod/mysqldb-5c8dccbd78-w5f8l 1/1 Running 0 12s pod/rabbitmq-544d746545-hpm7d 1/1 Running 0 12s pod/redis-d56fc6bdf-bmmds 1/1 Running 0 12s pod/web-78bc8955d4-2sjkq 0/1 Error 0 12s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/healthapp ClusterIP None <none> 55555/TCP 12s service/healthapp-published LoadBalancer 10.97.148.148 localhost 8083:30610/TCP 9s service/mongodb ClusterIP None <none> 55555/TCP 9s service/mongodb-published LoadBalancer 10.100.145.160 localhost 27017:30231/TCP 12s service/mysqldb ClusterIP None <none> 55555/TCP 8s service/mysqldb-published LoadBalancer 10.105.66.236 localhost 3306:30969/TCP 12s service/rabbitmq ClusterIP None <none> 55555/TCP 12s service/rabbitmq-published LoadBalancer 10.104.157.0 localhost 5672:31170/TCP,15672:31195/TCP 7s service/redis ClusterIP None <none> 55555/TCP 7s service/redis-published LoadBalancer 10.104.50.187 localhost 6379:30003/TCP 12s service/web ClusterIP None <none> 55555/TCP 12s service/web-published LoadBalancer 10.104.37.39 localhost 8181:30589/TCP 8s NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.apps/healthapp 1 1 1 1 13s deployment.apps/mongodb 1 1 1 1 13s deployment.apps/mysqldb 1 1 1 1 12s deployment.apps/rabbitmq 1 1 1 1 13s deployment.apps/redis 1 1 1 1 13s deployment.apps/web 1 1 1 0 13s NAME DESIRED CURRENT READY AGE replicaset.apps/healthapp-78959fcf7b 1 1 1 13s replicaset.apps/mongodb-d5cc949f5 1 1 1 12s replicaset.apps/mysqldb-5c8dccbd78 1 1 1 12s replicaset.apps/rabbitmq-544d746545 1 1 1 13s replicaset.apps/redis-d56fc6bdf 1 1 1 13s replicaset.apps/web-78bc8955d4 1 1 0 13s
Para remover a stack:
docker stack rm appstack --namespace demo