Estruturar, criar e utilizar microsserviços no AzureDesigning, building, and operating microservices on Azure

Diagrama de um serviço de entrega por drone

Os microsserviços tornaram-se um estilo de arquitetura popular para criar aplicações na cloud resilientes, de elevada dimensionabilidade, implementáveis independentemente e capazes de evoluir rapidamente.Microservices have become a popular architectural style for building cloud applications that are resilient, highly scalable, independently deployable, and able to evolve quickly. Contudo, os microsserviços, para que sejam mais do que apenas a palavra da moda, requerem uma abordagem diferente no que respeita a estruturação e criação de aplicações.To be more than just a buzzword, however, microservices require a different approach to designing and building applications.

Neste conjunto de artigos, vamos explorar como pode criar e executar uma arquitetura de microsserviços no Azure.In this set of articles, we explore how to build and run a microservices architecture on Azure. Os tópicos incluem:Topics include:

  • Utilizar a Estruturação com Base em Domínio (DDD, Domain Driven Design) para estruturar uma arquitetura de microsserviços.Using Domain Driven Design (DDD) to design a microservices architecture.
  • Escolher as tecnologias do Azure mais adequadas para computação, armazenamento, mensagens e outros elementos da estruturação.Choosing the right Azure technologies for compute, storage, messaging, and other elements of the design.
  • Compreender os padrões de estruturação dos microsserviços.Understanding microservices design patterns.
  • Estruturar para garantir a resiliência, a escalabilidade e o desempenho.Designing for resiliency, scalability, and performance.
  • Criar um pipeline CI/CD.Building a CI/CD pipeline.

Ao longo deste percurso, vamos centrar a nossa atenção num cenário ponto a ponto: um serviço de entrega por drone que permite aos clientes agendar a entrega e recolha de encomendas através de drones.Throughout, we focus on an end-to-end scenario: A drone delivery service that lets customers schedule packages to be picked up and delivered via drone. Pode encontrar o código da nossa implementação de referência no GitHubYou can find the code for our reference implementation on GitHub

GitHub Implementação de referênciaGitHub Reference implementation

No entanto, comecemos por esclarecer as noções básicas.But first, let's start with fundamentals. O que são microsserviços e quais as vantagens de adotar uma arquitetura de microsserviços?What are microservices, and what are the advantages of adopting a microservices architecture?

Porquê criar microsserviços?Why build microservices?

Numa arquitetura de microsserviços, a aplicação é composta por pequenos serviços independentes.In a microservices architecture, the application is composed of small, independent services. Estas são algumas das características específicas dos microsserviços:Here are some of the defining characteristics of microservices:

  • Cada microsserviço implementa uma única capacidade empresarial.Each microservice implements a single business capability.
  • Um microsserviço é pequeno ao ponto de uma única pequena equipa de programadores conseguir escrevê-lo e tratar da sua manutenção.A microservice is small enough that a single small team of developers can write and maintain it.
  • Os microsserviços são executados em processos separados e comunicam através de APIs ou padrões de mensagens bem definidos.Microservices run in separate processes, communicating through well-defined APIs or messaging patterns.
  • Os microsserviços não partilham arquivos de dados nem esquemas de dados.Microservices do not share data stores or data schemas. Cada microsserviço é responsável pela gestão dos seus próprios dados.Each microservice is responsible for managing its own data.
  • Os microsserviços têm bases de código separadas e não partilham o código fonte.Microservices have separate code bases, and do not share source code. Contudo, poderão utilizar bibliotecas de utilitário comuns.They may use common utility libraries, however.
  • Cada microsserviço pode ser implementado e atualizado de forma independente de outros serviços.Each microservice can be deployed and updated independently of other services.

