Skip to content

Um template com várias configurações para aspnet-core

Notifications You must be signed in to change notification settings

alefcarlos/aspnet-core-webapi

Repository files navigation

aspnet-core-webapi

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
  • SonarQube

GraphQL

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)

Docker

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 .

Docker-compose

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

k8s

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

SonarQube

Configuração

Subindo Análise