14 个必须了解的微服务设计原则

news2024/11/25 5:00:48

想象一下,一个机场有各种各样的业务,每个部门都是一个精心设计的微服务,专门用于预订、值机和行李处理等特定操作。机场架构必须遵循这个精心设计的架构的基本设计原则,反映微服务的原则。

例如,航空公司独立运营,但通过标准化协议无缝交互,类似于微服务的设计方式,即高内聚与松散耦合相结合。正如每个航班都有唯一标识一样,微服务也通过其端点或服务名称来区分。同样,其他设计原则也在微服务和精心策划的机场中实施,以实现高效工作。
遵循微服务设计原则有助于提高大型和小型组织的灵活性、性能和成本效益,同时实现持续测试和提前交付。

在我们的最新博客中,您可以探索单体架构与微服务的争论,以揭示两种架构之间的优点、缺点和主要区别,并明智地做出选择!

微服务架构的优势

对于单体架构,开发人员经常面临可重用性和可扩展性受限的挑战。但是,通过微服务设计,这个单一单元可以分解为不同的模块,从而简化开发、部署和维护。那么,让我们来看看微服务架构的一些显著优势。

  • 技术灵活性:虽然单片架构总是让开发人员寻找“适合工作的工具”,但微服务架构却提供了多种技术的共存。不同的解耦服务可以用各种编程语言编写。这使开发人员能够通过无缝集成附加特性和功能来试验和扩展他们的产品。
  • 提高效率:微服务架构加快了整个开发过程。与单个单元不同,团队可以同时处理多个软件系统组件。除了提高生产力之外,这还可以更轻松地定位和关注特定组件。单个组件的故障不会影响整个系统。相反,这也简化了错误定位和维护。
  • 产品,而非项目:根据 Martin Fowler 的说法,微服务架构可帮助企业创建“产品而非项目”。简而言之,微服务架构允许团队聚集在一起,为业务创建功能,而不是简单的代码。如果适用,这些功能可以进一步用于不同的业务线。此外,它还组建了一个自主的跨职能团队。
  • 提高可扩展性:微服务架构通过为每个服务分配专用资源并防止在流量高峰期间整个系统过载,提供了显著的可扩展性优势。
  • 更好的故障隔离:在微服务架构中,由于每个微服务独立运行,因此一个服务故障对其他应用程序组件产生不利影响的可能性被最小化。
  • 更好的数据安全性和合规性:通过将每项服务分配给特定任务,在服务级别实施安全措施比整个应用程序可访问的单片数据库更易于管理。使用安全 API 连接微服务还有助于确保只有授权的应用程序、用户和服务器才能访问数据。

了解微服务设计模式如何帮助您优化应用程序,实现最佳性能、顺利扩展、保持弹性并与其他系统无缝集成。

微服务设计原则

我们知道微服务架构的优点,但如何才能做到完美?我们是否了解微服务的设计原则?设计微服务架构的最佳实践是什么?

让我们回答这些问题,并了解开发成功的微服务应用程序所使用的一些基本微服务设计原则。这将使我们能够在微服务测试期间克服复杂性,并帮助我们获得最佳结果。

准备好掌握构建微服务的基本原理了吗?不要错过!观看成功的微服务设计基础知识,以提升您的微服务架构。

单一职责原则

单一职责原则 (SRP) 规定,一个类或模块应该只有一个主要职责,并且修改只应出于与该特定职责相关的原因进行。这一原则在微服务架构中至关重要,因为每个微服务都应与特定的业务能力保持一致,确保职责明确且单一。

在微服务中,每项服务都必须处理不同的功能或业务领域。通过遵守单一职责原则,开发人员可以设计具有单一、明确用途的模块,使其更易于理解、维护和扩展。此原则有助于防止在单个微服务中包含多项不相关的职责,从而促进模块化和独立性。

当微服务遵循单一职责原则时,它将更能适应与其特定职责相关的变化,而不会影响其他系统部分。这种隔离允许每个微服务独立开发、部署和扩展,从而有助于提高基于微服务的应用程序的整体灵活性和可维护性。

