Neste post, vamos falar sobre o processo de implantação de aplicações baseadas em microsserviços.
Algumas características que apresentamos no artigo “Microsserviços: Conceitos e Propriedades” estão diretamente ligadas à implantação de microsserviços, como disponibilidade, confiabilidade, escalabilidade e independência.
Neste sentido, a implantação de microsserviços possui alguns requisitos a serem satisfeitos, e deve prover capacidades como:
- Instanciar (ou remover) um microsserviço, independentemente dos demais;
- Escalar cada microsserviço de maneira independente, pois um determinado microsserviço pode ter mais demanda que outros;
- Construir e implantar microsserviços de forma rápida;
- Falha em um microsserviço não deve afetar os demais;
- Implantar de forma confiável.
Além disso, alguns aspectos devem ser considerados na definição do processo de implantação:
- A quantidade de microsserviços pode ser grande, e eles podem ser construídos utilizando várias linguagens e frameworks.
- Cada serviço poderá possuir muitas instâncias, as quais devem ser monitoradas independentemente.
- Deve ser possível implantar novas funcionalidades (ou serviços) sem prejudicar a disponibilidade da aplicação ou introduzir erros.
- A implantação deve ser realizada da maneira mais econômica possível.
Desta forma, é fundamental utilizar práticas maduras de implantação para a construção de microsserviços confiáveis e estáveis. A melhor maneira de garantir um processo confiável e repetitivo é automatizando a implantação dos microsserviços. Isso garantirá também consistência na execução do processo e rapidez na disponibilização de novas versões dos serviços. Naturalmente, a automação deve ser construída de maneira a garantir que qualquer alteração em microsserviços individuais não comprometa a integridade da aplicação existente e nem sua disponibilidade.
Outra prática que que visa reduzir os riscos associados com a implantação de microsserviços é a Entrega Contínua. Liberar pequenas mudanças mais frequentemente reduz o impacto que mudanças de maior envergadura normalmente provocam. Assim, ao invés de interromper a execução da aplicação a cada implantação, os microsserviços e o processo de implantação devem estar preparados para incorporar mudanças contínuas.
Unindo essas duas práticas, chegamos à definição de implantação contínua, onde todo o pipeline é automatizado. Falaremos mais sobre o pipeline de implantação em um outro post (link futuro para “Microsserviços: Criando um pipeline de Implantação”).
Para que os microsserviços possam funcionar adequadamente, seu ambiente de produção precisa ter algumas características fundamentais que irão garantir sua disponibilidade e confiabilidade:
- Plataforma de runtime, onde os microsserviços estarão em execução;
- Gerenciamento de runtime, que provê mecanismos para que o ambiente possa reagir a eventos externos, como aumento da demanda por determinado microsserviço ou indisponibilidade momentânea de algum servidor ou acesso à rede;
- Sistemas de monitoração e log, para observar o comportamento dos microsserviços ou para analisar posteriormente sua reação em caso de falhas;
- Suporte para operações seguras, como controle da rede;
- Balanceadores de carga, DNS e outros componentes de roteamento, para rotear as requisições dos usuários e também dos próprios microsserviços;
- Um pipeline de implantação que entrega os serviços desde a compilação do código até a utilização segura no ambiente de produção.
Evidentemente, a rapidez na implantação dos microsserviços é fundamental para garantir a viabilidade e a escalabilidade de aplicações dessa natureza.
Implantação de microsserviços
Afinal, quais são as principais etapas para implantar um microsserviço no ambiente de produção?
Obter os artefatos executáveis referentes ao microsserviço é o primeiro passo. Em seguida, é necessário instalar e executar esses artefatos em um ambiente de testes, de preferência com as mesmas configurações do ambiente de produção.
Dependendo da natureza da aplicação pode ser conveniente estabelecer zonas de falha, agrupando instâncias de microsserviços em blocos que serão executados em porções diferentes da infraestrutura, de maneira a aumentar a resiliência do sistema como um todo, reduzindo o impacto de uma falha na infraestrutura ou até em componentes do software.
Até esse ponto, o processo de implantação consegue colocar um microsserviço em produção, mas não consegue fazer isso de forma previsível. Isso ocorre pois não foi considerado nenhum mecanismo para versionamento e empacotamento. A adoção de um mecanismo desse tipo auxilia muito nos processos de roll back (quando é necessário retornar um conjunto de microsserviços para a versão anterior em função de uma falha) e roll forward (quando, após a instanciação de uma nova versão de um conjunto de microsserviços para um conjunto limitado de clientes – técnica conhecida como teste canário – decide-se liberar a nova versão para todos os clientes).
Artefatos de Microsserviços
Para garantir a previsibilidade da implantação, é necessário definir quais artefatos deverão necessariamente compor cada microsserviço, estabelecendo um empacotamento determinístico e imutável do microsserviço.
Sabemos que um microsserviço contém seu próprio código executável e outros componentes como as bibliotecas da aplicação, as dependências binárias (que estão instaladas no sistema operacional), as dependências externas (armazenamento de dados, balanceadores de carga e outros serviços) e os processos de suporte como log.
Para construir um artefato de implantação de microsserviços, é necessário empacotar uma versão do código do microsserviço, especificando as dependências binárias e provendo uma abstração operacional para iniciar e finalizar aquele serviço.
Desta forma, qualquer instância do microsserviço será criada da mesma forma através da utilização do artefato de implantação.
Depois de empacotar, é necessário efetivamente implantar os microsserviços em algum servidor. Além disso, as implantações contínuas devem ser realizadas sem que a aplicação tenha interrupções e, assim, possa manter sua estabilidade.