单体优先的微服务架构

news2024/11/20 21:37:19

作者:Martin Fowler
译者:林宁

当听说有团队在使用微服务架构时候,我注意到了一些规律:

  1. 几乎所有成功应用微服务的系统,都来自于一个过大单体项目拆分而来。
  2. 几乎所有我听到过一开始就选择使用微服务架构的系统,并从 0 构建,最终的结果都有一系列严重的麻烦。

这些规律在我同事中产生了长期的讨论:你不应该在新项目之初就采用微服务架构,即使你坚信该应用未来会因业务演进而变得巨大无比。
项目之初直接采用微服务架构很危险

微服务是一种有用的架构,但是即使是这种架构的拥趸也不得不承认,使用这种架构需要付出额外的成本,这意味者只有更复杂的系统值得使用这种架构。这种代价的本质是管理这些服务所带来的基本开销。所以这就是单体优先架构策略的依据, 架构师应在构建新系统时先采用单体架构做设计,即便在项目后期使用微服务架构更有价值。

第一个原因是经典的 Yagni 原则 (译者注:“You Aren’t Gonna Need It” 的缩写,意在避免过度设计)。当你开始一个新的应用程序时,你如何确定这个应用的特性是用户有价值的?一个成功的软件可能背后的设计很糟糕,很难拓展,但是总比一个设计卓越但是没有价值的系统好。正如我们现在所认识到的,通常判断一个软件和想法是否有用的最好方法,是构建一个简单的版本,看看它的跑起来效果如何。在第一个阶段,你需要优先考虑速度(以及反馈的周期时间),因此微服务的成本是一个累赘,应该被避免。

从微服务开始的第二个问题是,它们只有在服务之间建立良好、稳定的边界时才能正常工作——这本质上是厘清正确的限界上下文的任务。因为任何服务之间的功能重构都比在一个庞然大物的单体中要困难得多。不幸的是,即使是在熟悉的领域工作的经验丰富的架构师,也很难在一开始就确定边界。通过先构建一个单体应用,你可以在微服务设计刷上一层糖浆之前(译者注:比喻微服务的一些额外设施),找出正确的边界是什么。它还为你提供了缓冲时间来开发细粒度服务所需的基础设施。

据我所知,践行单一优先策略有不同的方式。比如,仔细的从逻辑上设计为一个类似单体系统的整体,注意内部的模块化设计,包括 API 边界和数据的存储方式。做好这一点,再来开发微服务的系统。然而,如果我听过很多这样的成功案例,我会觉得这种方法更合适,实际很难做到。

一种更常见的方法是从一个庞然大物开始,然后逐渐从边缘剥离微服务。这种方法可能会在微服务体系结构的核心留下一块巨大的庞然大物,但是大多数新开发都是在微服务中进行的,只是这一块庞然大物是相对不变的。

另一种常见的方法是先开发一个单体系统,再用一套新的微服务系统完全替换单体结构。很少会有人认同这种办法,然而建造作为献祭架构的单体系统是有好处的(译者注:一种设计方法,先做简单的原型系统,再用新的系统代替,其实就是重写)。不要害怕建造一个你会丢弃的庞然大物,特别是如果一个庞然大物可以让你很快地进入市场。

还有,我遇到的其他方法是从几个粗粒度的服务开始,这些服务要比你预期的要大。使用这些粗粒度的服务来习惯处理多个服务,同时享受这样一个事实:粗粒度减少了你必须不得已进行服务间重构的数量。然后,随着边界稳定下来,就会分解为更细粒度的服务。

虽然我接触的大多数人倾向于“单体优先”的策略,但这不是绝对的。相反的观点认为,从微服务开始构建新的系统,可以让你适应在微服务环境中开发的节奏。要以足够模块化的方式构建单体系统,以便将其轻松分解为微服务,需要花费很多甚至太多的编程规则。从微服务开始,你可以让每个人从一开始就习惯在独立的小团队中进行开发,并且在需要的时候,通过服务边界将团队分开可以更容易地扩大开发工作。对于那些更有可能尽早获得足够稳定边界的系统来说,这尤其可行。尽管证据不多,但我觉得你不应该从微服务开始,除非你有在团队中构建微服务系统的大量经验。

我觉得我还没有足够的例子来明确如何决定是否使用“单体优先”策略。毕竟,这是微服务的早期阶段(译者注:这篇文章发布在2015),可供学习的业界案例相对较少。因此,任何人在这些问题上的建议都需要保持开放性,无论观点的提出者如何信誓旦旦。

文章来源

  • Martin Fowler MonolithFirst

文/Thoughtworks 林宁
原文链接:单体优先的微服务架构

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

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

相关文章

【软件测试】测试开发?开发一个自动化测试系统如何做?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 当我们开始分析一个…