Utilizados corretamente, os microsserviços podem garantir vários benefícios úteis:Done correctly, microservices can provide a number of useful benefits:

  • 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 é detetado um erro numa parte da aplicação, todo o processo de lançamento pode ser bloqueado. Por conseguinte, o lançamento de novas funcionalidades pode ser adiado até que uma correção de erro seja integrada, testada e publicada.In many traditional applications, if a bug is found in one part of the application, it can block the entire release process; as a result, new features may be held up waiting for a bug fix to be integrated, tested, and published.

  • Código pequeno, equipas pequenas.Small code, small 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 bases de código pequenas são mais fáceis de compreender.Small code bases are easier to understand. Numa aplicação monolítica de grandes dimensões, há a tendência de, ao longo do tempo, as dependências de código ficarem emaranhadas umas nas outras, o que torna necessário mexer em código em diferentes locais apenas para adicionar uma nova funcionalidade.In a large monolithic application, there is a tendency over time for code dependencies to become tangled, so that 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. Além disso, equipas mais pequenas promovem uma maior agilidade.Small team sizes also promote greater agility. A "regra das duas pizzas" define que uma equipa deve ser pequena o suficiente para que duas pizzas cheguem para alimentar toda a equipa.The "two-pizza rule" says that a team should be small enough that two pizzas can feed the team. Como é óbvio, não se trata de uma métrica exata e depende do apetite dos membros da equipa!Obviously that's not an exact metric and depends on team appetites! Porém, o que interessa reter é que as equipas grandes tendem a ser menos produtivas, porque a comunicação é mais demorada, a despesa de gestão aumenta e a agilidade diminui.But the point is that large groups tend be less productive, because communication is slower, management overhead goes up, and agility diminishes.

  • 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.

  • Resiliência.Resiliency. 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. Uma arquitetura de microsserviços permite o dimensionamento de cada microsserviço de forma independente dos outros.A microservices architecture allows each microservice to be scaled independently of the others. Desta forma, pode aumentar horizontalmente subsistemas que necessitem de mais recursos, sem aumentar horizontalmente toda a aplicação.That lets you scale out subsystems that require more resources, without scaling out the entire application. Se implementar serviços dentro de contentores, também pode incluir uma maior densidade de microsserviços num anfitrião único, o que permite uma utilização mais eficiente dos recursos.If you deploy services inside containers, you can also pack a higher density of microservices 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 impacted. 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.

Nada na vida é de graçaNo free lunch

Estes benefícios não são gratuitos.These benefits don't come for free. Esta série de artigos destina-se a abordar alguns dos desafios inerentes à criação de microsserviços resilientes, dimensionáveis e fáceis de gerir.This series of articles is designed to address some of the challenges of building microservices that are resilient, scalable, and manageable.

  • Limites dos serviços.Service boundaries. Quando cria microsserviços, tem de considerar atentamente onde deve traçar os limites entre os serviços.When you build microservices, you need to think carefully about where to draw the boundaries between services. Depois de criar e implementar os serviços na produção, poderá ser difícil refatorizar para lá desses limites.Once services are built and deployed in production, it can be hard to refactor across those boundaries. Escolher os limites certos para um serviço é um dos maiores desafios que terá de enfrentar ao estruturar uma arquitetura de microsserviços.Choosing the right service boundaries is one of the biggest challenges when designing a microservices architecture. Que dimensão deve ter cada serviço?How big should each service be? Quando deve a funcionalidade ser distribuída por vários serviços e quando deve ser mantida dentro do mesmo serviço?When should functionality be factored across several services, and when should it be kept inside the same service? Neste guia, descrevemos uma abordagem que utiliza a estruturação com base em domínio para encontrar os limites dos serviços.In this guide, we describe an approach that uses domain-driven design to find service boundaries. Começa pela Análise do domínio para encontrar os contextos limitados e, em seguida, aplica um conjunto de padrões DDD táticos com base em requisitos funcionais e não funcionais.It starts with Domain analysis to find the bounded contexts, then applies a set of tactical DDD patterns based on functional and non-functional requirements.

  • Consistência e integridade dos dados.Data consistency and integrity. Um princípio básico dos microsserviços é o facto de cada serviço gerir os seus próprios dados.A basic principle of microservices is that each service manages its own data. Desta forma, os serviços mantêm-se desacoplados, mas podem surgir obstáculos face à integridade ou redundância dos dados.This keeps services decoupled, but can lead to challenges with data integrity or redundancy. Vamos aprofundar alguns destes problemas nas Considerações sobre dados.We explore some of these issues in the Data considerations.

  • 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 e uma latência ponto a ponto mais longa.The use of many small, granular services can result in more interservice communication and longer end-to-end latency. O capítulo Comunicação entre serviços descreve as considerações sobre a troca de mensagens entre serviços.The chapter Interservice communication describes considerations for messaging between services. Tanto a comunicação síncrona como a assíncrona desempenham um papel nas arquiteturas de microsserviços.Both synchronous and asynchronous communication have a place in microservices architectures. É importante apostar na correta estruturação de API, para que os serviços fiquem apenas interligados até certo ponto, podendo ser implementados e atualizados de forma independente.Good API design is important so that services remain loosely coupled, and can be independently deployed and updated.

  • Complexidade.Complexity. Uma aplicação de microsserviços tem mais partes amovíveis.A microservices application has more moving parts. Em si, cada serviço pode ser simples, mas os serviços têm de funcionar em conjunto como um todo.Each service may be simple, but the services have to work together as a whole. Uma única operação realizada por um utilizador pode envolver vários serviços.A single user operation may involve multiple services. No capítulo Ingestão e fluxo de trabalho, examinamos alguns dos problemas relacionados com a ingestão de pedidos num débito elevado, a coordenação de um fluxo de trabalho e o processamento de falhas.In the chapter Ingestion and workflow, we examine some of the issues around ingesting requests at high throughput, coordinating a workflow, and handling failures.

  • Comunicação entre clientes e a aplicação.Communication between clients and the application. Quando decompõe uma aplicação em vários serviços pequenos, como devem os clientes comunicar com esses serviços?When you decompose an application into many small services, how should clients communicate with those services? O cliente deve chamar cada serviço individual diretamente ou deve encaminhar os pedidos através de um Gateway de API?Should a client call each individual service directly, or route requests through an API Gateway?

  • Monitorização.Monitoring. Monitorizar uma aplicação distribuída pode ser muito mais difícil do que monitorizar uma aplicação monolítica, porque tem de correlacionar a telemetria de vários serviços.Monitoring a distributed application can be a lot harder than a monolithic application, because you must correlate telemetry from multiple services. O capítulo Registo e monitorização aborda estas questões.The chapter Logging and monitoring addresses these concerns.

  • Integração e entrega contínuas (CI/CD).Continuous integration and delivery (CI/CD). Um dos principais objetivos a que os microsserviços se propõem é a agilidade.One of the main goals of microservices is agility. Para atingir esse objetivo, tem de ter CI/CD automática e robusta, que lhe permita implementar serviços individuais em ambientes de teste e produção de forma célere e fiável.To achieve this, you must have automated and robust CI/CD, so that you can quickly and reliably deploy individual services into test and production environments.

