28、架构-边界:微服务的粒度

微服务的粒度

在设计微服务架构时,确定微服务的粒度是一个关键问题。粒度过大或过小都会带来不同的问题,因此需要找到合理的粒度来划分微服务。下面详细探讨微服务粒度的合理范围及其影响因素。

1. 微服务粒度的上下界

微服务的粒度不应该只有唯一正确的答案或绝对的标准,但应该有个合理的范围,称为微服务粒度的上下界。

下界:独立、内聚、完备
  • 独立:微服务应该能够独立发布、独立部署、独立运行和独立测试。每个微服务应该是一个独立的实体,能够在不依赖其他服务的情况下运行和测试。

    具体实践

    • 独立部署流水线:为每个微服务设置独立的CI/CD流水线,确保服务可以独立构建、测试和部署。
    • 独立运行环境:使用容器化技术(如Docker)为每个微服务提供隔离的运行环境,确保服务可以独立启动和运行。
  • 内聚:微服务应该具有高内聚性,即强相关的功能和数据应该在同一个服务中处理,避免跨服务调用带来的复杂性和性能开销。

    具体实践

    • 功能划分:确保每个微服务专注于一个特定的业务功能,例如用户管理、订单处理、支付处理等。
    • 数据归属:将相关的数据放在同一个微服务中,避免跨服务的数据共享和操作。
  • 完备:微服务应该包含至少一项完整的业务功能,确保其功能的完备性。例如,将字符串处理这样的小功能设计为一个微服务是不合适的,微服务应该处理完整的业务逻辑。

    具体实践

    • 业务功能划分:确保每个微服务具有完整的业务功能,例如订单服务应该包含订单创建、修改、取消等完整的订单处理功能。
    • 接口设计:设计微服务的API时,确保其功能接口完备,满足业务需求。
上界:团队规模和研发周期
  • 团队规模:微服务的粒度应该与一个团队在一个研发周期内能够完成的全部需求范围相匹配。通常,一个理想的开发团队规模是6到12人,这就是所谓的“2 Pizza Team”原则,即一个团队的工作量应能在一个研发周期内由两个披萨喂饱的团队完成。

    具体实践

    • 团队划分:将开发团队划分为多个小团队,每个团队负责一个或多个微服务,确保团队规模适中,便于管理和协作。
    • 任务分配:根据团队的规模和能力,合理分配开发任务,确保每个团队在一个研发周期内能够完成所负责的微服务的开发和维护。
  • 研发周期:根据研发模式的不同,研发周期可以是一天、两天、一周或两周。微服务的粒度应该适应团队的研发周期,确保在一个周期内能够完成对应的开发任务。

    具体实践

    • 短周期迭代:采用敏捷开发方法,将开发周期划分为多个短周期(如一周或两周),确保每个周期内都能完成一定量的开发任务。
    • 持续集成:通过持续集成工具,确保每个周期内的开发成果能够及时集成和测试,提高开发效率和质量。
2. 粒度过小的影响

如果微服务的粒度设计得过小,会带来以下几个方面的问题:

  • 性能问题:一次进程内的方法调用耗时在数百个时钟周期内,而一次跨服务的方法调用则需要进行网络传输、参数序列化和结果反序列化,耗时可达毫秒级别。这种性能差距可能导致系统效率下降。

    具体实践

    • 性能评估:在设计微服务时,进行性能评估,避免将高频调用的功能拆分为独立的微服务,减少跨服务调用的开销。
    • 批量处理:对于需要频繁调用的功能,可以采用批量处理的方式,减少网络传输的次数和开销。
  • 数据一致性问题:每个微服务都有自己独立的数据源,如果多个微服务需要协同工作以保证数据的一致性,处理过程会变得复杂。如果某些数据必须保证强一致性,那么这些数据应当聚合在同一个微服务中,而不是通过跨服务调用来实现。

    具体实践

    • 事务管理:采用分布式事务管理(如SAGA模式)来处理跨服务的数据一致性问题,确保数据的一致性和完整性。
    • 数据聚合:将需要强一致性的数据聚合在同一个微服务中,避免跨服务的数据一致性问题。
  • 服务可用性问题:服务之间是松散耦合的依赖关系,微服务架构中无法也不应该假设被调用的服务具有绝对的可用性。如果两个微服务必须依赖对方才能正常工作,那么它们应当合并到同一个微服务中。

    具体实践

    • 服务合并:对于高度依赖的服务,将它们合并为一个微服务,减少跨服务的依赖关系,提高系统的稳定性和可靠性。
    • 降级策略:为每个微服务设计降级策略,确保在依赖的服务不可用时,系统能够降级运行,保证核心功能的正常运转。
3. 粒度过大的影响

