Criar microsserviços no AzureBuilding microservices on Azure

Os microsserviços são um estilo de arquitetura popular para criar aplicações resilientes, altamente dimensionáveis, possíveis de implementar de forma independente e capazes de evoluir rapidamente.Microservices are a popular architectural style for building applications that are resilient, highly scalable, independently deployable, and able to evolve quickly. Contudo, uma boa arquitetura de microsserviços requer uma abordagem diferente no que respeita a conceção e criação de aplicações.But a successful microservices architecture requires a different approach to designing and building applications.

Uma arquitetura de microsserviços consiste numa coleção de pequenos serviços autónomos.A microservices architecture consists of a collection of small, autonomous services. Cada serviço é autónomo e deve implementar uma única capacidade empresarial.Each service is self-contained and should implement a single business capability.

Diagrama lógico do estilo de arquitetura de microsserviços

O que são os microsserviços?What are microservices?

  • Os microsserviços são serviços pequenos, independentes e relativamente interligados.Microservices are small, independent, and loosely coupled. Uma única pequena equipa de programadores consegue escrever e tratar da manutenção de um serviço.A single small team of developers can write and maintain a service.

  • Cada serviço é um código base separado, que pode ser gerido por uma equipa de desenvolvimento pequena.Each service is a separate codebase, which can be managed by a small development team.

  • Os serviços podem ser implementados de forma independente.Services can be deployed independently. Uma equipa pode atualizar um serviço existente sem reconstruir e reimplementar toda a aplicação.A team can update an existing service without rebuilding and redeploying the entire application.

  • Os serviços são responsáveis pela persistência dos seus próprios dado ou estado externo.Services are responsible for persisting their own data or external state. Isto é diferente do modelo tradicional, em que uma camada de dados separada processa a persistência dos dados.This differs from the traditional model, where a separate data layer handles data persistence.

  • Os serviços comunicam entre si através de APIs bem definidas.Services communicate with each other by using well-defined APIs. Os detalhes internos da implementação de cada serviço estão ocultos de outros serviços.Internal implementation details of each service are hidden from other services.

  • Os serviços não precisam de partilhar a mesma pilha de tecnologia, bibliotecas ou estruturas.Services don't need to share the same technology stack, libraries, or frameworks.

Além dos próprios serviços, alguns outros componentes estão presentes numa arquitetura de microsserviços típica:Besides for the services themselves, some other components appear in a typical microservices architecture:

Gestão/orquestração.Management/orchestration. Este componente é responsável por colocar os serviços em nós, identificando falhas, reequilibrando os serviços nos nós e assim sucessivamente.This component is responsible for placing services on nodes, identifying failures, rebalancing services across nodes, and so forth. Normalmente, este componente é uma tecnologia pronta a utilizar, como o Kubernetes, em vez de ser algo personalizado.Typically this component is an off-the-shelf technology such as Kubernetes, rather than something custom built.

Gateway de API.API Gateway. O gateway da API é o ponto de entrada para os clientes.The API gateway is the entry point for clients. Em vez de chamarem serviços diretamente, os clientes chamam o gateway de API, o qual reencaminha a chamada para os serviços adequados no back-end.Instead of calling services directly, clients call the API gateway, which forwards the call to the appropriate services on the back end.

As vantagens de utilizar um gateway de API incluem:Advantages of using an API gateway include:

  • Dissocia os clientes dos serviços.It decouples clients from services. Pode dar uma versão dos serviços e refatorizá-los, sem ser necessário atualizar todos os clientes.Services can be versioned or refactored without needing to update all of the clients.

  • Os serviços podem utilizar protocolos de mensagens que não são adequados para a Web, como o AMQP.Services can use messaging protocols that are not web friendly, such as AMQP.

  • O Gateway da API pode realizar outras funções transversais, como a autenticação, o registo, a terminação de SSL e o balanceamento de carga.The API Gateway can perform other cross-cutting functions such as authentication, logging, SSL termination, and load balancing.