功能范围

随着不同团队同时实施开发和部署以建立或支持产品的独特功能,定义微服务的范围成为一项必不可少的任务。我们可以通过遵循单一责任原则 (SRP) 来实现这一点。SRP 指导我们以单一焦点设计模块,这反过来又缩小了功能范围,以增强软件系统的可维护性和清晰度。

当我们谈论微服务的范围时,我们指的是独立软件模块的功能。确定微服务将实现的功能将有助于我们定义微服务的功能范围并建立明确的边界。例如,考虑一个负责电子商务平台内用户身份验证的微服务。其范围将包括用户注册、登录、密码重置和身份验证令牌生成等功能。这个定义明确的范围可确保微服务专注于处理与用户身份验证相关的任务,从而优化其效率和可维护性。

问题在于如何定义微服务的范围。虽然没有一套明确的规则来实现这一点,但有一些指导方针或最佳实践来定义范围。

以下是定义任何微服务范围时可以考虑的一些步骤:

  • 第一步是确定在各个模块下重复的代码片段。您看到它们重复的频率是多少?每次在不同的模块中设置它们需要多少精力?如果所有这些问题的答案都是很高,那么微服务的范围就是处理重复的代码片段。
  • 另一个步骤是检查模块是否不依赖于其他模块,或者简单地说,模块是否可以与其他服务松散耦合。如果是这样,那么微服务的范围将是整个模块的范围。
  • 定义范围时要考虑的另一个重要指标是检查功能是否会在高负载下使用。这将检查微服务是否必须尽快扩展。如果是,那么最好将可扩展部分定义为微服务的范围,而不是将其与其他功能相结合。

高内聚和松耦合

任何微服务的主要动机都是让服务彼此独立。这意味着人们可以编辑、更新或部署新服务而不会妨碍其他服务。如果相互依赖性较低,这是可能的。因此,我们必须创建一个松散耦合的系统,其中一个服务对其他服务知之甚少或一无所知。这也使测试更容易,因为可以轻松隔离每个组件以进行全面测试。

在将单片架构分解为较小的服务或组件时,将相似的功能组合在一起至关重要。将相关逻辑组合成一个单元称为内聚力。内聚力越高微服务架构越好。内聚力低则表示不同服务之间的通信过多,导致系统性能不佳。

因此,我们必须设计一个高内聚、松耦合的微服务,使其具有适应变化和可扩展性。

唯一识别来源

按照微服务设计的基本原则,任何服务都需要成为系统其余部分的唯一标识来源。让我们举一个例子来理解这一点。

在电子商务网站上下订单后,用户会获得一个订单 ID。订单 ID 生成后,包含有关订单的所有信息。作为微服务,订单 ID 是有关订单服务的任何信息的唯一来源。因此,如果任何其他服务寻求有关订单服务的信息,订单 ID 将充当信息来源,而不是其实际属性。

API 集成

在微服务架构中,多个服务协调并共同构成系统。但这些服务如何通信?想象一下使用各种技术来创建不同的服务。它们如何相互关联?
简单的答案是使用 API(应用程序编程接口)。在设计微服务时,选择正确的 API 非常重要。这对于维护服务和客户端调用之间的通信至关重要。轻松的过渡和执行对于正常运行至关重要。

创建 API 时要注意的另一件重要事情是业务领域。了解业务运营的范围将有助于我们定义边界并区分 API 将提供的各种功能。

系统外部有多个客户端。这些客户端可能是其他应用程序或用户。每当调用业务逻辑时,它都由适配器(消息网关或 Web 控制器)处理,适配器会返回请求并更改数据库。

数据存储隔离

在微服务架构中,每个微服务都维护其专用数据库,这与单体应用程序(其中多个服务可能共享一个公共数据库)形成对比。各个数据库提供的自主性支持微服务的独立开发、部署和可扩展性。

