微服务是一种软件架构策略,有利于改善整体性能和可扩展性。你可能会想,我的团队需不需要采用微服务,设计微服务架构有哪些原则?本文会给你一些灵感。
文章速览:
微服务是一种软件架构策略,将应用程序分解为一组解耦的、自治的服务。 这些独立的应用服务通过API相互通信。每个服务都由其专业领域的专家团队管理,以便每个软件开发团队可以控制自己的开发周期,按照自己的时间表进行测试和部署,使用自己的企业工具和资源,加速上线时间。为了评估你的团队是否需要采用微服务架构。这里有一些值得深入讨论的细节。
设计微服务架构的第一步是形势评估。 开发者网站(Developer.com)总结的十大微服务设计原则之一是单一责任原则,即每个服务只需要将其所有资源投入到微服务应用程序的一个功能中。
1.通过领域驱动设计实施微服务
软件架构师需要进行领域分析,以确定如何划分每个服务以及需要将哪些元素纳入应用堆栈中。这种领域分析被称为领域驱动设计(Domain Driven Design, DDD)。它将实体模式和聚合模式等模式应用到单个限界上下文(bounded context) 中,以便以更高的计算精度来识别单个域的边界。
总之,应该围绕特定的业务功能构建每个微服务。一旦确定了领域并了解了它们的边界,就可以定义最适合应用堆栈的变量了。
2.选择技术栈
创建微服务技术栈较为特别。通常你需要使用各种工具、框架和编程语言,将它们整合成一个耦合的系统。 在选择工具时考虑以下变量:
1) 编程语言
选择用于微服务的最佳编程语言,取决于你最熟悉哪种语言、可用于所需功能的库以及每种语言提供的功能套件。 显然,选择你的开发团队已经大范围使用的语言可以节省时间和精力。
根据2021年JetBrains关于微服务的调查,“用于微服务开发的三种最流行的语言是Java(41%)、JavaScript(37%)和Python(25%)”。这些流行的编程语言都有大量的在线开发者支持、成功应用开发的示例、运行环境,比如Node.JS,以及丰富的客户端库。
**总之,确保所选的语言适合当前业务问题。**例如,Python在数据分析中很受欢迎,而JavaScript是全栈开发的最优选择。
2) 数据库
在为微服务架构构建的应用程序选择适合的数据库时,应将可伸缩性、可用性和安全性置于首要位置。选择一个最能支持你在微服务中计划使用的数据模型的数据库。你的技术栈应该能够处理任何应用负载,确保使用故障切换协议可用性,并保护应用免受恶意攻击。
3)通信
你的业务功能可能需要您的微服务使用同步的服务间通信方法执行某些操作,对于其他操作,可能需要使用异步通信。可以使用多种通信格式和协议来辅助微服务通信,包括HTTP/REST、gRPC和AMQP。
对于异步通信,使用支持消费者组的事件驱动消息代理可以提高可伸缩性和可靠性,确保应用程序能够扩展,而不会导致任何服务无法访问的情况。
4)监控
每个微服务团队都负责监视应用程序性能,通常使用日志记录和可观察性工具来跟踪操作。这使得开发人员和运维人员可以跟踪整个系统,如应用程序性能、消息代理流与数据库资源利用率。
在使用消息代理时,考虑使用一个日志流,其中每个微服务都可以发布消息。这样,您可以将首选的日志记录和可观察性工具连接到流,并在不减慢应用程序的情况下异步监视您的应用程序。
那么,如何确保你的微服务架构可以发挥最佳作用?以下是五个微服务应用程序设计原则,可供你参考。
1.低耦合和高内聚
低耦合和高内聚可以通过前面提到的单一责任原则来解释。赋予每个领域团队单一的职责,有助于加强该领域内的内聚,使得该服务内的所有功能都在某种程度上紧密耦合。每个服务都由其自己的领域专家和工具管理,但仍然可以通过API和其他协议相互通信。这有点像来自不同部门的同事如何互动:当有助于完成工作时,大家彼此分享信息,而不会过多地谈论与他人无关的细节。
2.适应性
业务应用程序很少是静止不变的。随着新的业务需求的出现,行业的假设发生变化,技术能力提供更多功能,软件也会发生变化。微服务应该具有可适应性,以满足新需求出现时可以进行适应。世界在变化,人们在变化,所以软件也应该变化。
3.基础设施自动化
实现微服务的一个原因是它们能够自动化流程,从而提高整体可扩展性。借助 Kubernetes 等容器编排系统,您可以使用单个镜像与微服务一起部署微服务的整个数据库。在Kubernetes控制器的帮助下,这些可移植性优势可以帮助DevOps团队管理、调度和编排自动容器部署。
4.离散边界
实施微服务要求在任何给定应用程序中的服务都要维护自己的分散数据。服务边界应该将与任何单个服务相关的所有逻辑和数据与应用程序中的其他服务隔离开。
这也是允许容器化微服务进行独立部署的逻辑。这个原则也有一些反对者,他们认为这会导致数据冗余激增。但建立这些明确的边界最大的好处之一是:当一个微服务承载自己的数据时,任何奇怪的行为都被限制在微服务内部。
5.为故障而设计
干扰是经常发生的,应用服务会在毫无征兆的情况下瘫痪。例如,挖掘机开挖光缆中断网络操作,人们会忘记续订域名,系统会因防火墙故障引起的数据连接问题而中断等。所以,需要尽力考虑潜在的故障的可实施对策。设计具有弹性的解决方案,比如使用断路器模式,以防止当某个微服务无法执行给定操作时其他服务中断。