BenefíciosBenefits

  • Agilidade.Agility. Como os microsserviços são implementados de forma independente, pode gerir a correção de erros e o lançamento de funcionalidades com mais facilidade.Because microservices are deployed independently, it's easier to manage bug fixes and feature releases. Pode atualizar um serviço sem implementar novamente toda a aplicação e reverter uma atualização caso algo corra mal.You can update a service without redeploying the entire application, and roll back an update if something goes wrong. Em muitas aplicações tradicionais, quando se encontra um erro numa parte da aplicação, este pode bloquear todo o processo de lançamento.In many traditional applications, if a bug is found in one part of the application, it can block the entire release process. As novas funcionalidades podem ficar retidas enquanto a correção do erro é integrada, testada e publicada.New features may be held up waiting for a bug fix to be integrated, tested, and published.

  • Equipas pequenas e direcionadas.Small, focused teams. Um microsserviço deve ser pequeno ao ponto de ser possível que uma única equipa consiga criá-lo, testá-lo e implementá-lo.A microservice should be small enough that a single feature team can build, test, and deploy it. As equipas mais pequenas promovem uma maior agilidade.Small team sizes promote greater agility. As equipas grandes tendem a ser menos produtivas, porque a comunicação é mais demorada, a despesa de gestão aumenta e a agilidade diminui.Large teams tend be less productive, because communication is slower, management overhead goes up, and agility diminishes.

  • Base de código pequena.Small code base. Numa aplicação monolítica, há a tendência de, ao longo do tempo, as dependências de código ficarem emaranhadas umas nas outras, pelo que, para adicionar uma nova funcionalidade, é necessário mexer em código em diferentes locais.In a monolithic application, there is a tendency over time for code dependencies to become tangled Adding a new feature requires touching code in a lot of places. Como os microsserviços não partilham código nem arquivos de dados, a arquitetura de microsserviços minimiza as dependências, o que torna mais fácil adicionar novas funcionalidades.By not sharing code or data stores, a microservices architecture minimizes dependencies, and that makes it easier to add new features.

  • Misto de tecnologias.Mix of technologies. As equipas podem escolher a tecnologia mais adequada ao respetivo serviço, através da utilização de várias tecnologias diferentes, conforme as necessidades.Teams can pick the technology that best fits their service, using a mix of technology stacks as appropriate.

  • Isolamento de falhas.Fault isolation. Se um microsserviço individual ficar indisponível, essa ocorrência não afetará toda a aplicação, desde que os microsserviços de origem estejam preparados para lidar corretamente com as falhas (por exemplo, através da implementação de um disjuntor de circuito).If an individual microservice becomes unavailable, it won't disrupt the entire application, as long as any upstream microservices are designed to handle faults correctly (for example, by implementing circuit breaking).

  • Escalabilidade.Scalability. Os serviços podem ser dimensionados independentemente, o que lhe permite ampliar os subsistemas que necessitem de mais recursos sem que, para isso, tenha de aumentar horizontalmente toda a aplicação.Services can be scaled independently, letting you scale out subsystems that require more resources, without scaling out the entire application. Se utilizar um orquestrador como o Kubernetes ou o Service Fabric, pode incluir uma maior densidade de serviços num único anfitrião, o que permite uma utilização mais eficiente dos recursos.Using an orchestrator such as Kubernetes or Service Fabric, you can pack a higher density of services onto a single host, which allows for more efficient utilization of resources.

  • Isolamento de dados.Data isolation. É muito mais fácil fazer atualizações de esquema porque apenas é afetado um único microsserviço.It is much easier to perform schema updates, because only a single microservice is affected. Numa aplicação monolítica, as atualizações de esquema podem ser muito difíceis de fazer, porque diferentes partes da aplicação podem todas partilhar os mesmos dados, o que faz com que seja arriscado proceder a alterações.In a monolithic application, schema updates can become very challenging, because different parts of the application may all touch the same data, making any alterations to the schema risky.

DesafiosChallenges

