微服务应该多大

转自:https://zhuanlan.zhihu.com/p/143709876?utm_source=wechat_session

该文章和作者很厉害.

微服务实践最常见的错误之一是把微服务做得过小。本文通过示例,深入讨论了微服务的大小和粒度。

微服务架构终于成为一种架构模式。与任何新技术一样,微服务的发展符合 Gartner 的技术曲线。从推特上获得的信息来看,它处于低谷期或复苏的早期阶段。换句话说,过去6年,我们在构建微服务方面积累了一些重要经验,其一就是确保以恰当的方式考虑每个微服务的范围。

https://www.gartner.com/en/research/methodologies/gartner-hype-cycle

众所周知,微服务容易把人往“沟里带”,并没有解决实际问题。当你想到“微服务”一词时,首先看到的是前缀“微”(Micro)。据 An Introduction to Greek 一书的介绍,在柏拉图和亚里士多德那里,μικρός只表示少或小。在日常英语中,“微”往往表示小得异乎寻常的东西——毕竟,“微米”是一米的百万分之一,而“显微镜”是用来观察那些肉眼看不见的东西,因为它们尺寸太小。

问题就出在这种不同的认知上。与之前的大型单体服务相比,微服务应该是“小”的。然而,它不应该太小——把微服务做得过小是很多团队实现微服务架构时遇到的最常见错误之一。

正是这种“微服务必须非常小”的思想导致这个问题。关于微服务,我们经常听到的另一个抱怨是,在银行等复杂领域使用它们太难了,因为所需的 REST 或消息传递接口没有提供跨多个微服务进行两阶段提交的方法。每当我们听到这种抱怨时,头脑中的警钟就会响起——通常,这种抱怨是一个症状,表明团队把他们的微服务看作是非常微小的东西。

为解决这个问题,让我们从一个简单的示例开始寻找解决方法,然后再回过头来,进一步考虑该解决方案对整个微服务架构的影响。

示例从设计一个简单的 Account 服务开始,从这个没有包含微服务实现的设计开始,以便你能看清它的演进过程。假设团队正在使用领域驱动设计(稍后会详细介绍),在他们的第一次尝试中,发现 Account 实体需要引用两个关联依赖实体——Entry 和 Owner。

 

 

最初的 Account 设计

很快,团队就发现 Account 上有一些定义良好的操作:借、贷、开、关。幸运的是,这些操作可以很好地映射到 REST 接口,因此,采用这种简单的基于实体的设计并将其映射到微服务实现起来比较容易。然而,他们很快就发现问题——他们还没有弄清楚账户之间如何进行转账,如下图所示:

 

 

具有 Transfer 服务的 Account 设计

问题是,在账户之间转账需要一个全新的 REST 接口,这一点显而易见。问题是如何实现,这是否代表一个全新的微服务?

最简单的假设是(也是许多团队都会采用的假设),微服务和 REST 接口之间应该存在 1 对 1 映射。然而,当把这个映射关系应用示例中时,我们很快就遇到一个问题:新的微服务如何实现?最简单的方法似乎是让 Transfer 微服务调用 Account 微服务两次;一次从“from”账户借出,一次贷入“to”账户。所以,我们的实现可能是这样的:

 

 

调用其他服务的服务实现

但这将陷入前面讨论过的两阶段提交问题!如果借出成功,贷入失败,那么这个客户账户里的钱就少了,还没有任何追索权。这种情况显然是不可接受的;因此,许多团队尝试了以下解决方案:

 

 

在数据库引入耦合的 Account 设计

这解决了两阶段提交问题,但是在数据库中引入耦合,违反了微服务设计的原则之一,即服务应该拥有自己的数据,而不是通过共享数据库“隐式”耦合。正确的做法是什么呢?在我看来,许多团队都“走远了”,并开始追求涉及 Saga 模式的解决方案,以便通过补偿事务来处理问题。虽然 Saga 模式可以解决问题,但它不是这种简单情况的最优解决方案。

考虑一下下面的解决方案,它打破了之前的那个假设:

 

 

在服务边界暴露多个服务

