Neste artigo, quero compartilhar nossa experiência com
SergeyMaslov na solução de problemas típicos usando a arquitetura de microsserviços usando o exemplo da tarefa "criar um blog" (na esperança de que o leitor possa imaginar como o blog é organizado e isso não deve levantar questões sobre a funcionalidade :)
Portanto, nosso blog consistirá em 5 microsserviços escritos em golang:
- API do gateway (api-gw) - responsável pelo roteamento, autenticação, registro e rastreamento de solicitações
- Usuários (usuário) - registro / autenticação de usuários, registro, rastreamento de solicitações
- Artigos (publicação) - crie / leia / modifique / exclua artigos (CRUD), registro, rastreamento e autorização de solicitações
- Comentários - criar / ler / modificar / excluir comentários (CRUD), registro, rastreamento e autorização de solicitações
- Categorias (categoria) - criação / leitura / alteração / exclusão de categorias (CRUD), registro, rastreamento e autorização de solicitações
O aplicativo cliente (web / front-end) será implementado no vue.js e interagirá com os microsserviços por meio da API REST, e os próprios microsserviços interagirão entre si por meio do gRPC.
Como armazenamento, usaremos o MongoDB.
Mostraremos com uma cereja no bolo como manter a documentação da API (no formato swagger) atualizada em um projeto em desenvolvimento ativo com o mínimo de trabalho.
Diagrama de componentes do blog

Cada microsserviço será implementado em um contêiner Docker separado e o projeto será iniciado usando o docker-compose.
Faça imediatamente uma reserva no exemplo, para simplificar o processo de desenvolvimento, usarei duas suposições que não devem ser usadas na produção.
- O banco de dados é implantado em um contêiner de docker. Essa abordagem reduz a confiabilidade do armazenamento (com exceção do esquema discutido no HighLoad 2018).
- Todo o projeto está hospedado em um repositório git. Essa abordagem contradiz um dos princípios básicos da arquitetura de microsserviços - isolamento e aumenta a probabilidade de conectividade entre componentes.
Você pode ver a demonstração do projeto
aqui e o código fonte
aqui .
Estrutura do projeto

Como o processo de desenvolvimento será construído
Como eu disse anteriormente, a interação entre microsserviços será baseada no gRPC. Em poucas palavras, o gRPC é uma estrutura de alto desempenho desenvolvida pelo Google para chamar procedimentos remotos (RPC) - funciona sobre o HTTP / 2. O GRPC é baseado no chamado protofile (veja o exemplo abaixo), cuja principal tarefa é declarar duas coisas de forma compacta:
- forneça uma lista completa de interfaces de serviço (análogo de interfaces API);
- descreva o que é alimentado na entrada de cada interface e o que obtemos na saída.
Abaixo, como exemplo, é fornecido o protofile do serviço Category.
syntax = "proto3"; package protobuf; import "google/api/annotations.proto";
Agora que descobrimos em termos gerais por que um protofile é necessário, vamos ver como será o processo de desenvolvimento de nossos microsserviços:
- Nós descrevemos a estrutura do serviço no protofile;
- Se iniciarmos o gerador de código (./bin/protogen.sh), ele gerará a parte principal do código do servidor para nós + criará o código do cliente, por exemplo, para o API Gateway + criará documentação atualizada no formato swagger;
- Tudo o que temos a fazer com nossas próprias mãos é escrever o código para a implementação de interfaces em um arquivo especial /protobuf/functions.go.
Além disso, se quisermos fazer alterações em um de nossos microsserviços, procederemos de acordo com o algoritmo acima: editamos o protofile, executamos o protogen, editamos a implementação em functions.go, e as alterações “saem” automaticamente da documentação e dos clientes.
Continua no artigo
"Escrevendo um blog sobre microsserviços, parte 2 da Gateway API" .