Estruturar microsserviços: Integração contínuaDesigning microservices: Continuous integration

Integração contínua e entrega contínuas (CI/CD) são um requisito importante para alcançar o sucesso com microsserviços.Continuous integration and continuous delivery (CI/CD) are a key requirement for achieving success with microservices. Sem um bom processo de CI/CD, será obtido ou não a agilidade que prometem de microsserviços.Without a good CI/CD process, you will not achieve the agility that microservices promise. Alguns dos desafios de CI/CD para microsserviços surgem da necessidade de várias bases de código e ambientes de compilação heterogéneos para vários serviços.Some of the CI/CD challenges for microservices arise from having multiple code bases and heterogenous build environments for the various services. Este capítulo descreve os desafios e recomenda algumas abordagens para o problema.This chapter describes the challenges and recommends some approaches to the problem.

Diagrama de CI/CD para microsserviços

Ciclos de lançamento mais rápidos são uma das maiores razões para adotar uma arquitetura de microsserviços.Faster release cycles are one of the biggest reasons to adopt a microservices architecture.

Numa aplicação monolítica puramente, há um pipeline de compilação único cuja saída é o executável do aplicativo.In a purely monolithic application, there is a single build pipeline whose output is the application executable. Todos os feeds de trabalho de desenvolvimento para este pipeline.All development work feeds into this pipeline. Se não for encontrado um bug de alta prioridade, uma correção deve ser integrada, testada e publicada, que pode atrasar o lançamento de novas funcionalidades.If a high-priority bug is found, a fix must be integrated, tested, and published, which can delay the release of new features. É verdade que capazes de atenuar esses problemas com módulos bem fatorados e ao utilizar ramos de funcionalidade para minimizar o impacto de alterações de código.It's true that you can mitigate these problems by having well-factored modules and using feature branches to minimize the impact of code changes. Mas, à medida que o aplicativo cresce mais complexo e, mais funcionalidades são adicionadas, o processo de lançamento para um monólito tende a se tornarem mais frágil e corrompido.But as the application grows more complex, and more features are added, the release process for a monolith tends to become more brittle and likely to break.

Seguindo a filosofia de microsserviços, nunca deve haver um comboio de versão longo em que cada equipe tem obter na linha.Following the microservices philosophy, there should never be a long release train where every team has to get in line. A equipe que cria o serviço "A" pode libertar uma atualização em qualquer altura, sem aguardar que as alterações no serviço "B" a serem intercalados, testado e implementado.The team that builds service "A" can release an update at any time, without waiting for changes in service "B" to be merged, tested, and deployed. O processo de CI/CD é fundamental para tornar isso possível.The CI/CD process is critical to making this possible. Seu pipeline de lançamento deve ser automatizada e altamente confiável, para que os riscos de implantação de atualizações são minimizados.Your release pipeline must be automated and highly reliable, so that the risks of deploying updates are minimized. Se o que irá disponibilizar para produção diariamente ou várias vezes por dia, regressões ou interrupções de serviço tem de ser muito raras.If you are releasing to production daily or multiple times a day, regressions or service disruptions must be very rare. Ao mesmo tempo, se implementada uma atualização incorreta, tem de ter uma forma fiável para rapidamente reverter ou efetuar para uma versão anterior de um serviço.At the same time, if a bad update does get deployed, you must have a reliable way to quickly roll back or roll forward to a previous version of a service.

Diagrama de uma solução de CI/CD

Quando falamos sobre CI/CD, realmente estamos falando sobre os vários processos relacionados: Integração contínua, entrega contínua e implementação contínua.When we talk about CI/CD, we are really talking about several related processes: Continuous integration, continuous delivery, and continuous deployment.

  • Integração contínua significa que as alterações de código com freqüência são intercaladas no ramo principal, usando criação automatizados e processos para se certificar de que o código da ramificação principal é sempre qualidade de produção de teste.Continuous integration means that code changes are frequently merged into the main branch, using automated build and test processes to ensure that code in the main branch is always production-quality.

  • Entrega contínua significa que as alterações de código que passam o processo de CI são automaticamente publicadas para um ambiente de produção simulado.Continuous delivery means that code changes that pass the CI process are automatically published to a production-like environment. Implantação no ambiente de produção em direto pode exigir a aprovação manual, mas caso contrário, é automatizada.Deployment into the live production environment may require manual approval, but is otherwise automated. O objetivo é que seu código deve ser sempre pronto para implementar para produção.The goal is that your code should always be ready to deploy into production.

  • Implementação contínua significa que as alterações de código que passam o processo de CI/CD são implementadas automaticamente em produção.Continuous deployment means that code changes that pass the CI/CD process are automatically deployed into production.