任何为特定服务存储的数据都应为该特定服务所私有。这意味着对数据的任何访问都应由该服务拥有。此数据只能通过 API 与任何其他服务共享。这对于保持对数据的有限访问并避免“服务耦合”非常重要。基于用户的数据分类至关重要,可以通过命令和查询职责分离 (CQRS) 实现。

交通管理

设置好 API 并启动系统后,不同服务的流量会有所不同。流量是客户端向特定服务发送的调用。在实际场景中,服务可能运行缓慢,从而导致调用时间更长。或者服务可能会被大量调用淹没。这两种情况都会影响性能,甚至导致软件或硬件崩溃。

这种高流量需求需要管理。特定的呼叫和被呼叫方式是实现顺畅流量的答案。服务应该能够终止导致延迟和影响性能的实例。

流量管理还可以通过一种称为“自动扩展”的过程来实现,其中包括持续跟踪服务并在需要时迅速采取行动。有时,在出现呼叫中断或服务无响应的情况下,“断路器模式”对于提供任何不完整的信息至关重要。

过程自动化

独立设计的微服务应该能够自行运行。自动化将实现自我部署和运行,无需任何干预。此过程允许服务成为云原生并部署在任何环境中。但要实现这一点,拥有一支不断致力于发展服务的DevOps团队非常重要。

最小数据库表

访问数据库表以获取数据可能是一个漫长的过程。这会耗费时间和精力。在设计微服务时,主要动机应该围绕业务功能,而不是数据库及其工作。为了确保这一点,微服务设计应该只有几个表,最好是隔离的,即使数据条目达到数百万。除了最小数量外,关注业务也是关键。

持续监控

想象一下将单片架构分解为微服务设计。这需要大量的时间和资源。使用传统工具来监控所做的所有更改并不容易。插入数据层和缓存可以提高性能,但很难监控整个过程。

因此,在设计微服务架构时,重要的是建立一个在中心位置主动监控数据存储的流程。这将有助于反映频繁的变化而不影响系统的性能。在典型情况下,微服务监控工具将监控单个服务并通过将数据存储在集中位置来合并数据。这是遵循微服务设计原则的必要步骤。

除了监控数据存储之外,持续监控 API 性能也很重要。API 性能监控对于任何微服务架构都至关重要,以确保功能在速度、响应能力和整体产品性能方面保持标准。

为失败而设计

微服务架构旨在通过隔离服务来增强软件系统的容错能力和弹性,以防止一个服务的故障影响其他服务。目标是确保内存泄漏、数据库连接问题或一个微服务中的错误等问题不会导致整个应用程序失败。

为了实现这一目标,断路器模式是微服务中常用的方法。此模式涉及监视微服务的状态并根据该状态动态调整其行为。如果微服务反复出现故障或错误,断路器模式允许系统暂时切断与有问题的服务的通信。实施断路器模式允许基于微服务的应用程序防止与故障服务的长时间通信尝试,从而避免性能问题和潜在的系统范围故障。这种隔离机制可确保其他服务可以独立运行,从而提高整体系统的弹性。

业务定制微服务

微服务设计原则是将每个微服务与特定的业务问题相结合,鼓励开发人员针对每个微服务的独特需求采用最合适的技术堆栈。与通常使用单一、同质技术堆栈的单片应用程序不同,微服务架构允许技术选择的灵活性和多样性。

在基于微服务的应用程序中,开发人员可以自由选择最适合每个微服务特定需求的编程语言、框架和数据库。这种方法可以根据每个组件的可扩展性、性能或数据处理要求等因素优化技术选择。这种灵活性提高了敏捷性和适应性,因为开发人员可以利用各种技术的优势来解决微服务生态系统中的特定挑战。

可扩展性

可扩展性是微服务中的一个关键设计原则,它使应用程序能够无缝适应不断变化的流量、数据量和复杂性,而不会影响系统性能。例如,在电子商务应用程序中,可扩展性在高峰需求期间发挥作用,例如节日期间应用程序流量激增。它可以动态调整基本微服务(包括数据库和服务器)的容量,确保最佳性能以满足不断增长的需求。

