Criando o seu primeiro microsserviço usando Swagger e .NET Core

Por que a Optimove mudou de monólito para microsserviços, além de um tutorial DIY sobre como criar um microsserviço

Tempo de leitura 7 minutos

LinkedInXFacebook

Relatório exclusivo da Forrester sobre IA em marketing

Na Optimove, estamos a mudar a nossa arquitetura de monolítica para microsserviços.

Por que estamos a passar por essa transição? A nossa motivação vem da vontade de implementar e entregar pequenos pedaços de código para produção, sem depender de outros componentes ou equipas. Assim, os ciclos se tornarão muito mais curtos e a qualidade, muito mais alta.

Atualmente, estamos a usar .Net Core, swagger e docker para essa tarefa. Nesta publicação do blogue, abordaremos alguns conceitos básicos que ajudarão a criar uma API usada como um microsserviço, utilizando .Net Core.

Criaremos uma API básica com uma resposta personalizada.

Mas vamos recuar um pouco: o que é um microsserviço? E por que queremos criar um?

O que são microsserviços?

Para ajudá-lo a compreender o conceito, publiquei algumas citações sobre microsserviços abaixo:

«Um método distinto de desenvolvimento de sistemas de software que tenta se concentrar na construção de módulos de função única com interfaces e operações bem definidas» (Smarbear)

«Um microsserviço é uma funcionalidade empresarial autónoma com interfaces claras e que pode, através dos seus próprios componentes internos, implementar uma arquitetura em camadas» (Wikipedia)

Porquê usar microsserviços?

Os microsserviços têm várias vantagens. São:

  • Simples de implementar
  • Fáceis de dimensionar
  • Simples de compreender
  • Fáceis de encontrar (e isolar) bugs
  • Facilmente acoplados
  • Testáveis

E muito mais

É claro que existem algumas desvantagens nos microsserviços:

  • Eles exigem mudanças culturais e não são compatíveis com versões anteriores
  • Existem desafios de segurança devido à comunicação entre serviços em todo o sistema

Duas ferramentas populares que nos ajudarão a construir o nosso microsserviço são o Docker e o Swagger. Vamos nos aprofundar em ambas.

Docker

«Em termos simples, o Docker é uma plataforma de software que simplifica o processo de construção, execução, gestão e distribuição de aplicações. Ele faz isso virtualizando o sistema operativo do computador no qual está instalado e em execução.» (FreeCodeCamp)

"O Docker é uma ferramenta projetada para facilitar a criação, implementação e execução de aplicações usando contentores. Os contentores permitem que um programador empacote uma aplicação com todas as partes necessárias, como bibliotecas e outras dependências, e envie tudo como um único pacote.» (Noteworthy)

Swagger

Swagger é o ecossistema de ferramentas mais utilizado para desenvolver APIs com a Especificação OpenAPI (OAS). O Swagger consiste em ferramentas de código aberto e profissionais, atendendo a quase todas as necessidades e casos de uso.

Basicamente, o Swagger é ótimo para documentação de API, testes e ajuda na criação de projetos de servidor na linguagem de sua escolha, bem como projetos de SDK de cliente.

Este exemplo tornará isso mais claro:

Documentação da API:

Testando sua API por meio da interface de usuário confortável:

Depois de projetar a sua API, pode gerar o código do servidor e do cliente para começar.

Numa abordagem chamada Design first, começa-se com o design da API e gera-se o código a partir do design.

Mas e se quiser escrever o seu código primeiro e depois criar uma documentação Swagger?

A abordagem Code first é a rota mais tradicional. Depois de a API ser codificada diretamente, pode gerar um documento Swagger usando diferentes ferramentas, como o Swashbuckle.

Agora, vamos combinar as ferramentas acima e criar um microsserviço básico usando a abordagem Design-First.

Vamos começar criando uma API simples gerada a partir do Swagger. Depois de abrir um editor Swagger, existem várias opções:

1. https://editor.swagger.io/

Crie uma conta em https://app.swaggerhub.com

Use o plugin Swagger para Visual Studio Code (ctrl+shift+p editor Swagger)

2. Criei uma API muito básica com 3 chamadas e 2 módulos:

Este é o código YAML:

*swagger: "2.0"
info:
description: "Esta é uma demonstração de um microserviço básico"
version: "1.0.0"
title: "Demonstração de microsserviço"
termsOfService: "http://swagger.io/terms/"
contact:
email: "rima_g@optimove.com"
license:
name: "Apache 2.0"
url: "http://www.apache.org/licenses/LICENSE-2.0.html"
host: "dummy-api.com"
basePath: "/v2"
tags:

  • nome: "atores"
    descrição: "Dados sobre atores"
    externalDocs:
    descrição: "Saiba mais"
    url: "http://swagger.io"
  • nome: "filmes"
    descrição: "Dados sobre filmes"
  • nome: "status"
    descrição: "Status da API"
    esquemas:
  • "https"
  • "http"
    caminhos:
    /atores:
    post:
    tags:
  • "atores"
    resumo: "Adicionar um novo ator"
    descrição: ""
    operationId: "addActor"
    consome:
  • "application/json"
    produz:
  • "application/json"
    parâmetros:
  • em: "corpo"
    nome: "corpo"
    descrição: "Objeto ator que precisa ser adicionado ao banco de dados"
    obrigatório: verdadeiro
    esquema: $ref : "#/definitions/ator"
    respostas:
    405:
    descrição: "Entrada inválida"
    /actors/{actorId}:
    get:
    tags:
  • "actors"
    resumo: "Encontrar ator por ID"
    descrição: "Retorna um único ator"
    operationId: "getActorsById"
    produz:
  • "application/json"
    parâmetros:
  • nome: "actorId"
    em: "path"
    descrição: "ID do ator a ser retornado"
    obrigatório: verdadeiro
    tipo: "inteiro"
    formato: "int64"
    respostas:
    200:
    descrição: "operação bem-sucedida"
    esquema: $ref : "#/definitions/Actor"
    400:
    descrição: "ID inválido fornecido"
    404:
    descrição: "Ator não encontrado"
    segurança:
  • api_key: []
    /status:
    get:
    tags:
  • "status"
    summary: "retornar status da API"
    description: "Retorna um único ator"
    operationId: "getStatus"
    produces:
  • "application/json"
    responses:
    200:
    description: "API está OK"
    schema:
    $ref: "#/definitions/ApiStatus"
    404:
    descrição: "API não encontrada"
    segurança:
  • api_key: []
    definições de segurança:
    imdb_auth:
    tipo: "oauth2"
    URL de autorização: "http://imdb.swagger.io/oauth/dialog"
    fluxo: "implícito"
    âmbitos:
    write:imdb: "modificar filmes e atores na sua conta"
    read:imdb: "ler os dados dos seus filmes e atores"
    api_key:
    tipo: "apiKey"
    nome: "api_key"
    em: "header"
    definições:
    ApiStatus:
    tipo: "objeto"
    propriedades:
    mensagem:
    tipo: "string"
    descrição: "Status da API"
    Ator:
    tipo: "objeto"
    obrigatório:
  • "id"
  • "primeiroNome"
  • "sobrenome"
    propriedades:
    id:
    tipo: "inteiro"
    formato: "int64"
    primeiroNome:
    tipo: "string"
    exemplo: "Ryan"
    apelido:
    tipo: "string"
    exemplo: "Gosling"
    xml:
    nome: "Ator"
    documentos externos:
    descrição: "Saiba mais sobre o Swagger"
    url: "http://swagger.io"*

É assim que fica:

3. Clique em «Gerar servidor» e clique na linguagem escolhida para exportar o stub do servidor:

Eu escolhi aspnetcore, mas é claro que pode escolher qualquer idioma.

4. Usando a linha de comando, vá para a pasta do projeto e abra-a no Visual Studio Code, usando o comando: 'code .'

5. Vá para /src/IO.Swagger/Controllers/StatusApi.cs

Veja este método:

Vamos alterar a resposta para algo mais personalizado:

public virtual IActionResult GetStatus()
{
//TODO: Descomente a próxima linha para retornar a resposta 200 ou use outras opções, como return this.NotFound(), return this.BadRequest(..), …
ApiStatus res= new ApiStatus();
res.Message="O Notebook é ótimo e a API está funcionando!";
return StatusCode(200, res);
{

6. Abra o Terminal (Terminal->Novo Terminal) ou CTRL+Shift+' e execute o comando de compilação: donet build

Agora, vamos dar uma olhada no dockerfile. Pode encontrá-lo aqui:

Para criar uma imagem, precisamos executar o ficheiro docker:

Cd src/IO.Swagger/

Em seguida, execute o comando de compilação:

docker build -t imdb-demo:1.0.0 -f Dockerfile .

Ou, se não tiver permissões suficientes:

sudo docker build -t imdb-demo:1.0.0 -f Dockerfile .

'imdb-demo' representa o nome da imagem.

1.0.0 é a tag, geralmente usada para especificar a versão

7. Vamos dar uma olhada nas imagens. Use este comando:

sudo docker images

8. Execute a imagem do docker para que possa aceder à API através do localhost:

Volte ao código do Visual Studio e escreva:

sudo docker run -d -p 3003:80 --name imdblocal imdb-demo:1.0.0

Escolhemos a porta 3003 para aceder à API.

«Imdblocal» é o nome desta instância específica.

9. Vamos para localhost/3003

Clique em /status:

E, em seguida, em «Experimente!»

Esta é a resposta personalizada que escrevemos.

Também podemos aceder a ela com esta URL:

Localhost:3003/v2/status

Código primeiro

Se ainda quiser usar a abordagem de código primeiro (se já tiver um código API pronto ou simplesmente preferir escrevê-lo do zero), pode usar uma ferramenta para ajudá-lo a gerar a documentação Swagger da sua API.

A lista completa dessas ferramentas pode ser encontrada aqui.

Para .Net Core, usei Swashbuckle.

Conclusão

Usando o Swagger e o .Net Core, aprendemos como criar facilmente um projeto API básico. Criámos uma imagem Docker e executámo-la para que possamos aceder ao nosso serviço através do localhost. Fique atento, na próxima vez, discutiremos a implementação em produção!

Relatório exclusivo da Forrester sobre IA em marketing

Neste relatório exclusivo da Forrester, saiba como os profissionais de marketing globais utilizam IA e Positionless Marketing para otimizar fluxos de trabalho e aumentar a relevância.

Optimove Team of Authors

Os escritores da equipa da Optimove incluem especialistas em marketing, I&D, produtos, ciência de dados, sucesso do cliente e tecnologia que foram fundamentais na criação do Positionless Marketing, um movimento que permite aos profissionais de marketing fazer tudo e ser tudo.

A experiência diversificada e o conhecimento prático dos líderes da Optimove proporcionam comentários e insights especializados sobre práticas e tendências de marketing comprovadas e de ponta.

Aprenda mais, seja mais com a Optimove
Confira os nossos recursos
Descobrir
Junte-se ao movimento de Positionless Marketing
Junte-se aos profissionais de marketing que estão deixando para trás as limitações de funções fixas para aumentar a eficiência de suas campanhas em 88%