No contexto do Kubernetes e microsserviços, o estágio de CI pretende criar e testar imagens de contentor e enviar essas imagens para um registo de contentor.In the context of Kubernetes and microservices, the CI stage is concerned with building and testing container images, and pushing those images to a container registry. Na fase de implantação, especificações de pod são atualizadas para escolher a imagem de produção mais recente.In the deployment stage, pod specs are updated to pick up the latest production image.

DesafiosChallenges

  • Muitas bases de código independente pequenas.Many small independent code bases. Cada equipe é responsável por construir seu próprio serviço, com seu próprio pipeline de compilação.Each team is responsible for building its own service, with its own build pipeline. Em algumas organizações, equipes podem usar os repositórios de código separado.In some organizations, teams may use separate code repositories. Isto pode levar a uma situação em que o conhecimento de como criar o sistema é distribuído por entre as equipes e ninguém na organização sabe como implementar o aplicativo inteiro.This could lead to a situation where the knowledge of how to build the system is spread across teams, and nobody in the organization knows how to deploy the entire application. Por exemplo, o que acontece num cenário de recuperação após desastre, se precisar de implementar rapidamente para um novo cluster?For example, what happens in a disaster recovery scenario, if you need to quickly deploy to a new cluster?

  • Várias linguagens e arquiteturas.Multiple languages and frameworks. Com cada equipe que usa sua própria combinação de tecnologias, ele pode ser difícil de criar um processo de compilação única que funciona em toda a organização.With each team using its own mix of technologies, it can be difficult to create a single build process that works across the organization. O processo de compilação tem de ser suficientemente flexível para que todas as equipes podem adaptá-lo para a sua escolha de linguagem ou arquitetura.The build process must be flexible enough that every team can adapt it for their choice of language or framework.

  • Integração e o teste de carga.Integration and load testing. Com as equipes de lançar atualizações em seu próprio ritmo, pode ser um desafio para estruturar robusta-a-ponto de teste, especialmente quando os serviços têm dependências noutros serviços.With teams releasing updates at their own pace, it can be challenging to design robust end-to-end testing, especially when services have dependencies on other services. Além disso, a executar um cluster de produção completo pode ser Caro, portanto, é improvável que todas as equipes poderão executar seu próprio cluster completo em escalas de produção, apenas para teste.Moreover, running a full production cluster can be expensive, so it's unlikely that every team will be able to run its own full cluster at production scales, just for testing.

  • Gestão de versões.Release management. Todas as equipes devem ter a capacidade para implementar uma atualização na produção.Every team should have the ability to deploy an update to production. Isso não significa que todos os membros da Equipe tem permissões para fazer isso.That doesn't mean that every team member has permissions to do so. Mas ter uma função de gerente de versão centralizado pode reduzir a velocidade das implementações.But having a centralized Release Manager role can reduce the velocity of deployments. Mais que o seu processo de CI/CD é automatizado e fiável, deve ser a menos daí a necessidade de uma autoridade central.The more that your CI/CD process is automated and reliable, the less there should be a need for a central authority. Dito isso, poderá ter diferentes políticas para lançar atualizações de funcionalidades principais versus pequenas correções de erros.That said, you might have different policies for releasing major feature updates versus minor bug fixes. A ser descentralizado não significa que deve haver zero governação.Being decentralized does not mean there should be zero governance.

  • Controlo de versões de imagem de contentor.Container image versioning. Durante o ciclo de desenvolvimento e teste, o processo de CI/CD irá criar várias imagens de contentor.During the development and test cycle, the CI/CD process will build many container images. Apenas alguns desses são candidatos para a versão e, em seguida, apenas alguns desses versão candidatos irão obter emitidos via push para produção.Only some of those are candidates for release, and then only some of those release candidates will get pushed into production. Deve ter uma estratégia de controle de versão clara, para que saiba quais imagens são atualmente implementadas em produção e podem reverter para uma versão anterior se necessário.You should have a clear versioning strategy, so that you know which images are currently deployed to production, and can roll back to a previous version if necessary.

  • As atualizações de serviço.Service updates. Quando atualizar um serviço para uma nova versão, não deve interromper a outros serviços que dependem dele.When you update a service to a new version, it shouldn't break other services that depend on it. Se fizer uma atualização sem interrupção, haverá um período de tempo quando está em execução uma mistura de versões.If you do a rolling update, there will be a period of time when a mix of versions is running.