实现可扩展性涉及采用服务分区、负载平衡、水平扩展和缓存等策略,为有效管理不同工作负载提供强大的框架。

实时负载平衡

在客户端发起需要同时从多个微服务中检索数据的请求的情况下,负载均衡器的作用至关重要。负载均衡器通过确定获取所需数据的每个特定服务的中央处理单元 (CPU) 或图形处理单元 (GPU) 资源的分配,在管理此复杂操作中起着关键作用。它管理计算资源的分配并调节客户端请求的路由方式,确保最佳和高效的流程。这有助于最大限度地减少延迟,使客户端能够及时收到结果而不会出现不必要的延迟,从而提高系统的整体响应能力和性能。

无论您是经验丰富的开发人员还是刚刚进入该领域,理解和实施这些微服务设计原则可以彻底改变您的微服务测试方法,并为成功的应用程序开发奠定基础。

微服务架构的局限性

虽然微服务是淡化单片结构的最佳方式,但它也有缺点。但在得出结论之前,让我们先看看其中的一些。

  • 开发环境过载:随着应用程序及其数据库的增长,代码库也在扩展。随着每个微服务的代码扩展,每个加载的应用程序都会使开发环境过载。这可能会导致生产力的严重延迟。
  • 复杂性增加:在微服务中,每个服务都成为一个自主单元,通过网络、API 或消息传递协议进行通信。这导致应用程序的架构复杂性大幅增加,因为需要复杂的协调、额外的数据一致性考虑以及有效的通信机制的实施。
  • DevOps 复杂性:开发和部署单一功能的微服务并不容易。使用多种技术并创建 API 来集中系统是一项挑战。这需要一支经验丰富的 DevOps 团队。组建这样一支经验丰富的 DevOps 团队对于维护基于微服务的应用程序的复杂性至关重要。
  • 网络拥塞:微服务使网络变得更加嘈杂,因为众多服务相互作用。这种增加的聊天(通常称为“微服务聊天问题”)可能导致网络拥塞并降低性能。微服务之间大量的数据交换可能会导致延迟、响应时间变慢,并且需要有效的网络管理策略来优化整体系统性能。
  • 资源和网络使用量增加:多个组件协同工作时,它们需要在某种程度上相互通信。这种通信将导致网络使用量增加。这需要高速、可靠的网络连接。此外,运行这些应用程序的费用也会增加。所有服务都单独运行,增加了运营成本。
  • 测试和调试困难:测试和调试基于微服务的应用程序带来了独特的挑战,因为系统分布在多个服务器和设备上。困难在于需要访问所有组件以确保充分的测试和调试。在大型分布式系统中,协调对各种服务器和设备的访问是一项复杂的任务,影响测试过程的效率。应对这些挑战需要周到的策略和工具来简化微服务架构复杂环境中的测试工作。
  • 应用程序复杂性:由于微服务是独立的组件,因此每个微服务通常都会有一个最适合其需求的技术堆栈。例如,机器学习模块可能使用Python堆栈,计量服务可能使用 Java 堆栈,而 UI 服务可能使用 MEAN 堆栈。这会导致复杂性,因为管理和构建新功能所需的资源池和技能将非常高。
  • 初始投资高:微服务独立运行,需要独立的容器或资源来运行。每个项目可能都有很多微服务协同工作。设置所有集群(包括微服务、安全容器、负载均衡器、API 网关等)需要更高的投资。
  • 提供安全性的挑战:对于 Web 应用程序而言,安全性至关重要。使用微服务,实现这一点需要时间和精力。当存在独立模块集群时,每个模块都需要遵守为整个系统定义的身份验证和授权规范。

结论

在阅读了微服务设计原则的基础知识后,很明显,必须遵循一套特定的最佳实践来设计高效的微服务架构。但是,我们还观察到微服务设计原则如何通过分解单片架构来简化应用程序的创建过程。但与此同时,在采用微服务架构时需要克服某些挑战。这些复杂性会影响操作流程,但从长远来看,克服这些挑战可以带来优化和更高效的应用程序。此外,它还可以克服延迟和缺陷,同时提高灵活性和性能。

