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

程小胖学习微服务架构基础

时间:2023-03-22 13:33:52 科技观察

看到最近“微服务架构”的概念这么火,作为一个上进心的程序员,程小胖也忍不住想要学习一下。架构师老王(不是隔壁老王)最近一直在做公司基础服务的微服务研究和实现,对此有较深的研究。于是程小胖立马跑过去向老王请教:“王哥,我看微服务架构这么火,我也想学,能不能告诉我什么是微服务架构?”老王笑了笑说:“要想知道什么是微服务架构,首先要知道什么是系统架构设计。”这个概念还是很熟悉的,所以他马上给出了答案[1]:系统架构设计描述了如何根据业务、技术、组织、灵活性、可扩展性和可维护性等来设计应用系统。这个因素划分了应用系统分成不同的部分,并使这些部分分工协作,从而为用户提供一定的价值。老王满意的点了点头,继续问道:“你看,我最近在做微服务的研究和实现,你知道我为什么要这么做吗?”“因为现在的三层架构有很多弊端,不符合业务发展的需要我需要它。”“嗯,我想你对公司目前的架构很熟悉,那我们就详细说说目前的三层架构吧。”于是程小胖拿了一张A4纸,图文并茂的给老人看。Wang谈到了他对三层架构的理解:三层架构是指在业务和技术发展过程中,在不同的层次上定义了系统中不同职责的部分,每一层负责的功能更多具体的。三层架构通常包括表示层、业务逻辑层和数据访问层。各层之间相互联系,相互配合,形成一个整体,层内可以更换其他工作部件,但对整体影响不大。以Web应用为例,在早期,所有的表现逻辑、业务逻辑、数据访问逻辑都放在一起,是一层架构。后来随着java、.NET等高级语言的发展,提供了越来越方便的数据访问机制,如java的JDBC、.NET的ADO.NET等。此时,数据访问部分被分离出来,形成了一个两层架构。后来随着面向对象设计、企业架构模式等理念的不断发展,表现逻辑和业务逻辑也分离出来,形成了现在的三层架构。三层架构的具体内容如下:表示层:用户在使用应用程序时看到、听到、进入或交互的部分。业务逻辑层:根据用户输入的信息进行逻辑计算或业务处理的部分。数据访问层:专注于有效操作原始数据的部分,如将数据存储到存储介质(如数据库、文件系统)和从存储介质读取数据。老王对这个解释很满意,又做了进一步的补充:“你看,虽然现在程序分为三层,但只是逻辑分层,不是物理分层。也就是说,对于不同的层作为就代码而言,经过编译、打包和部署,所有的代码仍然运行在同一个进程中,这就是所谓的单体架构。”程小胖挠挠头:“原来单体架构就是这个意思啊~~”“嗯。根据你的实际工作经验,你可以总结一下单体架构的优缺点。”平时勤于总结的程小胖很快罗列了单块架构的优缺点:优点:开发方便:开发方式简单,IDE支持好,运行调试方便。易于测试:所有功能在一个进程中运行,一旦进程启动,就可以进行系统测试。易于部署:只需要发布一个包到服务器即可。易于横向扩展:只需要创建一个服务器节点,配置运行环境,然后将软件包发布到新的服务器节点上运行程序即可(当然还需要采用分布式策略保证请求可以有效地分发到新的节点)。缺点:维护成本高:当应用的功能越来越多,团队规模越来越大时,沟通成本和管理成本会显着增加。当一个bug出现时,可能导致该bug的原因组合越来越多,导致分析、定位、修复的成本增加;并且在没有深入理解全局函数的情况下,修复bug时很容易引入新的bug。持续交付周期长:构建和部署时间会随着功能的增加而增加,任何微小的修改都会触发部署流水线。新人培训周期长:新人了解背景、熟悉业务、配置环境的时间越来越长。技术选择成本高:单体架构倾向于使用统一的技术平台或解决方案来解决所有问题。如果后面要引入新的技术或框架,成本和风险都会很高。可扩展性差:随着功能的增加,垂直扩展的成本会增加;对于水平扩展,由于所有代码都运行在同一个进程中,所以对于应用扩展的部分功能,没有办法做独立的功能。老王拍了拍小胖的肩膀,眯着眼睛说道:“小伙子总结的很好!既然你已经对现在的单块架构的优缺点有了很好的了解,那我们就可以开始学习了。”微服务架构。”老王先是在网上搜索关键词“微服务架构”,得出了这样一段话:微服务架构是一种架构模式,提倡将单个应用拆分成一组小的服务,相互协调配合,提供服务最终价值的用户,每个服务运行在自己独立的进程中,服务之间使用轻量级的通信机制(通常是基于HTTP的RESTfulAPI)进行通信,每个服务围绕特定的业务构建,可以独立部署生产环境、类生产环境等,另外,尽量避免统一集中的服务管理机制,针对具体的服务,根据业务上下文选择合适的语言和工具来构建看完这段话,程小胖说:“我有点头晕,感觉自己在雾中……”老王笑道:“别着急,我现在就为大家详细介绍一下微服务架构的特点。”1.单一职责微服务架构中的每一个服务都是一个具有业务逻辑的单元,遵循高内聚、低耦合、职责单一的原则。不同的服务通过“流水线”灵活组合,构建出一个庞大的系统。2.轻量级通信服务通过轻量级通信机制相互连接,所谓轻量级通常是指语言无关、平台无关的交互方式。对于轻量级的通信格式,我们熟悉的XML和JSON,它们是语言无关、平台无关的;对于通信协议,它们通常基于HTTP,可以使服务之间的通信标准化和无状态。大家熟悉的REST(RepresentationalStateTransfer)是实现服务间相互协作的轻量级通信机制之一。使用轻量级的通信机制可以让团队选择更合适的语言、工具或平台来开发服务本身。3.独立性每个服务在应用交付过程中都是独立开发、测试和部署的。在单块架构中,所有功能都在同一个代码库中,功能的开发不是独立的;不同团队完成多个功能时,需要经过集成和回归测试,测试过程不是独立的;当测试完成后,应用被打成一个包,如果某个功能出现bug,将导致整个部署失败或回滚。在微服务架构中,每个服务都是一个独立的业务单元,与其他服务高度解耦。只需改变当前服务本身即可完成自主开发、测试和部署。4.进程隔离在单块架构中,整个系统运行在同一个进程中。部署应用时,必须停止当前运行的应用,部署完成后重启进程。无法实现独立部署。有时我们会提取重复的代码并将其封装到组件中。在单体架构中,组件通常以共享库的形式存在(如jar包或DLL),但程序运行时,所有组件最终都会被加载到同一个runningin进程中。在微服务架构中,应用程序由多个服务组成,每个服务都是一个高度自治的独立业务实体,可以运行在独立的进程中,不同的服务可以方便地部署在不同的主机上。理论上,所有服务都可以部署在同一个服务器节点上,但不推荐这样做,因为微服务架构的主要目的是高度自治和隔离。“王哥,你真了不起,你这么一说,我的思路清楚多了!”程小胖激动得差点叫出声来。“之前了解过SOA,感觉和微服务架构的思想很像,能帮我区分一下吗?”程小胖问道。老王笑了笑,拿起程小胖手里的A4纸,翻到另一边画了一张表格:SOA实现微服务架构实现企业级,自上而下实现团队级,自下而上实现服务组成的大粒度多个子系统一个系统拆分成多个细粒度服务企业服务总线,集中式服务架构没有集中式总线,服务架构松散集成方式复杂(ESB/WS/SOAP),集成方式简单(HTTP/REST/JSON)单块架构系统,相互依赖,部署复杂的服务可以独立部署然后老王又画了一张图:程小胖看了看说:“你画的我大概看懂了,但是我不明白这个概念图中的DevOps……”“这个DevOps说来话长,有空可以自己查资料。”有了这个认识,你能不能进一步分析它的本质?”“好,你仔细听!”1.服务即组件微服务也可以看作是一个组件,但是它与传统组件的区别之一就是它的一个显着优势就是可以部署另一个优点是它在组件之间定义了清晰的、语言无关、平台无关的规范接口,耦合度低,灵活性高;缺点是分布式调用严重依赖于网络的可靠性和稳定性。2.围绕业务组织团队在单体架构下,企业一般会根据技能划分团队,在这种组织架构下,即使是简单的需求变更也可能需要跨团队协作,沟通成本高。在微服务架构中,提倡以业务为核心,按业务能力组织团队,团队成员有e多样化的技能。3.关注产品而不是项目在单体架构中,应用基本上是基于“项目模型”构建的,即项目启动时,从不同的技能资源池中抽取相关资源,组成一个团队,所有资源在项目结束后释放。在这种情况下,团队成员缺乏主人翁意识和产品成就感。在微服务架构中,提倡采用“产品模式”构建,即更倾向于让团队负责服务的整个生命周期,以提供更好的服务。4.技术多样性在微服务架构中,建议针对不同的业务特点选择合适的技术方案,有针对性地解决特定的业务问题,而不是像单体架构那样使用统一的平台或技术来解决所有问题。5.业务数据独立微服务架构,对其相关业务数据进行独立管理,可以随着业务的发展提供数据接口集成,而不是以数据库的形式与其他服务集成。此外,随着业务的发展,您可以轻松选择更合适的工具来管理或迁移业务数据。6、基础设施自动化在微服务架构的实践中,对持续交付和部署流水线有很高的要求,这将推动企业不断寻找更高效的方式来完成基础设施自动化,提升DevOps运维能力。小胖听后不禁表示赞叹:“老司机就是老司机,哦,我错了……架构师就是架构师,总结得如此简洁深刻!”“咳咳,低调低调……”“听了大家解释了这么多,我觉得微服务架构解决了现在三层架构的很多痛点。但是我觉得没有任何技术或者架构是完美的。”“非常正确。微服务架构的实现是有很多挑战的。”1、分布式系统的复杂性微服务架构是基于分布式系统的,构建分布式系统必然会带来额外的开销。性能:分布式系统是跨进程、跨网络的调用,受网络延迟和带宽的影响。可靠性:由于对网络条件的高度依赖,任何远程调用都可能失败,随着服务数量的增加,会出现更多的潜在故障点。因此,如何提高系统的可靠性,降低网络引起的故障率是系统建设面临的重大挑战。异步:异步通信大大增加了功能实现的复杂度,并伴随着难以定位和调试等问题。数据一致性:在分布式系统中保证数据的强一致性,成本非常高,需要在C(一致性)、A(可用性)和P(分区容错性)之间进行权衡。2、运维成本运维主要包括配置、部署、监控告警、日志采集四个方面。在微服务架构中,每个服务都需要独立配置、部署、监控、收集日志,成本成倍增长。3、自动化部署在微服务架构中,每个服务都是独立部署的,交付周期短,频率高。手动部署已经不能适应快速的业务变化。因此,如何有效地构建自动化部署系统是微服务面临的另一个挑战。4.DevOps和组织结构在微服务架构的实施过程中,开发人员和运维人员的角色发生了变化。开发人员将承担整个服务生命周期的责任,包括部署和监控;扮演顾问的角色,尽早考虑如何部署服务。因此,根据需要调整组织架构,打造一支功能齐全的团队,也是一个不小的挑战。5.服务间的依赖测试在单体架构中,集成测试通常用于验证依赖是否正常。在微服务架构中,有大量的服务,每个服务都是一个独立的业务单元。服务主要通过接口进行交互。如何保证依赖的正常性是测试的主要挑战。6.服务间的依赖管理在微服务架构中,存在大量的服务,如何清晰有效的展示服务间的依赖关系是一个不小的挑战。“微服务的落地需要经过全面的考察和完善的试验,并不是每个场景都适合使用微服务架构,也不是每个企业都有能力或精力去面对这些挑战。”王先生语重心长的说道。“是啊,任何事情都有两个方面,最合适的就是最好的!对了,王哥,你已经把理论课教给我了,什么时候带我去实习?”“你还是先仔细消化吧。”今天说完了,下次再说吧……”“嗯,期待我们下次的交流……”[1]图片来源及内容主要参考《微服务架构与实践》。