”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > [MICROSERVICES] 消息队列和 REST – 采用 Go、NodeJS 和 Clean 架构的方法

[MICROSERVICES] 消息队列和 REST – 采用 Go、NodeJS 和 Clean 架构的方法

发布于2024-11-03
浏览:367

Tabela de Conteúdos

  • 1. Um Breve Contexto
  • 2. Tecnologias e Arquitetura Geral
  • 2.1. Arquitetura de Microservices
  • 2.2. Comunicação entre Microservices
  • 2.2.1. Message Queues (Comunicação Assíncrona)
  • 2.2.2. APIs REST (Comunicação Síncrona)
  • 2.3. Clean Architecture
  • 3. O Ecosistema do Projeto
  • 4. Desafios e Considerações Finais
  • 4.1. Desafios na Implementação
  • 4.2. Próximos Passos
  • 4.3. Conclusão
  • 5. Referências
  • 6. Disclaimer

1. Um breve contexto

Nos últimos anos, a arquitetura de microserviços tem se tornado uma escolha popular para construir sistemas escaláveis, flexíveis e de fácil manutenção. Ao dividir uma aplicação em serviços menores e independentes, é possível manter, testar e subir cada serviço de forma autônoma, facilitando a escalabilidade e a inclusão de novas tecnologias.

Neste artigo, exploraremos a criação de uma arquitetura de microserviços utilizando Go e NodeJS, duas linguagens amplamente usadas e, neste contexto, com características complementares. Além disso, aplicaremos os princípios da Clean Architecture, uma abordagem de design que visa manter o código limpo, modular e fácil de manter, e testar, garantindo que a lógica de negócio esteja isolada das preocupações de infraestrutura e/ou dependências.

O objetivo deste projeto é praticar Go, uma linguagem que tenho estudado recentemente, e revisitar conceitos fundamentais de microserviços. Paralelamente, utilizaremos TypeScript no desenvolvimento dos serviços, aplicando os princípios da Clean Architecture para reforçar boas práticas de design de software.

A partir dessas premissas, teremos a oportunidade de explorar tanto os pontos positivos quanto os desafios dessa abordagem. Afinal, nem todo negócio exige uma estrutura tão complexa, e um projeto prático é a melhor forma de entender suas reais necessidades e implicações.

2. Tecnologias e Arquitetura Geral

2.1 Arquitetura de Microservices

A arquitetura de microservices divide uma aplicação em serviços menores e independentes, cada um responsável por uma parte específica da funcionalidade. Esses serviços se comunicam por meio de APIs bem definidas, o que facilita a manutenção, escalabilidade e adoção de novas tecnologias.

Benefícios:

Modularidade: Facilita a manutenção e o desenvolvimento independente de cada serviço.
Escalabilidade: Permite a escalabilidade individual de cada serviço conforme a demanda.
Resiliência: Isola falhas e reduz o impacto de problemas em um serviço sobre outros.
Comparação com Monolitos:

Monolitos: Aplicações integradas em uma unica code base. Embora simples inicialmente, podem se tornar difíceis de manter e escalar com o tempo.

Microservices: Oferecem maior flexibilidade e escalabilidade, mas podem criar um complexidade adicional na gestão e comunicação entre serviços.

2.2 Comunicação entre Microservices

Em uma arquitetura de microservices, a comunicação entre serviços pode ser feita de duas formas principais: comunicação assíncrona, usando message queues por exemplos e comunicação síncrona, através de APIs REST. Vale destacar que existem outra forma de comunição além de queue e rest.

2.2.1 Message Queues (Comunicação Assíncrona)

As filas de mensagens são usadas para permitir a comunicação assíncrona entre microservices. Elas permitem que serviços enviem e recebam mensagens sem precisar de uma resposta imediata, o que ajuda a melhorar a resiliência e a escalabilidade do sistema.

Papel das Filas de Mensagens:

Comunicação Assíncrona: Facilita a troca de informações entre serviços sem necessidade de resposta instantânea.
Resiliência: Gerencia picos de carga e falhas temporárias, garantindo que mensagens sejam processadas eventualmente.

Implementação:

Ferramentas: RabbitMQ e Kafka são opções populares para gerenciar filas de mensagens.
Integração: Implementar filas de mensagens para comunicação entre serviços escritos em Go e NodeJS, garantindo uma troca de dados eficiente e escalável.

2.2.2 APIs REST (Comunicação Síncrona)

APIs RESTful são usadas para comunicação síncrona entre serviços. Elas são baseadas em princípios HTTP e permitem que serviços interajam de maneira padronizada e eficiente.

2.3 Clean Architecture

Clean Architecture é uma abordagem de design que visa criar sistemas com um código base bem organizado e fácil de manter e/ou testar. Ela enfatiza a separação de preocupações e a independência de camadas.

Princípios da Clean Architecture:

Separação de Camadas: Dividir o código em camadas distintas (domínio, aplicação, infraestrutura) para isolar a lógica de negócio das preocupações técnicas.
Independência de Frameworks e Bibliotecas: Garantir que a lógica de negócio não seja dependente de frameworks ou tecnologias específicas.
Aplicação em Microservices:

Organização do Código: Estruturar cada microservice seguindo os princípios da Clean Architecture para garantir um código modular, testável e fácil de manter.
Manutenção e Evolução: Facilitar a adição de novas funcionalidades e a modificação de existentes sem comprometer a integridade do sistema.

3. O ecosistema do projeto

No ecossistema de microservices, um endpoint HTTP desempenha um papel crucial na orquestração do fluxo de trabalho dos documentos, neste context, é onde tudo começa. Este endpoint é responsável por receber e processar a solicitação para criar um novo documento. Ao receber uma requisição, ele enfileira o documento para o worker em Go, que se encarregará da geração e processamento do documento. Além disso, o endpoint emite uma notificação para o serviço de documentos por meio de uma Message Queue, informando que um novo recurso, ou seja, um documento, entrou na fila para processamento. Esta abordagem assegura uma integração eficiente entre os componentes do sistema, permitindo que o endpoint gerencie a criação e o rastreamento dos documentos de forma coordenada e assíncrona, enquanto o worker em Go cuida da criação efetiva dos documentos e o serviço de documentos é atualizado sobre novos itens na fila.

Além do endpoint HTTP, o sistema conta com dois workers com papéis distintos. O primeiro, implementado em Go, é responsável pela geração dos documentos. Ele consome tarefas de uma fila de mensagens, processa os dados e, ao concluir o processamento, notifica um endpoint específico sobre a conclusão. A eficiência do Go garante um processamento rápido e robusto. O segundo worker, desenvolvido em NodeJS, lida com a criação do estado inicial dos documentos, definindo-os como "não processado" ao serem inseridos no sistema. A agilidade do NodeJS permite uma gestão rápida e eficiente dos estados dos documentos desde o início do fluxo de trabalho.

Em resumo, o sistema descrito demonstra um fluxo bem coordenado para o gerenciamento de documentos. O endpoint HTTP, em conjunto com os workers em Go e NodeJS, proporciona uma solução integrada e eficiente, garantindo desde a criação até a conclusão do processamento dos documentos. A interação entre os workers e o REST, é refletida na imagem da arquitetura abaixo, que ilustra como a arquitetura promove escalabilidade e modularidade, assegurando um fluxo de trabalho robusto e coordenado. Esta abordagem não só melhora a eficiência operacional, mas também pode ser adaptada para diferentes cenários de uso, oferecendo flexibilidade e crescimento futuro.

O desenho final:

[MICROSERVICES] Message Queues e REST – Uma Abordagem com Go, NodeJS e Clean Architecture

O repositorio do projeto: https://github.com/williamMDsilva/microservice-poc

4. Desafios e Considerações Finais

4.1 Desafios na Implementação

Implementar uma arquitetura de microservices com a Clean Architecture pode apresentar diversos desafios. Um dos principais desafios é o entendimento profundo do negócio para criar um código que seja verdadeiramente escalável e mantenha a integridade da lógica de negócio. A Clean Architecture exige que o código seja estruturado de forma a separar claramente as preocupações, o que demanda um conhecimento detalhado do domínio para que as abstrações e separações sejam efetivas.

Além disso, o conhecimento dos princípios SOLID é crucial. Estes princípios ajudam a criar um código mais coeso e menos acoplado, e um entendimento sólido deles pode economizar tempo significativo na pesquisa e resolução de problemas. A aplicação dos princípios SOLID não apenas melhora a qualidade do código, mas também facilita a manutenção e a escalabilidade do sistema.

No caso específico do Go, uma base sólida na linguagem pode melhorar a legibilidade e a manutenção do código. Go oferece ferramentas e práticas que ajudam a manter o código limpo e eficiente, e um conhecimento mais profundo pode fazer a diferença na implementação de serviços complexos.

Por fim, o uso de um bom boilerplate pode ser extremamente benéfico. Boilerplates bem projetados para a Clean Architecture não apenas aceleram o início do desenvolvimento, mas também garantem que novos recursos sejam adicionados dentro do padrão proposto inicialmente. Eles oferecem uma estrutura que ajuda a manter a consistência e a qualidade do código ao longo do projeto.

4.2 Próximos Passos