如果微服务的粒度过大,虽然技术上没有问题,但从团队协作和管理的角度来看,会带来以下问题:

  • 沟通成本:根据《人月神话》的结论,软件项目中的沟通成本随着参与人数的增加而指数增长。一个过大的微服务需要多个团队协作,沟通成本和管理难度会显著增加。

    具体实践

    • 分层管理:将过大的微服务划分为多个子服务,通过分层管理的方式,减少沟通成本和管理难度。
    • 团队职责明确:为每个团队明确职责和分工,减少团队间的依赖和协调,提高沟通效率。
  • 灵活性下降:过大的微服务会降低系统的灵活性,使得独立部署和更新变得更加困难,失去了微服务架构的主要优势之一。

    具体实践

    • 细化服务:将过大的微服务细化为多个粒度适中的微服务,确保每个微服务都能独立部署和更新,提高系统的灵活性。
    • 模块化设计:采用模块化设计方法,将微服务拆分为多个模块,通过接口进行通信,保持系统的灵活性和可扩展性。
4. 领域驱动设计(DDD)的方法论

当今软件业界对识别微服务边界已取得较为一致的观点,即采用领域驱动设计(Domain-Driven Design, DDD)来指导具体实践。DDD 提供了以下几个重要概念和方法:

  • 界限上下文(Bounded Context):界限上下文是定义微服务边界的关键概念。每个界限上下文代表一个特定的业务领域,微服务的边界应与界限上下文保持一致。

    具体实践

    • 识别界限上下文:通过业务需求分析,识别系统中的界限上下文,为每个界限上下文定义对应的微服务。
    • 界限上下文映射:绘制界限上下文映射图,明确各个界限上下文之间的关系和依赖,为微服务的设计提供指导。
  • 聚合(Aggregate):聚合是DDD中的基本构建块,表示一组具有内聚关系的对象。微服务应根据聚合来划分,确保每个服务具有高内聚性和低耦合性。

    具体实践

    • 识别聚合:通过领域模型分析,识别系统中的聚合,将每个聚合作为一个独立的微服务。
    • 聚合内协作:确保聚合内部的协作在同一个微服务中进行,减少跨服务的依赖和通信。
  • 领域事件(Domain Event):领域事件用于在不同的微服务之间进行通信和协作,确保数据的一致性和业务逻辑的完整性。

    具体实践

    • 发布领域事件:当一个微服务的状态发生变化时,通过发布领域事件通知其他相关服务,确保数据和业务逻辑的一致性。
    • 事件驱动架构:采用事件驱动架构,使用消息队列(如Kafka、RabbitMQ)来传递领域事件,实现微服务之间的解耦和协作。

总结

微服务的粒度设计是微服务架构中的一个关键问题。合理的微服务粒度应该满足独立、内聚和完备的要求,同时应考虑团队规模和研发周期的实际情况。通过领域驱动设计的方法论,架构师可以更好地识别和划分微服务边界,确保系统的灵活性、可维护性和高效性。

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

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

相关文章

Unity Animator 运行时修改某个动画状态的播放速度

1.添加动画参数,选择需要动态修改速度的动画状态 2.在属性面板种设置速度倍速参数

Linux中进行CAN测试

配置CH340串口和创建slcan设备 串口波特率:2000000 CAN波特率:500000 标准帧类型 ID帧:0x00000000 数据:00 00 00 00 00 00 00 00 安装 can-utils 依赖包: sudo apt-get install can-utils加载必要的内核模块&#xff…

HarmonyOS ArkUi ArkWeb加载不出网页问题踩坑