Esses desafios refletem uma tensão fundamental.These challenges reflect a fundamental tension. Por um lado, as equipes precisam trabalhar como independentemente quanto possível.On the one hand, teams need to work as independently as possible. Por outro lado, alguns coordenação é necessária para que uma única pessoa pode fazer tarefas, como executar um teste de integração, voltar a implementar a solução completa para um novo cluster ou reverter uma atualização incorreta.On the other hand, some coordination is needed so that a single person can do tasks like running an integration test, redeploying the entire solution to a new cluster, or rolling back a bad update.

Abordagens de CI/CD para microsserviçosCI/CD approaches for microservices

É uma boa prática para todas as equipes de serviço colocar num contentor do seu ambiente de compilação.It's a good practice for every service team to containerize their build environment. Este contentor deve ter todas as ferramentas de compilação necessárias para criar os artefactos de código para o seu serviço.This container should have all of the build tools necessary to build the code artifacts for their service. Muitas vezes, pode encontrar uma imagem oficial do Docker para o seu idioma e o framework.Often you can find an official Docker image for your language and framework. Pode utilizar docker run ou o Docker Compose para executar a compilação.Then you can use docker run or Docker Compose to run the build.

Com esta abordagem, é comum para configurar um novo ambiente de compilação.With this approach, it's trivial to set up a new build environment. Um desenvolvedor que deseja criar o seu código não tem de instalar um conjunto de ferramentas de compilação, mas simplesmente executa a imagem de contentor.A developer who wants to build your code doesn't need to install a set of build tools, but simply runs the container image. Talvez mais importante, o servidor de compilação pode ser configurado para fazer a mesma coisa.Perhaps more importantly, your build server can be configured to do the same thing. Dessa forma, não precisa instalar essas ferramentas para o servidor de compilação, ou gerir versões conflitantes de ferramentas.That way, you don't need to install those tools onto the build server, or manage conflicting versions of tools.

Para o local de desenvolvimento e teste, utilize o Docker para executar o serviço dentro de um contentor.For local development and testing, use Docker to run the service inside a container. Como parte deste processo, terá de executar outros contentores que tenham serviços fictícios ou bases de dados de teste necessários para a realização de testes locais.As part of this process, you may need to run other containers that have mock services or test databases needed for local testing. Pode utilizar o Docker Compose para coordenar estes contentores ou utilize Minikube para executar localmente o Kubernetes.You could use Docker Compose to coordinate these containers, or use Minikube to run Kubernetes locally.

Quando o código estiver pronto, abra um pedido pull e intercalação no principal.When the code is ready, open a pull request and merge into master. Esta ação iniciará uma tarefa no servidor de compilação:This will start a job on the build server:

  1. Crie os ativos de código.Build the code assets.
  2. Execute testes de unidade relativamente ao código.Run unit tests against the code.
  3. Crie a imagem de contentor.Build the container image.
  4. Teste a imagem de contentor através da execução de testes funcionais num contentor em execução.Test the container image by running functional tests on a running container. Este passo pode detetar erros no ficheiro do Docker, como um ponto de entrada incorreto.This step can catch errors in the Docker file, such as a bad entry point.
  5. Envie a imagem para um registo de contentor.Push the image to a container registry.
  6. Atualize o cluster de teste com a nova imagem para executar testes de integração.Update the test cluster with the new image to run integration tests.

