近年来,微服务架构已成为构建可扩展、灵活和可维护系统的流行选择。通过将应用程序划分为更小的独立服务,可以自主维护、测试和升级每个服务,从而促进可扩展性和新技术的融入。
在本文中,我们将探索使用 Go 和 NodeJS 创建微服务架构,这两种广泛使用的语言在这种情况下具有互补的特性。此外,我们将应用清洁架构的原则,这是一种旨在保持代码清洁、模块化且易于维护和测试的设计方法,确保业务逻辑与基础设施问题和/或依赖项隔离。
这个项目的目标是练习Go(我最近在学习的一门语言),并重新审视微服务的基本概念。同时,我们将在服务开发中使用 TypeScript,应用 Clean Architecture 的原则来强化良好的软件设计实践。
基于这些前提,我们将有机会探讨这种方法的优点和挑战。毕竟,并不是每个业务都需要如此复杂的结构,而实际的项目是了解其真正需求和影响的最佳方式。
微服务架构将应用程序划分为更小的、独立的服务,每个服务负责功能的特定部分。这些服务通过定义明确的 API 进行通信,这有利于维护、可扩展性和新技术的采用。
好处:
模块化:方便各个服务的维护和独立开发。
可扩展性:允许根据需求单独扩展每个服务。
弹性:隔离故障并减少一项服务中的问题对其他服务的影响。
与整体式架构的比较:
单体应用程序:集成到单个代码库中的应用程序。虽然最初很简单,但随着时间的推移,它们可能会变得难以维护和扩展。
微服务:它们提供了更大的灵活性和可扩展性,但可能会增加服务之间的管理和通信的复杂性。
在微服务架构中,服务之间的通信可以通过两种主要方式完成:异步通信(例如使用消息队列)和同步通信(通过 REST API)。值得强调的是,除了排队和休息之外,还有其他形式的沟通。
消息队列用于实现微服务之间的异步通信。它们允许服务发送和接收消息而无需立即响应,这有助于提高系统弹性和可扩展性。
消息队列的作用:
异步通信:促进服务之间的信息交换,无需即时响应。
弹性:管理负载峰值和临时故障,确保消息最终得到处理。
实施:
工具:RabbitMQ 和 Kafka 是管理消息队列的常用选项。
集成:实现Go和NodeJS编写的服务之间通信的消息队列,确保高效且可扩展的数据交换。
RESTful API 用于服务之间的同步通信。它们基于 HTTP 原则,允许服务以标准化、高效的方式交互。
清洁架构是一种设计方法,旨在创建具有易于维护和/或测试的组织良好的代码库的系统。它强调关注点分离和层独立性。
清洁架构原则:
层分离:将代码划分为不同的层(域、应用程序、基础设施),以将业务逻辑与技术问题隔离。
独立于框架和库:确保业务逻辑不依赖于特定的框架或技术。
微服务中的应用:
代码组织:按照清洁架构的原则构建每个微服务,以确保代码模块化、可测试且易于维护。
维护和演进:在不损害系统完整性的情况下促进新功能的添加和现有功能的修改。
在微服务生态系统中,HTTP 端点在编排文档工作流程中发挥着至关重要的作用,在这种情况下,它是一切的开始。该端点负责接收和处理创建新文档的请求。收到请求后,它将文档排队到 Go 工作线程,后者将负责生成和处理文档。此外,端点通过消息队列向文档服务发出通知,通知有新资源(即文档)已进入队列进行处理。这种方法确保了系统组件之间的高效集成,允许端点以协调和异步的方式管理文档的创建和跟踪,而 Go 工作线程则负责文档的实际创建,并且文档服务根据文档中的新项目进行更新。排队。
除了 HTTP 端点之外,系统还有两个具有不同角色的工作人员。第一个是用 Go 实现的,负责生成文档。它使用消息队列中的任务,处理数据,并在处理完成后通知特定端点已完成。 Go 的效率确保了快速、稳健的处理。第二个工作程序是用 NodeJS 开发的,负责处理文档初始状态的创建,将它们插入系统时将其定义为“未处理”。 NodeJS 的敏捷性允许从工作流程一开始就快速有效地管理文档状态。
总之,所描述的系统展示了一个协调良好的文档管理流程。 HTTP 端点与 Go 和 NodeJS Workers 一起提供了一个集成且高效的解决方案,保证文档处理从创建到完成。工作人员和 REST 之间的交互反映在下面的架构图中,该图说明了该架构如何促进可扩展性和模块化,从而确保稳健且协调的工作流程。这种方法不仅提高了运营效率,还可以适应不同的使用场景,提供灵活性和未来的增长。
最终图:
项目存储库:https://github.com/williamMDsilva/microservice-poc
使用清洁架构实现微服务架构可能会带来一些挑战。主要挑战之一是对业务的深入理解,以创建真正可扩展并保持业务逻辑完整性的代码。干净的架构要求以明确分离关注点的方式构建代码,这需要对该领域的详细了解才能有效地进行抽象和分离。
此外,SOLID 原则的知识也至关重要。这些原则有助于创建更具凝聚力、更少耦合的代码,并且对它们的深入理解可以节省大量的研究和故障排除时间。应用SOLID原则不仅可以提高代码质量,而且有利于系统维护和可扩展性。
就Go的具体情况而言,扎实的语言基础可以提高代码的可读性和可维护性。 Go 提供的工具和实践有助于保持代码整洁和高效,更深入的知识可以在实现复杂服务时发挥作用。
最后,使用好的样板是非常有益的。精心设计的清洁架构样板不仅可以加快开发速度,还可以确保在最初提出的标准中添加新功能。它们提供了一种有助于在整个项目中保持代码一致性和质量的结构。
为了推进和改进所描述的架构,建议采取一些后续步骤:
包括监控和可观察性资源:实施监控和可观察性工具对于确保系统健康和性能至关重要。纳入指标、日志和跟踪有助于识别问题并分析生产中的系统行为。
添加针对不可用的处理:添加处理故障和不可用的机制(例如重试、熔断器和回退策略)至关重要,以提高系统的弹性并保证服务的连续性。
执行单元和集成测试:测试对于确保代码质量和组件的正确集成至关重要。单元测试验证代码中独立部分的功能,而集成测试则确保系统的不同组件能够正确地协同工作。
重构服务和模块:审查和重构现有服务和模块以确保代码保持干净、可读并符合清洁架构原则是一项持续的任务,可以提高系统的可维护性和可扩展性。
Kafka 概念验证:考虑用 Kafka 替换 RabbitMQ 的概念验证可以深入了解不同工具如何影响项目。对服务设计和整体架构的影响分析可以为未来的技术决策提供有价值的见解。
该项目展示了精心规划的架构的有效性以及仔细实施清洁架构原则的重要性。 Go 和 NodeJS 的使用,结合 SOLID 等实践以及消息队列和 REST API 的使用,有助于构建一个强大且可扩展的系统。然而,开发和维护微服务架构带来了挑战,需要深入了解业务和技术。通过充分规划和采用良好实践来应对这些挑战有助于确保构建高效和可持续的系统。前进的道路包括整合持续改进,例如先进的监控和新的概念证明,以使架构与业务的需求和发展保持一致。
马丁,R.C. (2008)。干净的代码:实用的敏捷软件技能。阿尔塔图书。
马丁,R.C.(2017)。干净的架构:软件设计的框架和原则。阿尔塔图书。
RabbitMQ。 (日期不详)。教程二 - JavaScript。检索自 https://www.rabbitmq.com/tutorials/tutorial-two-javascript
RabbitMQ。 (日期不详)。教程二 - 取自 https://www.rabbitmq.com/tutorials/tutorial-two-go
由于该项目的学术和概念验证性质,某些功能尚未实现,并仍作为未来研究的技术债务。自动化测试、错误处理、资源流、服务身份验证和可观察性等领域仍然需要探索。欢迎和鼓励所有建设性的批评,因为它有助于不断改进和加深对这些重要领域的了解。
以上是[MICROSERVICES] 消息队列和 REST – 采用 Go、NodeJS 和 Clean 架构的方法的详细内容。更多信息请关注PHP中文网其他相关文章!