在这个解决方案中,我们重新考虑了之前假设的那个约束——一个微服务正好对应于一个 REST 接口。这个假设已经写入网络上的许多微服务教程中。然而,如果你仔细阅读 Fowler 的原始论文,就会发现其中从未指出过这个假设。在微服务边界上可以暴露多个服务。但这并不是这个小练习的真正目的。让我们回到主题,通过这个练习来阐明更常见的问题。

https://martinfowler.com/articles/microservices.html

我们在上文中说过,示例中的团队使用领域驱动设计作为其微服务设计流程的一部分(要了解更多信息,请阅读 Eric Evans 的著作《领域驱动设计:软件核心复杂性应对之道》)。

在这方面,团队是对的。我们看到,在微服务设计领域,其中一个最大的问题是,他们经常不是从领域驱动设计这样的技术开始,而是从其他地方开始,比如从现有系统的设计开始,并试图从那里得出自己的微服务。或者,从一个架构开始(通常以工具和框架的形式指定),然后尝试让微服务“有机地”发展。在这两种情况下,最终得到的都不是我所说的微服务——它们往往非常注重技术,与企业业务完全无关。

而我们所说的微服务是用业务术语描述的“业务微服务”,业务人员可以识别它们,并可以从设计中找到它们。设计不足的症状之一是解决方案中很少或基本没有业务微服务,这是因为没有从业务词汇表开始设计。从业务词汇表开始设计是至关重要的一步,这就是为什么我们建议所有构建微服务的团队将领域驱动设计作为其设计过程的一部分。

如果不首先从业务词汇表入手,那么通常会搞成如下架构:

 

 

你们很多人看到这个可能会说“这到底有什么问题吗?”这看起来就是我们要的微服务架构!要回答这个问题,我们必须回顾下 Fowler 在他最初关于微服务的论文中提出的观点。他和 Lewis 提出的观点是,当你的团队由技术专家组成时,所生产的软件也将按技术领域进行组织——这就是实践中的康威定律。Fowler 的解决方案是,按业务能力组织跨职能团队。

当你开发一个与上文类似的微服务架构时,就已经回到了微服务本来要解决的问题!你不仅重新创建了一个单体,而且还是一个分布式单体,情况变得更糟糕了。这违反了可能是 Martin 写过的最重要的一句话:

Fowler 的分布式对象第一定律:不要使用分布式对象。

那么,更好的架构应该是什么样的呢?首先在最上层,考虑下垂直画线,而不是水平画线。

