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

Folders and files

NameName
Last commit message
Last commit date

Latest commit

957b01f · Aug 27, 2019
Aug 2, 2019
Aug 2, 2019
Aug 2, 2019
Jun 26, 2019
Aug 2, 2019
Aug 2, 2019
Aug 2, 2019
Aug 2, 2019
Jun 26, 2019
Aug 2, 2019
Aug 27, 2019
Aug 2, 2019
Aug 27, 2019
Aug 2, 2019
Jun 19, 2019
Apr 9, 2019
Apr 9, 2019
Nov 3, 2018
Apr 9, 2019
Dec 20, 2018
Jun 19, 2019
Jun 26, 2019
Jun 26, 2019
Jul 1, 2019
Apr 9, 2019

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