Os microsserviços não trazem apenas benefícios.The benefits of microservices don't come for free. Eis alguns dos desafios a considerar antes de adotar uma arquitetura de microsserviços.Here are some of the challenges to consider before embarking on a microservices architecture.

  • Complexidade.Complexity. Uma aplicação de microsserviços tem mais partes em movimento do que a aplicação monolítica equivalente.A microservices application has more moving parts than the equivalent monolithic application. Cada serviço é mais simples, mas o sistema como um todo é mais complexo.Each service is simpler, but the entire system as a whole is more complex.

  • Desenvolvimento e teste.Development and testing. Escrever um pequeno serviço que dependa de outros serviços dependentes requer uma abordagem diferente da simples escrita de uma aplicação monolítica ou em camadas tradicional.Writing a small service that relies on other dependent services requires a different approach than a writing a traditional monolithic or layered application. As ferramentas existentes nem sempre são concebidas para funcionar com as dependências de serviço.Existing tools are not always designed to work with service dependencies. Refatorizar através de limites de serviço pode ser difícil.Refactoring across service boundaries can be difficult. Testar as dependências do serviço também é particularmente desafiante, especialmente quando a aplicação está a evoluir rapidamente.It is also challenging to test service dependencies, especially when the application is evolving quickly.

  • Falta de governação.Lack of governance. A abordagem descentralizada da criação de microsserviços tem vantagens, mas também pode provocar problemas.The decentralized approach to building microservices has advantages, but it can also lead to problems. Pode ficar com tantas linguagens e estruturas diferentes que se torna difícil gerir a aplicação.You may end up with so many different languages and frameworks that the application becomes hard to maintain. Poderá ser útil implementar alguns padrões em todo o projeto, sem restringir excessivamente a flexibilidade das equipas.It may be useful to put some project-wide standards in place, without overly restricting teams' flexibility. Isto aplica-se especialmente a funcionalidades transversais, como o registo.This especially applies to cross-cutting functionality such as logging.

  • Congestionamento e latência de rede.Network congestion and latency. A utilização de muitos serviços pequenos e granulares pode originar uma maior comunicação entre serviços.The use of many small, granular services can result in more interservice communication. Além disso, se a cadeia de dependências de serviços ficar muito longa (o serviço A chama o serviço B, que chama o C, etc.), a latência adicional pode tornar-se um problema.Also, if the chain of service dependencies gets too long (service A calls B, which calls C...), the additional latency can become a problem. Terá de estruturar as APIs cuidadosamente.You will need to design APIs carefully. Evite APIs excessivamente comunicativas, considere os formatos de serialização e procure locais para utilizar padrões de comunicação assíncrona.Avoid overly chatty APIs, think about serialization formats, and look for places to use asynchronous communication patterns.

  • Integridade dos dados.Data integrity. Com cada microsserviço responsável pela sua própria persistência de dados.With each microservice responsible for its own data persistence. Como resultado, a consistência dos dados pode ser um desafio.As a result, data consistency can be a challenge. Adote a consistência eventual sempre que possível.Embrace eventual consistency where possible.

  • Gestão.Management. O êxito dos microsserviços requer uma cultura DevOps madura.To be successful with microservices requires a mature DevOps culture. O registo correlacionado entre serviços pode ser um desafio.Correlated logging across services can be challenging. Normalmente, o registo tem de correlacionar várias chamadas de serviço para uma única operação de utilizador.Typically, logging must correlate multiple service calls for a single user operation.

  • Controlo de versões.Versioning. As atualizações de um serviço não podem interromper os serviços que dependem dele.Updates to a service must not break services that depend on it. Vários serviços poderiam ser atualizados num determinado momento pelo que, sem uma estrutura cuidadosa, poderia ter problemas de retrocompatibilidade ou compatibilidade com as versões seguintes.Multiple services could be updated at any given time, so without careful design, you might have problems with backward or forward compatibility.

  • Competências.Skillset. Os microsserviços são sistemas altamente distribuídos.Microservices are highly distributed systems. Avalie cuidadosamente se a equipa tem as competências e a experiência para o êxito.Carefully evaluate whether the team has the skills and experience to be successful.

Processo de criação de uma arquitetura de microsserviçosProcess for building a microservices architecture

Os artigos aqui listados apresentam uma abordagem estruturada que permite conceber, criar e operar uma arquitetura de microsserviços.The articles listed here present a structured approach for designing, building, and operating a microservices architecture.

Análise de domínios.Domain analysis. Para evitar algumas armadilhas comuns ao criar microsserviços, utilize a análise de domínios para definir os limites dos microsserviços.To avoid some common pitfalls when designing microservices, use domain analysis to define your microservice boundaries. Siga estes passos.Follow these steps:

  1. Utilizar a análise de domínios para modelar os microsserviços.Use domain analysis to model microservices.
  2. Utilizar o DDD tático para conceber microsserviços.Use tactical DDD to design microservices.
  3. Identificar os limites dos microsserviços.Identify microservice boundaries.

Conceber os serviços.Design the services. Os microsserviços requerem uma abordagem diferente no que respeita a conceção e criação de aplicações.Microservices require a different approach to designing and building applications. Para obter mais informações, veja Conceber uma arquitetura de microsserviços.For more information, see Designing a microservices architecture.

Operar na produção.Operate in production. Como as arquiteturas de microsserviços são distribuídas, as suas operações têm obrigatoriamente de ser robustas no que respeita a implementação e monitorização.Because microservices architectures are distributed, you must have robust operations for deployment and monitoring.

Arquiteturas de referência de microsserviços para o AzureMicroservices reference architectures for Azure