已标记关键词 清除标记
相关推荐
<p> <span style="color:#337fe5;"><strong> </strong></span> </p> <p class="MsoNormal"> <span style="color:#000000;font-size:16px;">本课程总计13大章节,115课时,是一门全面的SpringCloud服务体系化课程。课程共包括</span><span style="color:#000000;font-size:16px;">十三个大章节,涵盖注册中心、网关、熔断、降级、监控、安全、限流等全部体系。</span><span style="color:#000000;font-size:16px;">包含阿里巴巴Nacos,Consul,Spring Cloud Gateway,OAuth2.0 JWT 等主流技术。</span> </p> <p class="MsoNormal"> <span style="color:#000000;font-size:16px;"> </span> </p> <p>   </p> <p> <span style="color:#337fe5;"><strong>[为什么要学习Spring Cloud服务]</strong></span> </p> <p> <span style="color:#4d555d;"> </span> </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#ffffff;"> <span style="font-family:"background-color:#FFFFFF;"><span style="font-size:12px;">SpringCloud作为主流服务框架,</span><span style="color:#4d555d;font-family:"background-color:#FFFFFF;font-size:12px;">已成为各互联网公司的首选框架,国内外企业占有率持续攀升,</span><span style="font-size:12px;">是Java工程师的必备技能。</span></span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">就连大名鼎鼎的阿里巴巴</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">dubbo</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">也正式更名为</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">Spring Cloud Alibaba</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">,成为了</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">Spring Cloud </span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">服务中的一个子模块。</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">Spring Cloud是企业架构转型、个人能力提升、架构师进阶的不二选择。</span><span style="font-family:"background-color:#FFFFFF;"> </span> </p> <p class="ql-long-8780922" style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-8780922" style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#ffffff;"> <span style="color:#337fe5;"><strong>【推荐你学习这门课的理由:<span style="color:#e53333;">知识体系完整+丰富学习资料】</span></strong></span> </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#ffffff;">   </p> <p class="MsoNormal"> 1、本课程总计13大章节,115课时,是一门全面的SpringCloud服务体系化课程。 </p> <p class="MsoNormal"> 2、课程0基础入门,逐层递进深入,理论和代码相结合。 </p> <p class="MsoNormal"> 3、十三个大章节,涵盖注册中心、网关、熔断、降级、监控、安全、限流等全部体系。 </p> <p class="MsoNormal"> 4、包含阿里巴巴Nacos,Consul,Spring Cloud Gateway,OAuth2.0 JWT 主流技术。 </p> <p style="background:white;"> 5、课程附带230页高清PDF正版课件、Hoxton版本配套项目源码37个、Edgware版本配套项目26个,所有代码均有详细注释。 </p> <p>   </p> <p class="MsoNormal">   </p> <p> <span style="color:#337fe5;">【主讲讲师】</span> </p> <p> <span style="color:#337fe5;"><span style="color:#000000;">尹洪亮Kevin:</span><br /> <span style="color:#000000;">现任职某互联网公司首席架构师,负责系统架构、项目群管理、产品研发工作。</span><br /> <span style="color:#000000;">10余年软件行业经验,具有数百个线上项目实战经验。</span><br /> <span style="color:#000000;">擅长JAVA技术栈、高并发高可用伸缩式服务架构、DevOps。</span><br /> <span style="color:#000000;">主导研发的蜂巢服务架构已经成功支撑数百个服务稳定运行</span></span> </p> <p> <span style="color:#337fe5;"><span style="color:#000000;"> </span></span> </p> <p>   </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#ffffff;"> <span style="color:#337fe5;"><strong>【学完后我将达到什么水平?】</strong></span> </p> <p class="MsoNoSpacing" style="margin-left:18.0pt;text-indent:-18.0pt;"> 1、 对Spring Cloud的各个组件能够熟练配置、开发、部署。 </p> <p class="MsoNoSpacing" style="margin-left:18.0pt;text-indent:-18.0pt;"> 2、 吊打一切关于Spring Cloud服务的笔试面试题 </p> <p class="MsoNoSpacing" style="margin-left:18.0pt;text-indent:-18.0pt;"> 3、 能够上手搭建十分完整的服务分布式系统,涵盖服务注册与发现、负载、网关、配置中心、监控、安全、熔断等。 </p> <p class="MsoNoSpacing" style="margin-left:18.0pt;text-indent:-18.0pt;"> 4、 对整个服务体系架构有十分清晰准确的掌握。 </p> <p>   </p> <p class="ql-long-24357476"> <span style="font-family:""> </span> </p> <p class="MsoListParagraph" style="margin-left:36pt;text-indent:-36pt;" align="left"> <strong><span style="color:#337fe5;">【</span><span style="color:#337fe5;">面向人群</span><span style="color:#337fe5;">】</span></strong> </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> 1、 <span style="color:#4d555d;">不了解服务是什么,</span>感觉服务很难、不敢学,<span style="color:#4d555d;">网上资料松散,</span>没有好的学习资料 </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> 2、 这么多年还一直在写SSH、SSM项目,没有更新过自己的知识体系。 </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> 3、 Spring Cloud组件太多,不知道应该重点关注和学习哪些。 </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> 4、 不会搭建服务项目、依赖项目太多、完全搞不清楚。 </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;">   </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> <span style="color:#337fe5;"><strong>【课程知识体系图】</strong></span> </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> <span style="color:#337fe5;"><strong><img src="https://img-bss.csdnimg.cn/202007100719132383.png" alt="" /><br /> </strong></span> </p>
<p> <strong><span style="color:#7030A0;font-size:16px;">SpringCloud是目前流行的服务框架,在各大互联网公司都有广泛的应用,同时在企业招聘面试时也会要求对服务技术栈有所了解和掌握。SpringCloud是一套完整的服务解决方案,基于SpringBoot框架。</span></strong> </p> <p> <br /> </p> <p> <span style="font-size:16px;color:#FF0000;"><strong><span style="font-size:18px;">本课程以通俗易懂的方式讲解SpringCloud技术栈,由浅入深,帮您快速入</span></strong><span style="font-size:18px;"><strong><span style="font-size:18px;">门!</span></strong></span></span> </p> <p> <span style="font-size:16px;color:#FF0000;"><br /> </span> </p> <p> <strong><span style="font-size:16px;">课程内容包括:</span></strong> </p> <p> <span style="font-size:16px;">1<span style="font-size:16px;">. 服务简介</span></span> </p> <p> <span style="font-size:16px;">2. SpringCloud技术栈</span> </p> <p> <span style="font-size:16px;">3. Restful API简介和设计原则</span> </p> <p> <span style="font-size:16px;">4. Restful API用法</span> </p> <p> <span style="font-size:16px;">5. 使用Postman测试接口</span> </p> <p> <span style="font-size:16px;">6. 使用Swagger2生成API文档</span> </p> <p> <span style="font-size:16px;">7. Eureka注册中心</span> </p> <p> <span style="font-size:16px;"><span style="font-size:16px;">8. </span><span style="font-size:16px;">Feign客户端</span></span> </p> <p> <span style="font-size:16px;">9. Hystrix断路器</span> </p> <p> <span style="font-size:16px;">10. Zuul网关</span> </p> <p> <span style="font-size:16px;">11. Ribbon负载均衡</span> </p> <p> <span style="font-size:16px;">12. 服务的面试题</span> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:18px;"><strong><span style="color:#FF0000;">教学全程采用<span style="font-size:20px;color:#00B050;">笔记+代码案例</span>的形式讲解,每个知识点都有详细的讲解,通俗易懂!!!</span></strong></span> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201912191421361425.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201912191421501561.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201912191422071317.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201912191422176568.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201912191422296123.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201912191422419349.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:16px;"><strong><strong><strong>讲师介绍</strong></strong></strong><strong><strong><strong></strong></strong></strong><strong><strong></strong></strong></span> </p> <p> <img src="https://img-bss.csdn.net/201912191423463144.jpg" alt="" /> </p>
<p style="color:rgb(66,66,66);font-size:14px;"><strong><span style="color:rgb(112,48,160);">SpringCloud是目前流行的服务框架,在各大互联网公司都有广泛的应用,同时在企业招聘面试时也会要求对服务技术栈有所了解和掌握。SpringCloud是一套完整的服务解决方案,基于SpringBoot框架。</span></strong> </p> <p style="color:rgb(66,66,66);font-size:14px;"><br /></p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><strong><span>本课程以通俗易懂的方式讲解SpringCloud技术栈,由浅入深,帮您快速入</span></strong><span><strong><span>门!<span><strong><span>详细讲解了SpringCloud的五大核心组件,同时准备了SpringCloud的案例项目,全面提升服务的编程功底!</span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><img src="https://img-bss.csdn.net/202003281323408232.png" alt="" /><br /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><br /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><br /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><span style="color:#FF0000;font-size:14px;">教学全程采用</span><span style="color:rgb(0,176,80);font-size:14px;">笔记+代码案例</span><span style="color:#FF0000;font-size:14px;">的形式讲解,每个知识点都有详细的讲解,通俗易懂!!!</span></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><br /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><img src="https://img-bss.csdn.net/202003281329173164.png" alt="" /><br /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><br /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><span style="color:#FF0000;">部分讲义截图:</span></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><br /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><img src="https://img-bss.csdn.net/202003281329395213.png" alt="" /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><br /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><img src="https://img-bss.csdn.net/202003281329504761.png" alt="" /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><br /></span></strong></span></span></strong></span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;"><span style="color:rgb(255,0,0);"><span><strong><span><span><strong><span><img src="https://img-bss.csdn.net/202003281330015286.png" alt="" /><br /></span></strong></span></span></strong></span></span> </p>
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页