使用 使用还是比较简单的,直接贴代码了 别忘了配置网络权限 Entry Component struct WebPage {State isAttachController: boolean falseState url: string State title: string Prop controller: web_webview.WebviewController new web_webview.WebviewCont…

自定义注解+AOP形式监控接口调用日志

目的&#xff1a; 通过自定义注解&#xff0c;在需要监控接口调用输出日志的类或方法上&#xff0c;加上自定义注解&#xff0c;实现无侵入式接口监控。 实现&#xff1a; idea结构 1、导入pom <dependency><groupId>org.aspectj</groupId><artifactI…

ASUS/华硕天选Air 2021 FX516P系列 原厂win10系统

安装后恢复到您开箱的体验界面&#xff0c;带原机所有驱动和软件&#xff0c;包括myasus mcafee office 奥创等。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http:…

FTP 文件传输协议:概念、工作原理;上传下载操作步骤

目录 FTP 概念 工作原理 匿名用户 授权用户 FTP软件包 匿名用户上传下载实验步骤 环境配置 下载 上传 wget 授权用户上传下载步骤 root用户登录FTP步骤 监听 设置端口号范围 修改用户家目录 匿名用户 授权用户 FTP 概念 FTP&#xff08;File Transfer Prot…

[英语单词] 除了ugly,还可以使用inelegant

有时候讨论代码的修改&#xff0c;就会说这个实现比较丑/ugly&#xff0c;其实还可以用这个词inelegant。感觉这个更文雅一点。 <— 朗道英汉字典5.0 —> inelegant *[in’eligәnt] n. 不优美, 不雅, 粗野 <— 牛津现代英汉双解词典 —> inelegant /ˌɪnˈelɪg…

JAVA设计模式-大集合数据拆分

背景 我们在做软件开发时&#xff0c;经常会遇到把大集合的数据&#xff0c;拆分成子集合处理。例如批量数据插入数据库时&#xff0c;一次大约插入5000条数据比较合理&#xff0c;但是有时候待插入的数据远远大于5000条。这时候就需要进行数据拆分。数据拆分基本逻辑并不复杂&…

毅速丨金属3D打印是制造业转型升级的重要技术

随着科技的进步&#xff0c;金属3D打印技术已成为制造业升级的重要驱动力。它以其独特的优势&#xff0c;正引领着制造业迈向新的未来。 金属3D打印技术的突破&#xff1a; 设计自由。金属3D打印能制造任意形状和结构的零件&#xff0c;为设计师提供了无限的创意空间。 快速制…

idea配置外置gradle

下载gradle包&#xff0c;解压 https://gradle.org/install/#manually 创建一个本地仓库 mkdir /Users/caidingnu/save/gradle-8.5/gradlerep如果需要全局适应 gradle&#xff0c;环境变量自行配置 配置阿里云仓库 路径&#xff1a; /Users/caidingnu/save/gradle-8.5/init.…

物理内存与虚拟内存

文章目录 理解物理内存与虚拟内存物理内存什么是物理内存&#xff1f;物理内存的特点 虚拟内存什么是虚拟内存&#xff1f;虚拟内存的特点 物理内存与虚拟内存的关系总结 理解物理内存与虚拟内存 在计算机系统中&#xff0c;内存是一个至关重要的资源。我们通常听到“物理内存…

ONLYOFFICE8.1-------宝藏级别桌面编辑器测评

简介 ONLYOFFICE 8.1 是一个功能强大的办公套件&#xff0c;提供了一系列广泛的功能&#xff0c;用于文档管理、协作和沟通。它包括用于创建和编辑文本文档、电子表格、演示文稿等的工具。ONLYOFFICE 8.1 的一些关键特性包括&#xff1a; 1. 协作&#xff1a;ONLYOFFICE 8.1 允…

51单片机STC89C52RC——11.1 蜂鸣器播放音乐

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;蜂鸣器 2.1 介绍 2.2 板子位置电路图 2.3 发声原理 2.4 音符和频率 三&#xff0c;创建Keil项目 四&#xff0c;代码 4.1 乐谱代码 4.1.1 《义勇军进行曲》 4.1.2 《天空之城》 4.1.3 《小美满》 4.1.…

安防监控视频平台LntonAIServer视频监控管理平台裸土检测算法技术核心和应用场景

LntonAIServer裸土检测算法是一种基于人工智能技术的创新解决方案&#xff0c;旨在实现对裸土地表的自动识别。以下是对该算法的详细分析&#xff1a; 技术基础&#xff1a; 1、该算法利用深度学习和计算机视觉技术&#xff0c;通过捕捉视频或图像中的关键信息&#xff0c;如…

java-快速排序 2

### 8. 快速排序的实际应用 快速排序由于其高效的性能&#xff0c;广泛应用于各种实际场景中&#xff0c;例如数据库中的索引排序、系统文件排序等。以下是一个综合示例&#xff0c;展示如何使用快速排序对学生成绩进行排序。 java public class Student { private Strin…

快手主播李香周助力推动 K-beauty风潮谈背后成功秘诀

近年来&#xff0c;互联网的迅速发展和SNS社交媒体的普及&#xff0c;人们通过网络可以随时随地对自己感兴趣的自由畅谈和学习。而直播带货更是作为一种依托于互联网兴起的新型营销方式&#xff0c;凭借其价格优势和新颖的介绍方式为消费者带来了十分便捷的购物体验。 本期采访…

多模态语言模型的新突破:Reka Core、Flash和Edge系列

人工智能领域的每一次技术革新都可能引领一场行业的变革&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;多模态语言模型&#xff08;MLMs&#xff09;正逐渐成为推动智能系统发展的核心力量。Reka团队最新推出的Reka Core、Flash和Edge系列模型&…

解决 Git 不区分大小写导致的文件冲突问题

有些同学在 Git 仓库对文件/文件夹进行命名时&#xff0c;刚开始是小写&#xff0c;后来为了保持团队一致&#xff0c;又改成了大写&#xff0c;然而 Git 不会发现大小写的变化&#xff0c;此时就出了问题&#xff1a;导致仓库里出现了 大小写 同时存在的两个文件。但在 Window…

一个项目学习Vue3---快速了解Vue代码结构

基础结构 Vue文件中基本上和咱们自己写Html、CSS、JS差不太多&#xff0c;主要也由这三部分组成 HTML部分&#xff1a; <template><div>这里面写HTML代码</div> </template> CSS部分&#xff1a; <style scoped> .aaa {font-size: 3em; } &…

蚂蚁- 定存

一&#xff1a;收益变动&&收益重算 1.1: 场景组合 1: 澳门元个人活期&#xff0c;日终余额大于0&#xff0c;当日首次、本周本月非首次系统结息&#xff0c;结息后FCDEPCORE_ASYN_CMD_JOB捞起进行收益计算 【depc_account_revenue_detail】收益日 > 【depc_accoun…