Para avançar e melhorar a arquitetura descrita, alguns próximos passos são recomendados:

  1. Incluir Recursos de Monitoramento e Observabilidade: Implementar ferramentas de monitoramento e observabilidade é essencial para garantir a saúde e o desempenho do sistema. A inclusão de métricas, logs e tracing ajuda a identificar problemas e a analisar o comportamento do sistema em produção.

  2. Adicionar Tratativas para Indisponibilidade: É crucial incluir mecanismos para lidar com falhas e indisponibilidades, como retries, circuit breakers e fallback strategies, para aumentar a resiliência do sistema e garantir a continuidade dos serviços.

  3. Realizar Testes Unitários e de Integração: Testes são fundamentais para garantir a qualidade do código e a integração correta dos componentes. Testes unitários verificam o funcionamento de partes isoladas do código, enquanto testes de integração asseguram que os diferentes componentes do sistema funcionam corretamente em conjunto.

  4. Refatorar Serviços e Módulos: Revisar e refatorar serviços e módulos existentes para garantir que o código permaneça limpo, legível e alinhado com os princípios da Clean Architecture é uma tarefa contínua que melhora a manutenabilidade e a escalabilidade do sistema.

  5. Prova de Conceito com Kafka: Considerar uma prova de conceito para substituir o RabbitMQ por Kafka pode oferecer uma visão sobre como diferentes ferramentas impactam o projeto. A análise do impacto no design do serviço e na arquitetura geral pode fornecer insights valiosos para futuras decisões tecnológicas.

4.3 Conclusão

Este projeto demonstrou a eficácia de uma arquitetura bem planejada e a importância de uma implementação cuidadosa dos princípios da Clean Architecture. O uso de Go e NodeJS, combinado com práticas como SOLID e o emprego de message queues e APIs REST, contribuiu para um sistema robusto e escalável. No entanto, o desenvolvimento e a manutenção de uma arquitetura de microservices apresentam desafios que exigem um conhecimento profundo do negócio e da tecnologia. Enfrentar esses desafios com um planejamento adequado e a adoção de boas práticas ajuda a garantir a construção de sistemas eficientes e sustentáveis. O caminho adiante envolve a incorporação de melhorias contínuas, como monitoramento avançado e novas provas de conceito, para manter a arquitetura alinhada com as necessidades e evolução do negócio.

5. Referências

Martin, R. C. (2008). Código Limpo: Habilidades Práticas do Agile Software. Alta Books.

Martin, R. C. (2017). Arquitetura Limpa: Estruturas e Princípios para o Design de Software. Alta Books.

RabbitMQ. (n.d.). Tutorial Two - JavaScript. Retrieved from https://www.rabbitmq.com/tutorials/tutorial-two-javascript

RabbitMQ. (n.d.). Tutorial Two - Go. Retrieved from https://www.rabbitmq.com/tutorials/tutorial-two-go

Disclaimer

Devido à natureza acadêmica e de prova de conceito deste projeto, alguns recursos não foram implementados e permanecem como débitos técnicos para futuros estudos. Áreas como testes automatizados, tratamento de erros, stream de recursos, autenticação nos serviços e observabilidade são temas que ainda precisam ser explorados. Toda crítica construtiva é bem-vinda e encorajada, pois contribui para a melhoria contínua e o aprofundamento no conhecimento dessas áreas importantes.

版本声明 本文转载于:https://dev.to/williammdsilva/microservices-message-queues-e-rest-uma-abordagem-com-go-nodejs-e-clean-architecture-l4b?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-04-16
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-04-16
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-16
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-16
  • Python中何时用"try"而非"if"检测变量值?
    Python中何时用"try"而非"if"检测变量值?
    使用“ try“ vs.” if”来测试python 在python中的变量值,在某些情况下,您可能需要在处理之前检查变量是否具有值。在使用“如果”或“ try”构建体之间决定。“ if” constructs result = function() 如果结果: 对于结果: ...
    编程 发布于2025-04-16
  • Java开发者如何保护数据库凭证免受反编译?
    Java开发者如何保护数据库凭证免受反编译?
    在java 在单独的配置文件保护数据库凭证的最有效方法中存储凭据是将它们存储在单独的配置文件中。该文件可以在运行时加载,从而使登录数据从编译的二进制文件中远离。使用prevereness class import java.util.prefs.preferences; 公共类示例{ 首选项...
    编程 发布于2025-04-16
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-16
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-04-16
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-16
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-04-16
  • C++标准中`bool`数据类型的大小是多少?
    C++标准中`bool`数据类型的大小是多少?
    的大小,基本数据类型bool代表真实值。在处理存储优化和内存管理时,此数据类型的大小成为至关重要的考虑。但是,C标准是否在任何情况下都明确指定了布尔的大小? sizeof(bool)的实现性质(bool)标准说明 对程序员 的实现定义的Bool size size size的潜在挑战对程序员的潜在...
    编程 发布于2025-04-16
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-04-16
  • 使用margin-inline-start提升网页设计中RTL支持
    使用margin-inline-start提升网页设计中RTL支持
    [2 在设计网站时,迎合从左到右(LTR)和左右(RTL)语言对全球受众至关重要。尽管大多数开发人员都熟悉使用边缘左和边缘权利进行布局调整,但这些属性在文本方向变化的环境中却缺乏。输入Margin-Inline start及其逻辑对应物 - 现代CSS属性,使得为多语言和双向内容设计设计。 在本文中...
    编程 发布于2025-04-16
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-04-16
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-04-16

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3