ADI Blackfin DSP处理器-BF533的开发详解67:PCM的播放(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了打开代码工程目录下的“test.snd”文件,并读取 6MB 的数据到内存中,然后将内存中的数据进行循环…

C语言重点解剖第17课笔记

1.预处理阶段,先去注释,再宏替换。所以宏替换不能用于去注释。 #define bsc //就变成了一个空的宏。(//在这里面本来就是注释,只是注释后面的内容为空) 2.宏定义并不是简单的无脑替换。 printf(" ")中,双引号里面的东…

uniCloud云开发----3、uniApp中文件上传(通过插件(uniFilePicker)或者 uniCloud.uploadFile实现方案)

uniApp中文件上传前言效果图1、使用unifilePicker插件(1)安装unifilePicker插件(2)简单案例2、通过原生的 uniCloud.uploadFile来实现共同成长共同进步前言 uniapp图片上传插件unifilePicker 在开发uniapp的时候上传文件是必不可…

从月入5千到现在的月入1W+,会计转程序员,“谁说女的不适合学编程?”

前言 我毕业五年了,但与技术和 Python 相关的工作经验也就两年。今天我想跟大家分享自己转行的故事,希望能够鼓励那些跟我一样的朋友共同前行。 我们将会聊到我个人的经历和入行故事,讨论快速学习的方法,最后推荐一些学习资源。…

“互联网+”获奖项目专访 | 阿尔兹海默症患者辅助诊断研究分享

在本届“互联网”创新创业大赛中 昇思MindSpore群英荟萃团队荣获全国总决赛铜奖 本期有幸邀请到 团队负责人李鹏和指导老师胡悦进行采访 一起来看看夺奖背后的故事吧 PART ONE 团队介绍 群英荟萃团队 1. 项目成员 李鹏、周晨、邹静、纪雨萍、李晓迪、张英豪 2. 指导老…

Insight Enterprises EDI 850 采购订单报文详解

Insight Enterprises 是一家世界 500 强解决方案集成商,在全球拥有 11,500 多名员工,帮助企业加速数字化转型。Insight为管理其庞大的供应链建立了EDI(Electronic Data Interchange,中文名称是电子数据交换)系统&#…

Android 进阶——Framework 核心之Touch事件分发机制详细攻略(一)

文章大纲引言一、Android 事件分发概述二、Touch事件分发的对象MotionEvent三、分发事件的核心对象及方法1、分发事件的核心对象2、事件分发的核心方法四、Touch事件分发的流程1、Activity的事件处理流程2、ViewGroup&View的事件分发流程五、事件分发的应用1、事件拦截2、响…

刨根问底Kafka 40问,看看你能坚持到第几问

Kafka最初是由Linkedin公司开发的,是一个分布式的、可扩展的、容错的、支持分区的(Partition)、多副本的(replica)、基于Zookeeper框架的发布-订阅消息系统,Kafka适合离线和在线消息消费。它是分布式应用系…

【JavaSE】内部类

目录 前言: 内部类 什么是内部类? 内部类的分类 1、静态内部类 1、静态内部类,不能直接被实例化 2、 静态内部类当中,不能直接访问外部类的非静态成员,但是可以直接访问外部类的静态成员。 3、外部类可以访问静…

java -数据结构 - 集合框架及背后的数据结构

什么是集合框架 数据结构,我们知道数据结构就是组织数据的一种方式,比如所链表,就是将数据存储在链表的value域中,next域就是存储下一个节点的地址,通过这样的方式将数据组织起来。 在我们学习中,所知道 的…

接口幂等实现基于注解(适用于分布式系统中支持spEl动态过滤)

在网络卡顿时,容易出现在极短的时间内产生重复请求,或重复支付,一般我们会在数据操作时先通过数据查询是否存在,然后再进行业务逻辑操作的方式来进行避免,但是这种方式并不是原子性,很容易出现第一次请求未进行落表,第二次重复的请求就已经通过了数据库查询,可通过设置唯一索引…

用于开发语音 AI 应用程序的 GPU 加速 SDK

NVIDIA Riva 简介:用于开发语音 AI 应用程序的 GPU 加速 SDK 语音 AI 用于多种应用,包括联络中心的座席助理以增强人类座席的能力、智能虚拟助理 (IVA) 的语音界面以及视频会议中的实时字幕。 为了支持这些功能,语音 AI 技术包括自动语音识别…

基于springboot的社区团购管理系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

FineReport企业报表工具-JS根据条件显示参数控件

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 问题描述 在使用参数控件时,有时我们希望部分参数控件在没满足条件时不显示,满足条件后再显示,如下图效果,只有前面的下拉框选择了内容之后,后一层下拉框控…

【C语言】重要函数qsort函数的用法

目录 一、qsort函数的介绍 1、整形数组 2、字符数组 3、字符串 4、结构体 二、qsort函数的使用 一、qsort函数的介绍 qsort函数是一种底层快速排序的函数,它的特点就是可以排序任意类型的数据,比如:整形、字符串、浮点型、以及结构体类型。 …

VUE3-组件之间传值《四》

目录 一.父传子,父组件向子组件传值 二.子传父,子组件向父组件传值 三.兄弟组件之间互传,2个组件之间是平级关系,互相传值 组件之间的传值,分为3种方式 一.父传子,父组件向子组件传值 1.建立一个默认的…

零信任深入理解--概念,架构和实现方案

1. 零信任究竟解决了什么问题? 很多人在初步了解“零信任”概念,乃至进一步研究一些技术和产品方案之后,会有种“不过如此”的感觉。 毕竟, IAM(Identity and Access Management,身份识别与访问管理&…

6. 【gRPC系列学习】Balance原理详解

本节开始分析Balance执行原理,通过上面流程可知,Balance Build的创建来自于Resolver的解析完成后调用updateResolverState方法,我们从updateResolverState方法开始分析Balance执行流程。 1. Balance调用流程 1)updateResolverState(s resolver.State, err error) error 方…

Java培训MySQL之全局序列

1.本地文件 不推荐,存在宕机序列丢失问题。 2.数据库方式 数据库序列方式原理 利用数据库一个表 来进行计数累加。但是并不是每次生成序列都读写数据库,这样效率太低。 mycat会预加载一部分号段到mycat的内存中,这样大部分读写序列都是在…