A aplicação Entrega por DroneThe Drone Delivery application

Para aprofundar estes problemas, bem como para ilustrar algumas das melhores práticas de uma arquitetura de microsserviços, criámos uma implementação de referência à qual chamamos aplicação de Entrega por Drone.To explore these issues, and to illustrate some of the best practices for a microservices architecture, we created a reference implementation that we call the Drone Delivery application. Pode encontrar a implementação de referência no GitHub.You can find the reference implementation on GitHub.

A Fabrikam, Inc. está a começar um serviço de entrega por drone.Fabrikam, Inc. is starting a drone delivery service. A empresa gere uma frota de drones aéreos.The company manages a fleet of drone aircraft. As empresas registam-se nos serviços e os utilizadores podem requisitar um drone que venha recolher os bens para entrega.Businesses register with the service, and users can request a drone to pick up goods for delivery. Quando um cliente agenda uma recolha, um sistema de back-end atribui um drone e notifica o utilizador do tempo de entrega estimado (ETA).When a customer schedules a pickup, a backend system assigns a drone and notifies the user with an estimated delivery time. Quando a entrega está em curso, o cliente pode controlar a localização do drone com um ETA atualizado de forma contínua.While the delivery is in progress, the customer can track the location of the drone, with a continuously updated ETA.

Este cenário implica um domínio consideravelmente complicado.This scenario involves a fairly complicated domain. Algumas das preocupações das empresas incluem o agendamento de drones, o controlo de encomendas, a gestão de contas de utilizador e o armazenamento e a análise de dados históricos.Some of the business concerns include scheduling drones, tracking packages, managing user accounts, and storing and analyzing historical data. Além disso, a Fabrikam quer chegar ao mercado sem perder tempo para, em seguida, iterar rapidamente, adicionando novas funcionalidades e capacidades.Moreover, Fabrikam wants to get to market quickly and then iterate quickly, adding new functionality and capabilities. A aplicação tem de operar à escala da cloud, com um objetivo de nível de serviço (SLO) elevado.The application needs to operate at cloud scale, with a high service level objective (SLO). A Fabrikam também espera que as diferentes partes do sistema tenham requisitos muito diferentes no que respeita o armazenamento e a consulta de dados.Fabrikam also expects that different parts of the system will have very different requirements for data storage and querying. Todas estas considerações levaram a Fabrikam a optar por uma arquitetura de microsserviços para a aplicação de Entrega por Drone.All of these considerations lead Fabrikam to choose a microservices architecture for the Drone Delivery application.

Nota

Para obter ajuda para escolher entre uma arquitetura de microsserviços e outros estilos de arquitetura, veja o Guia de Arquitetura de Aplicações do Azure.For help in choosing between a microservices architecture and other architectural styles, see the Azure Application Architecture Guide.

A nossa implementação de referência utiliza o Kubernetes com o Azure Kubernetes Service (AKS).Our reference implementation uses Kubernetes with Azure Kubernetes Service (AKS). No entanto, muitas das decisões e dos desafios de arquitetura de alto nível serão aplicados a qualquer orquestrador de contentor, incluindo o Azure Service Fabric.However, many of the high-level architectural decisions and challenges will apply to any container orchestrator, including Azure Service Fabric.