微服务架构的未来具有重塑软件开发格局的良好趋势。预计微服务将继续被采用,许多组织都认识到这种架构提供的可扩展性、灵活性和易于维护的好处。一个普遍的预测是,微服务将成为默认的软件架构系统,这表明人们将转向模块化和分散式应用程序开发。

包括 PayPal、Twitter、LambdaTest 和 Netflix 等在内的许多企业都支持微服务架构的可靠性,以部署更具可扩展性、功能性和健壮性的软件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1795971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搜索与图论:宽度优先搜索

搜索与图论&#xff1a;宽度优先搜索 题目描述参考代码 题目描述 输入样例 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0输出样例 8参考代码 #include <iostream> #include <algorithm> #include <cstring> using namespace std;const int N …

chatglm-6b部署加微调

这里不建议大家使用自己的电脑&#xff0c;这边推荐使用UCloud优刻得-首家公有云科创板上市公司 我们进去以后会有一个新人优惠&#xff0c;然后有一个7天30元的购买&#xff0c;购买之后可以去选择镜像&#xff0c;然后在镜像处理的这个位置&#xff0c;可以选择镜像&#xf…

浙江零排参加全国水科技大会暨技术装备成果展览会(成都)并作主论坛演讲

2024年5月13日-15日中华环保联合会、福州大学、上海大学等联合举办的2024年全国水科技大会暨技术装备成果展览会在成都顺利举办。浙江零排城乡规划发展有限公司司受邀参加&#xff0c;首日有幸听取徐祖信院士、任洪强院士、汪华林院士等嘉宾的主旨报告。主旨报告后&#xff0c;…

麒麟操作系统rpm ivh安装rpm包卡死问题分析

夜间变更开发反应&#xff0c;rpm -ivh 安装包命令夯死&#xff0c;无执行结果&#xff0c;也无报错 排查 &#xff1a; 1、top 查看无进程占用较高进程存在&#xff0c;整体运行平稳 2、df -h 查看磁盘并未占满 3、其他服务器复现该命令正常执行 4、ps -ef|grep rpm 查看安装…

江苏省汽车及零部件产业协作配套对接会在苏州举行

5月28日&#xff0c;江苏省汽车及零部件产业协作配套对接会暨“百场万企”大中小企业融通对接活动在苏州举办。本次活动以“深化整零协作&#xff0c;促进大中小企业融通发展”为主题&#xff0c;由江苏省工业和信息化厅、中国中检所属中国汽车工程研究院股份有限公司&#xff…

跑图像生成模型GAN时,遇到OSError: cannot open resource 报错解决办法

报错信息如下&#xff1a; Traceback (most recent call last): File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py", line 276, in <module> count train(dataloader, image_encoder, text_encoder, File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py…

安卓SystemServer进程详解

目录 一、概述二、源码分析2.1 SystemServer fork流程分析2.1.1 [ZygoteInit.java] main()2.1.2 [ZygoteInit.java] forkSystemServer()2.1.3 [Zygote.java] forkSystemServer()2.1.4 [com_android_internal_os_Zygote.cpp]2.1.5 [com_android_internal_os_Zygote.cpp] ForkCom…

C语言数据结构(超详细讲解)| 二叉树的实现

二叉树 引言 在计算机科学中&#xff0c;数据结构是算法设计的基石&#xff0c;而二叉树&#xff08;Binary Tree&#xff09;作为一种基础且广泛应用的数据结构&#xff0c;具有重要的地位。无论是在数据库索引、内存管理&#xff0c;还是在编译器实现中&#xff0c;二叉树都…

springboot 社区疫苗管理网站系统-计算机毕业设计源码89484

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 社区疫苗管理网站系统&#xff0c;主要的模块包括查看首页、网站管理&#xff08;轮播图、公告信息&#xff09;人员管理&#xff08;管理员、…

Liunx音频