Quando a imagem está pronta para entrar em produção, atualize os arquivos de implantação, conforme necessário para especificar a imagem mais recente, incluindo quaisquer ficheiros de configuração do Kubernetes.When the image is ready to go into production, update the deployment files as needed to specify the latest image, including any Kubernetes configuration files. Em seguida, aplica a atualização para o cluster de produção.Then apply the update to the production cluster.

Seguem-se algumas recomendações para o que torna as Implantações mais confiável:Here are some recommendations for making deployments more reliable:

  • Defina as convenções de toda a organização para etiquetas de contentor, controle de versão e convenções de nomenclatura para recursos implementados para o cluster (pods, serviços e assim por diante).Define organization-wide conventions for container tags, versioning, and naming conventions for resources deployed to the cluster (pods, services, and so on). Que pode tornar mais fácil de diagnosticar problemas de implantação.That can make it easier to diagnose deployment issues.

  • Crie dois registos de contentores separados, um para desenvolvimento/teste e outra para produção.Create two separate container registries, one for development/testing and one for production. Não envie uma imagem para o registo de produção, até estar pronto para implantá-lo em produção.Don't push an image to the production registry until you're ready to deploy it into production. Se combinar esta prática com o controle de versão semântica das imagens de contentor, pode reduzir a possibilidade de acidentalmente implantando uma versão que não foi aprovada para lançamento.If you combine this practice with semantic versioning of container images, it can reduce the chance of accidentally deploying a version that wasn't approved for release.

Serviços de atualizaçãoUpdating services

Existem várias estratégias para atualizar um serviço que já esteja em produção.There are various strategies for updating a service that's already in production. Aqui, abordamos três opções comuns: Implementar a atualização, a implementação de "blue-Green" e versão canary.Here we discuss three common options: Rolling update, blue-green deployment, and canary release.

Implementar a atualizaçãoRolling update

Uma atualização sem interrupção, implementa novas instâncias de um serviço e as novas instâncias começar a receber pedidos de imediato.In a rolling update, you deploy new instances of a service, and the new instances start receiving requests right away. Como as novas instâncias surgem o tempo limite, as instâncias anteriores são removidas.As the new instances come up, the previous instances are removed.

Atualizações sem interrupção são o comportamento padrão no Kubernetes, quando atualizar a especificação de pod para uma implementação.Rolling updates are the default behavior in Kubernetes when you update the pod spec for a Deployment. O controlador de implementação cria uma nova ReplicaSet para os pods atualizados.The Deployment controller creates a new ReplicaSet for the updated pods. Em seguida, o dimensionamento a ReplicaSet novo ao reduzir verticalmente o um antigo, para manter a contagem de réplica pretendido.Then it scales up the new ReplicaSet while scaling down the old one, to maintain the desired replica count. Não elimina os pods antigos até que as novas esteja prontas.It doesn't delete old pods until the new ones are ready. Kubernetes mantém um histórico da atualização, pelo que pode utilizar o kubectl para reverter uma atualização se for necessário.Kubernetes keeps a history of the update, so you can use kubectl to roll back an update if needed.

Se o seu serviço executa uma tarefa de inicialização longos, pode definir uma sonda de preparação.If your service performs a long startup task, you can define a readiness probe. A sonda de preparação para os relatórios quando o contentor está pronto para começar a receber tráfego.The readiness probe reports when the container is ready to start receiving traffic. Kubernetes não enviar tráfego para o pod até que a sonda comunica êxito.Kubernetes won't send traffic to the pod until the probe reports success.

Um desafio de implementar atualizações é que durante o processo de atualização, uma mistura antigos e novas versões estão em execução e receber tráfego.One challenge of rolling updates is that during the update process, a mix of old and new versions are running and receiving traffic. Durante este período, qualquer solicitação poderia é roteada para qualquer uma das duas versões.During this period, any request could get routed to either of the two versions. Tal pode ou não causar problemas, dependendo do escopo das alterações entre as duas versões.That may or may not cause problems, depending on the scope of the changes between the two versions.

Implementação de "blue-Green"Blue-green deployment

