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 upA 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 builde começar a brincadeira criando o namespace que vamos utilizar:
kubectl create namespace demoe então criar o stack:
docker stack deploy --namespace demo -c docker-compose.yml appstacke 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         13sPara remover a stack:
docker stack rm appstack --namespace demo