一. echo -e "\a" echo 通过向控制台喇叭设备发送字符来发声&#xff1a; echo -e "\a"&#xff08;这里的 -e 选项允许解释反斜杠转义的字符&#xff0c;而 \a 是一个响铃(bell)字符&#xff09; 二. beep 下载对应的包 yum -y install beep 发声命令 be…

金融创新浪潮下的拆分盘投资探索

随着数字化时代的步伐加速&#xff0c;金融领域正经历着前所未有的变革。在众多金融创新中&#xff0c;拆分盘作为一种新兴的投资模式&#xff0c;以其独特的增长机制&#xff0c;吸引了投资者的广泛关注。本文将对拆分盘的投资逻辑进行深入剖析&#xff0c;并结合具体案例&…

TikTok广告投放攻略——广告类型详解

TikTok广告是品牌或创作者付费向特定目标受众展示的推广内容&#xff08;通常是全屏视频&#xff09;。TikTok 上的广告是一种社交媒体营销形式&#xff0c;通常旨在提高广告商的知名度或销售特定产品或服务。 就 TikTok广告投放而言&#xff0c;其组织层级分为三个层级&#x…

【SpringBoot + Vue 尚庭公寓实战】项目初始化准备(二)

尚庭公寓SpringBoot Vue 项目实战】项目初始化准备&#xff08;二&#xff09; 文章目录 尚庭公寓SpringBoot Vue 项目实战】项目初始化准备&#xff08;二&#xff09;1、导入数据库2、创建工程3、项目初始配置3.1、SpringBoot依赖配置3.2、创建application.yml文件3.3、创建…

RabbitMQ(五)集群配置、Management UI

文章目录 一、安装RabbitMQ1、前置要求2、安装docker版复制第一个节点的.erlang.cookie进入各节点命令行配置集群检查集群状态 3、三台组合集群安装版rabbitmq节点rabbitmq-node2节点rabbitmq-node3节点 二、负载均衡&#xff1a;Management UI1、说明2、安装HAProxy3、修改配置…

代码随想录算法训练营第四十六 | ● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 视频讲解&#xff1a;https://www.bilibili.com/video/BV1pd4y147Rh https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<st…

springboot vue 开源 会员收银系统 (6) 收银台的搭建

前言 完整版演示 前面我们对会员系统 分类和商品的开发 完成了收银所需的基础信息 下面我们开始完成收银台的开发 简单画了一个收银的流程图大家参考下 从这张图我们可以分析一下几点 可以选择会员或散客收银选择会员使用相应的会员价结算使用会员卡则在价格基础根据卡折扣…

sql server:数据库处于单用户模式,当前某个用户已与其连接

在 SQL Server 中&#xff0c;数据库可以设置为不同的用户模式&#xff0c;以便根据需要限制对数据库的访问。单用户模式&#xff08;Single-User Mode&#xff09;是其中一种模式&#xff0c;它限制了对数据库的访问&#xff0c;使得一次只能有一个用户连接到数据库。 单用户…

七月份大理站、ACM独立出版、高录用稳检索,2024年云计算与大数据国际学术会议(ICCBD 2024)

【ACM独立出版 | 高录用 | EI核心检索稳定】 2024年云计算与大数据国际学术会议&#xff08;ICCBD 2024) 2024 International Conference on Cloud Computing and Big Data (ICCBD 2024) 一、重要信息 大会官网&#xff1a;www.iccbd.net &#xff08;点击投稿/参会/了解会…

Vue2项目错误提示:Vue: <template v-for> key should be placed on the <template> tag.

1. 场景还原 升级了最新的Webstorm后打开Vue2项目提示以下波浪线错误&#xff1a; Vue: <template v-for> key should be placed on the <template> tag. 该错误不会影响正常运行和构建&#xff0c;但我们看到了会不舒服。 2. 错误原因 Vue2中key不能放在temp…

[数据集][图像分类]城市异常情况路边倒树火灾水灾交通事故分类数据集15223张8类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;15223 分类类别数&#xff1a;8 类别名称:[“badroad”,“fallentree”,“f…