Uma implementação de "blue-Green", é possível implementar a nova versão juntamente com a versão anterior.In a blue-green deployment, you deploy the new version alongside the previous version. Depois de validar a nova versão, optar por todo o tráfego de uma só vez da versão anterior para a nova versão.After you validate the new version, you switch all traffic at once from the previous version to the new version. Após a mudança do utilizador, monitorizar a aplicação para quaisquer problemas.After the switch, you monitor the application for any problems. Se algo der errado, pode alternar para a versão antiga.If something goes wrong, you can swap back to the old version. Partindo do princípio de que não existem problemas, pode eliminar a versão antiga.Assuming there are no problems, you can delete the old version.

Com um aplicativo mais tradicional monolítico ou de N camadas, implementação de "blue-Green" significava geralmente aprovisionamento dois ambientes idênticos.With a more traditional monolithic or N-tier application, blue-green deployment generally meant provisioning two identical environments. Poderia implementar a nova versão num ambiente de teste, em seguida, redirecionar o tráfego de cliente para o ambiente de teste — por exemplo, trocando VIP endereços.You would deploy the new version to a staging environment, then redirect client traffic to the staging environment — for example, by swapping VIP addresses.

No Kubernetes, não precisa de aprovisionar um cluster separado para fazer Implantações de "blue-Green".In Kubernetes, you don't need to provision a separate cluster to do blue-green deployments. Em vez disso, pode tirar partido de seletores.Instead, you can take advantage of selectors. Crie um novo recurso de implementação com uma nova especificação de pod e um conjunto diferente de etiquetas.Create a new Deployment resource with a new pod spec and a different set of labels. Crie esta implementação, sem a eliminar a implementação anterior ou modificando o serviço que aponta para ela.Create this deployment, without deleting the previous deployment or modifying the service that points to it. Assim que estiver a executar os pods de novo, pode atualizar o seletor do serviço de acordo com a nova implementação.Once the new pods are running, you can update the service's selector to match the new deployment.

Uma vantagem das implementações "blue-Green" é que o serviço alternará a todos os pods ao mesmo tempo.An advantage of blue-green deployments is that the service switches all the pods at the same time. Depois do serviço é atualizado, todos os novos pedidos são roteados para a nova versão.After the service is updated, all new requests get routed to the new version. Uma desvantagem é que durante a atualização, está a executar duas vezes mais pods para o serviço (atual e seguinte).One drawback is that during the update, you are running twice as many pods for the service (current and next). Se os pods exigem muitos recursos de CPU ou memória, poderá ter de aumentar horizontalmente o cluster temporariamente para lidar com o consumo de recursos.If the pods require a lot of CPU or memory resources, you may need to scale out the cluster temporarily to handle the resource consumption.

Versão canaryCanary release

Numa versão canary, implementar uma versão atualizada para um pequeno número de clientes.In a canary release, you roll out an updated version to a small number of clients. Em seguida, monitorar o comportamento do novo serviço antes de implantá-la em todos os clientes.Then you monitor the behavior of the new service before rolling it out to all clients. Isto permite-lhe fazer uma implementação lenta de maneira controlada, verifique os dados reais e detete os problemas antes de todos os clientes serem afetados.This lets you do a slow rollout in a controlled fashion, observe real data, and spot problems before all customers are affected.

Uma versão canary é mais complexa de gerenciar do que a atualização de "blue-Green" ou sem interrupção, porque tem dinamicamente encaminhar os pedidos para versões diferentes do serviço.A canary release is more complex to manage than either blue-green or rolling update, because you must dynamically route requests to different versions of the service. No Kubernetes, pode configurar um serviço para abranger dois conjuntos de réplica (uma para cada versão) e ajustar as contagens de réplica manualmente.In Kubernetes, you can configure a Service to span two replica sets (one for each version) and adjust the replica counts manually. No entanto, essa abordagem é refinada em vez disso, devido a forma como o Kubernetes carregar equilibra nas pods.However, this approach is rather coarse-grained, because of the way Kubernetes load balances across pods. Por exemplo, se tiver um total de réplicas de dez, apenas pode mudar o tráfego em incrementos de 10%.For example, if you have a total of ten replicas, you can only shift traffic in 10% increments. Se estiver a utilizar uma malha de serviço, pode utilizar as regras de roteamento de malha de serviço para implementar uma estratégia de versão canary mais sofisticada.If you are using a service mesh, you can use the service mesh routing rules to implement a more sophisticated canary release strategy. Aqui estão alguns recursos que podem ser úteis:Here are some resources that may be helpful:

ConclusãoConclusion

Nos últimos anos, houve uma alteração de mar no setor, um movimento desde a criação sistemas de registo para a construção sistemas do envolvimento.In recent years, there has been a sea change in the industry, a movement from building systems of record to building systems of engagement.

Sistemas de registo são aplicativos de gerenciamento de dados de back-office tradicional.Systems of record are traditional back-office data management applications. No cerne destes sistemas de lá, muitas vezes, encontra-se um RDBMS é a única fonte de verdade.At the heart of these systems there often sits an RDBMS that is the single source of truth. O termo "sistema de envolvimento" é creditado Geoffrey Moore, no seu 2011 sistemas de envolvimento e o futuro de TI empresariais.The term "system of engagement" is credited to Geoffrey Moore, in his 2011 paper Systems of Engagement and the Future of Enterprise IT. Sistemas de envolvimento são aplicativos enfoca a comunicação e colaboração.Systems of engagement are applications focused on communication and collaboration. Eles se conectar pessoas em tempo real.They connect people in real time. Estes têm de estar disponível 24x7.They must be available 24/7. São introduzidas novas funcionalidades regularmente sem que a aplicação offline.New features are introduced regularly without taking the application offline. Os usuários esperam mais e são menos pacientes de atrasos inesperados ou tempo de inatividade.Users expect more and are less patient of unexpected delays or downtime.

No espaço de consumidor, uma melhor experiência de utilizador pode ter valor comercial mensuráveis.In the consumer space, a better user experience can have measurable business value. A quantidade de tempo que um utilizador interage com um aplicativo pode traduzir-se diretamente em receitas.The amount of time that a user engages with an application may translate directly into revenue. E no território dos sistemas de negócios, as expectativas dos usuários foram alterados.And in the realm of business systems, users' expectations have changed. Se estes sistemas têm como objetivo promover a comunicação e colaboração, têm de realizar sua sugestão da liga aplicações voltadas para consumidores.If these systems aim to foster communication and collaboration, they must take their cue from consumer-facing applications.

Os Microsserviços são uma resposta para este cenário em constante alteração.Microservices are a response to this changing landscape. Por decomposição de uma aplicação monolítica num grupo de serviços menos rígidos, podemos controlar o ciclo de lançamento de cada serviço e ativar atualizações freqüentes sem tempo de inatividade ou alterações recentes.By decomposing a monolithic application into a group of loosely coupled services, we can control the release cycle of each service, and enable frequent updates without downtime or breaking changes. Microsserviços também o ajudará com escalabilidade, isolamento de falhas e resiliência.Microservices also help with scalability, failure isolation, and resiliency. Enquanto isso, plataformas de nuvem estão tornando mais fácil criar e executar microsserviços, com o aprovisionamento automatizado de recursos de computação, orquestradores de contentor como um serviço e ambientes de sem servidor condicionadas por eventos.Meanwhile, cloud platforms are making it easier to build and run microservices, with automated provisioning of compute resources, container orchestrators as a service, and event-driven serverless environments.

Mas, como vimos, sendo também muitos dos desafios de arquiteturas de microsserviços.But as we've seen, microservices architectures also being a lot of challenges. Para ter êxito, tem de iniciar a partir de uma estrutura sólida.To succeed, you must start from a solid design. Tem de colocar atenta para analisar o domínio, escolha de tecnologias, modelação de dados, criação de APIs e criação de uma cultura DevOps madura.You must put careful thought into analyzing the domain, choosing technologies, modeling data, designing APIs, and building a mature DevOps culture. Esperamos que este guia e que o acompanha implementação de referência, ajudou a esclarecer a jornada.We hope that this guide, and the accompanying reference implementation, has helped to illuminate the journey.