当前位置: 首页 > 科技观察

一篇文章带你看懂微服务vs单体架构

时间:2023-03-13 01:45:32 科技观察

背景在软件行业,微服务架构是一个重要的发展趋势。这一趋势不仅对企业内部IT信息系统建设产生深远影响,也对企业向数字化转型产生深远影响。微服务架构与传统的单一软件架构相比,代表了IT行业软件开发方式的根本转变,Netflix、谷歌和亚马逊等组织都成功地采用了这种转变。但是,与传统的单体架构相比,微服务有哪些优势呢?微服务的概念最早是在2011年5月威尼斯的一次软件架构会议上被讨论和提出的。它用来描述一些通用架构风格的设计原则。2012年3月在波兰克拉科夫举行的第33届学位大会上,Thoughtworks首席顾问JamesLewis发表了题为《Microservices - Java, the Unix Way》的演讲。在这次演讲中,James讨论了微服务的一些原则和特性,例如单个服务的职责、Autoscaling、DDD等。微服务架构是FredGeorge在2012年的一个会议上提出来的,他在会议的演讲中解释了如何拆分服务,以及如何使用MQ来解耦服务。这就是微服务架构最早的雏形。随后被MartinFowler发扬光大,在2014年发表了一篇著名的微服务文章,这篇文章深入全面地解释了什么是微服务架构。随后,微服务架构逐渐成为一种非常流行的架构模式,大量的技术框架和文章涌现,越来越多的公司学习和使用微服务架构相关的技术。架构特征围绕业务能力进行组织,不再是之前的纵向切分,而是按业务功能进行横向切分。微服务最好由一个业务部门的小团队构建。做产品而不是项目(productnotproject),不再是做完每一个项目,完成交付后的项目,而是做产品,从设计编码到产品运维,全程掌控并负责整个过程,也就是自己来构建,自己运维(youbuildit,yourunit)。智能终端加简单通道(smartendpoints和dumbpipe),使用基于资源的API,把很多逻辑放在client端,而server端专注于提供资源。建议做复杂的逻辑基于Web而不是在Web之后(beoftheWeb,notbehindtheWeb)。去中心化治理,就是不拘泥于一个系统,不以一个中心为中心,自己做事,自主管理。去中心化数据管理(decentralizeddatamanagement)只管理和维护自己的数据,不直接访问对方的数据,只通过API访问数据。基础设施自动化(infrastructureautomation),每个微服务都应该专注于自己业务功能的实现,基础设施应该尽可能自动化——构建自动化、测试自动化、部署自动化、监控自动化。针对故障进行设计,必须从设计之初就考虑高可靠性和容灾,并考虑如何进行错误监控和错误诊断。进化设计,没有完美的架构,唯一不变的就是变化。要善于应对变化,很容易改变它的设计和实现,因为它小,所以多变。架构特点一个微服务架构应该具备以下特点:易于更换和升级。比如用Ruby快速开发的原型可以用Java实现的微服务代替,因为服务接口没变,所以没有影响。职责独立完整。按功能单元组织服务,职责相对独立完整,避免与其他服务过度依赖和交互。您可以选择最适合您的技术方案。服务的不同性质会影响技术选择。比如账号注册和登录,完全可以通过RubyonRails、PythonDjango等脚本框架来实现。但是对于音视频流的编解码和处理,最好用C/C++甚至汇编语言来写。其他的,比如数据库、ORM或者MVC框架的选择,可以因地制宜,根据业务和技术的具体需求,根据团队的技术栈和人员情况选择最合适的方案。架构从层次结构转变为扁平结构。服务内部可以进行适当的分层,服务尽量扁平化,不要引入过多的层次。架构风格微服务可以采用多种风格,但一个“生态系统”的记忆最好遵循统一的风格和要求。微服务基本有以下几种风格:短而精,独立自主:只做一个业务,专注做好。自动化部署和测试:相对于大而全的单体服务,微服务会有更多的流程、更多的服务接口、更多不同的配置。如果部署和测试不能自动化,微服务的好处就会大打折扣。最小化运维负担:微服务的增加可能会导致运维成本的增加,故障的监控和诊断可能会更加困难。因此,有必要未雨绸缪。在最初的设计阶段,要充分考虑如何及时发现问题并解决问题。拥抱失败和错误:微服务本质上是为高可靠性和防错而设计的。分布在不同机器、不同地域的服务所使用的硬件和网络,随时都可能出现问题,需要解决这些问题。对服务质量没有影响。每项服务都是灵活的、可扩展的、可扩展的、可组合的:微服务提供了更多响应变化的可能性,就像乐高积木一样,可以随意添加或删除,以创建不同的产品。MonolithicArchitecture简介单体架构(MonolithicArchitecture)是一种将所有功能打包运行在一个容器中,将一个系统的所有功能集成在一个实例中的设计风格。通过负载均衡软件/设备实现多实例调用,单体结构比较初级,典型的三层结构,前端(Web/移动端)+中间业务逻辑层+数据库层。单体应用程序更易于部署和测试。在项目的早期阶段,单体应用程序可以很好地运行。但是,随着需求不断增加,越来越多的人加入开发团队,代码库也迅速膨胀。渐渐地,单体应用越来越臃肿,可维护性和灵活性逐渐下降,维护成本越来越高。架构特点结构简单,易于理解:这对开发者来说是非常重要的一点。经典的分层架构相对成熟,更容易被更多的开发者理解和接受,学习成本也比较低,对团队本身的要求也不是特别高。这不仅使得系统的设计和开发相对容易,而且出错的机会也相对较低。用现在流行的话来说,就是“坑比较少”,开发实施可以“踩坑者踩坑”,实现数据一致性。比较容易,可以通过本地事务或者分布式事务方便有效的保证数据一致性部署简单方便:比如这里的在线课程系统可以方便快捷的打包成WAR包部署到Jetty中或Tomcat容器,也可以是部署在IIS中的.NET解决方案。无论哪种方式,设计一个持续集成策略来在一次部署后运行整个应用程序都相对容易:基本上,团队可以根据项目的实际情况轻松设计持续集成解决方案。在许多情况下,整个解决方案将同时放置。在一个代码库中,按照持续集成策略,项目的持续交付不会有太大的压力。当我们从目前中大型项目的业务形态、复杂度和响应速度来回顾单体架构时,我们可以发现它存在如下几个问题:可扩展性差,难以梳理功能依赖列表。通常很难评估功能点变化的影响模块,从而无法有效地组织测试。测试和发布都需要整体部署,非常耗时。笔者早期参与过多个单体架构。单个项目有百万代码,40、50人共同开发。一个版本的迭代至少一个季度,一个部署要将近半个小时,这还不是最差的。部署和启动一些单一架构的系统需要一天的时间。这对于提倡小版本、快速迭代的互联网产品来说,几乎是无法接受的。无法实现复杂业务。所有功能都可以在一个容器中实现。服务耦合度高,需要极其精巧的设计。.GoF的设计模式大家都知道,但是为什么在实际开发中很少直接接触呢?一方面,框架为我们做了很多封装,将设计模式融入到框架的最佳实践或编码规范中。另一方面,SOA、微服务让各个模块的代码尽可能简洁明了,更多的工作只关注业务的代码实现。为了在单体架构中实现业务解耦,大量的decorators、observers、Adapters等,无形中提高了开发门槛。能不能专注于业务实现而不是架构设计,是衡量一个架构好坏的重要标准。未来,我们将看到Serverless下技术升级难度的最终体现。但举一反三,不可能对技术架构进行模块化升级。在项目生命周期中,我们不可能不升级依赖的框架/类库的版本,更有什者,我们会重新选择基础框架,比如从早期的struts到struts2再到springmvc、spring靴子,每一次改变都会伤害肌肉我们必须努力,但我们必须这样做。该项目必须是可持续的。试想现在还有谁会用struts或者struts2?温和的、循序渐进的技术升级也是我们所期待的。开发效率低。每个成员都需要有一个完整的环境,依赖环境,搭建开发环境成本高,协同开发时版本冲突频繁。一个有问题的提交可能会影响到所有其他同事的开发和调试。达到一定的代码量后,编译变慢,启动变慢。一次调试启动可能需要5、6分钟,不利于安全管理。所有的开发人员都拥有全量的代码,这在安全管控方面存在很大的风险,尤其是对于大量的外包人员或新人来说。雇用一个庞大的开发团队。有些公司要求员工使用虚拟桌面(一种存储集中、操作受限的虚拟环境)来避免代码外流,但这种开发体验较差,且遭到员工抵制,因此普及率极低架构的业务收益是重要的。如果部署得当,基于微服务的架构在帮助企业避免产生技术债务以及显着提高效率方面具有巨大价值。但是,微服务服务架构带来的灵活性也带来了一定的复杂性。微服务相对于传统单体架构的优势如下:敏捷性:通过将功能分解到最基本的层次,然后抽象出相关服务,研发可以只专注于更新应用的相关部分。这消除了通常与单体应用程序相关的痛苦集成过程。微服务加速开发,将其变成一个可以在数周而不是数月内完成的过程。效率:微服务架构允许更高效地使用代码和底层基础设施。通过减少运行特定应用程序所需的基础设施数量,成本节省高达50%的情况并不少见。弹性:通过跨多个服务分布功能,应用程序对单点故障不敏感。这使应用程序能够更好地执行,减少停机时间并按需扩展。好处:更快的迭代和更少的停机时间有助于增加收入。随着微服务的不断改进,用户保留率和参与度增加