01 | 是什么推动了单体应用到微服务架构的演进?

你好,我是姚秋辰。

“微服务”是近些年在大型应用架构领域的一个热门话题,从实践领域来看,我们身边的一二线大厂也纷纷选择全面拥抱微服务。就拿国内Java系的一线大厂来说,如阿里系、美团点评、PDD等,它们都将自己的核心业务系统构建在微服务架构之上。

即便你是刚参加工作的萌新,也一定从铺天盖地的“微服务”相关信息流中了解到了这个名词的热度。谷歌搜索指数显示,自2014年起,微服务的搜索热度一路上升。

其实,微服务并不是一个新兴的技术概念,很早之前它就已经进入了公众视野。

早在2012年,一位叫做Fred George的技术专家就在一次大会上分享了自己的微服务落地经验,讲述他是如何带领团队将一个极度庞大的J2EE巨无霸程序,分解成20多个小服务的。作为微服务领域的先驱,他是这样描述微服务架构的:

Micro Services Architecture - small, short lived services rather than SOA.

如果你在工作中没有接触过微服务架构的系统,那么此时一定非常蒙圈,不明白大佬所说的微服务架构到底是什么。没关系,就让我带你去回顾微服务的发展历史,了解微服务解决了什么痛点;然后我们一道来分析微服务架构的优势,让你明白为什么如今一线大厂会采用微服务架构。

那么,我们就从微服务架构的前世今生聊起吧。

单体应用之殇

在互联网技术发展的早期阶段,我们采用“单体应用”的方式来构建网络系统。你没看错,即便是如今的各大老牌互联网大厂,在当年也是从单体应用小作坊成长起来的。

以Java单体应用为例,我们将业务逻辑打包在一起,做成一个WAR包部署到Tomcat、JBoss之类的容器中,对外提供服务。业务上了一定规模之后,再通过集群化水平扩展的方式,将单体应用部署到一个集群中,承接更大的用户访问量。

然而,随着业务复杂度的进一步提升,单体应用在生产力和高可用性层面就面临了巨大的挑战。我在参加工作之初做过近五年的单体应用开发,深知其中的痛处。

我刚毕业的时候,参与了一个巨无霸的电商套件的开发,那是一个标准的单体应用。整个开发加测试团队有100多号人,所有人的代码都提交到一个主干分支,每次merge代码都要面对各种代码冲突,开发过程中耗费了大量的沟通成本。不仅如此,由于庞大的业务体系都部署在一个WAR包中,每一次提交代码都要执行3个小时的回归测试,不出错还好,一旦出错就要回炉重造。周而复始执行这套繁重的流程,研发效率非常低下,完全无法达到“快速迭代”的目的

在上线阶段我们也经常碰到各类问题。我参与的这个单体应用的发布周期是2个月一次(这在单体应用中已经算是很快的发布节奏了),每次发布一旦出现Bug,无法单独回滚这个小改动,我必须将整个发布里所有的功能全部回滚,待问题修复之后再重新发布。更可悲的是,整个WAR包的服务经常因为一个小Bug导致团灭,曾经有一次,我提交了一个“数据批量导入导出”的代码改动,把一个隐蔽Bug发布到了线上,业务持续运行一段时间之后,JVM内存发生了泄露,导致集群各节点的HEALTHCHECK失败服务被重启,进而影响到了所有服务。

上面这些问题是不是很让人头痛?想要解决它们,我们就要用到一句老话,叫“大事化小,小事化了”。

在架构领域,我的经验是“一切看似大到无法解决的问题,都可以通过逐一拆解、各个击破的方式来解决”。在“单体应用”这个问题上,我们可以采取“微服务”化的方式,通过将这个巨无霸应用拆分成各个独立的小型微服务应用,分而治之!

微服务架构的优势

微服务架构是在SOA(面向服务架构)之上做的进一步扩展。在一线实践中,我们通过领域建模等理论将一个大型应用拆分成了更细粒度且边界清晰的服务模块。而且,每个微服务都能被独立测试、独立部署,并借助Docker和CI/CD(持续集成环境)完成快速上线,不必像单体应用一样经历繁琐的release流程和漫长的发布窗口。

每个微服务就像一个“麻雀虽小、五脏俱全”的小王国,它拥有独立的代码库和数据库Schema,通常由一个小规模的微服务技术团队全权负责,这个团队汇聚了产品、技术、架构等人员,采用Scrum之类的敏捷开发流程做快速迭代。基于此,微服务具备了“独立演进”能力。

如果你对微服务拆分比较感兴趣,我推荐你去了解“领域建模”和“领域模型驱动(DDD)”的相关知识,后续我也会在这个课程中写一篇扩展阅读,跟你分享互联网公司常用的服务拆分规划理论:主链路规划。

你现在肯定在好奇,为什么能独立开发部署的“微服务”可以解决单体应用的痛点呢?从我自己的经验来说,我认为微服务架构有这样几个天然的优势:

  • 快速迭代+快速回滚

细粒度的可独立部署的小型服务,再加上敏捷开发模式的加持,可以让你对产品功能实现快速迭代。在互联网公司中,微服务团队通常以周甚至0.5周为时间单位进行快速迭代。如果迭代过程中发现线上Bug,也可以在最短的时间内做线上回滚,并且不会影响到其他应用的正常发布。

  • 资源利用大大提高

你可以将硬件等资源定向分配给需要用到资源的微服务,实现差异化的资源利用。在大厂的微服务体系中,我们会统计每个服务集群的线上压力水位,应用弹性计算技术在各个服务之间调配计算资源。

  • 大幅降低协作成本

代码库、数据库、编译打包从“共享”变为了“独享”,微服务团队也保持了小规模特战队的模式,进一步降低了组内组外的沟通协作成本。

  • 高可用

高可用是系统设计的第一目标,关于这一点,我想和你多介绍一些大厂微服务架构中的实践经验。通过这些介绍,让你对微服务化的必要性有更加深刻的认识。

相比前牵一发而动全身的单体应用来说,我们可以通过很多技术手段对微服务施加个性化的保护措施,比如弹性机房水位调拨、流量整形、熔断降级。

  1. 弹性机房水位调拨

弹性机房实现了计算资源的自动分配,这种弹性伸缩能力必须建立在微服务化的基础上。它可以根据每个微服务的重要程度(核心服务 vs 边缘业务)以及当前承接的用户访问压力,动态地将计算资源(如虚机、云存储)分配给需要资源的服务。

  1. 流量整形

根据每个微服务承载能力的不同,控制外部流量抵达服务的速率。“限流”其实只是流量整形的一个场景,大型微服务的流量整形有很多种方式,比如匀速排队、流量预热、削峰填谷等等。

  1. 熔断降级

在流量高峰的时候,我们可以对边缘服务做人工降级,把计算资源腾挪给核心应用,降低核心服务的访问压力。除了人工降级以外,我们还可以为每个服务设置自动降级和熔断指标,比如当调用失败率达到某个阈值之后,开启自动降级措施,降低对下游业务的访问压力。

我们只有把应用微服务化之后,才能更好地使用上面这些技术手段对业务系统做精细力度的保护,从而实现高可用的目标。

到这里,相信你已经对微服务架构有了更深一步的认识。不过,任何事物都有其两面性,微服务不光有好的一面,也有很多问题等着我们去解决。比如集群环境下的服务治理、数据一致性、以及高并发场景下的服务容错等等。不过呢,你大可放心,这些问题都不算事儿,在实战环节我会教你如何使用Spring Cloud组件将其一一攻破。下节课,我们正式开启Spring Cloud的大门。

总结

今天我带你了解了微服务架构,我们将单体应用和微服务架构做了个比较,分析了单体应用无法适应互联网快速迭代的痛点,以及微服务架构是如何利用灵巧敏捷的小规模服务,很好地适应了互联网行业的快速迭代和高可用保障的要求。

总结来说,微服务架构是通过应用领域模型等理论,将庞大的单体应用拆分为更细粒度的小型服务,每个服务都可以独立部署、测试和发布,加之敏捷开发的推广,使得微服务很好地迎合了如今互联网行业快速试错、快速迭代的节奏,同时也保证了系统的可用性。

思考题

你的公司是否也采用了微服务架构呢?你能从技术角度分享一下公司项目的技术选型方案吗?欢迎你和我分享,我在留言区等你。

好啦,这节课就结束啦,也欢迎你把这节课分享给更多对Spring Cloud感兴趣的朋友。我是姚秋辰,我们下节课再见!

精选留言

  • 2021-12-18 23:37:51

    老师您好,我是在银行工作,目前公司采用企业服务总线来实现SOA,感觉已经解决了单体应用过于庞杂的问题。老师直接从单体应用到微服务,跳过了SOA,与我工作中遇到的实际不符。请问可以讲一讲SOA到微服务的必要性吗
    作者回复

    SOA已经是用拆分服务的思想治理业务了,目前也确实多在一些金融银行业运用了,在这些行业里没有可见的必要性来替换到微服务架构,改造成本大不说而且容易破坏稳定性。但我了解的部分IT建设搭建的比较完善的银行,比如招行软开,已经在新系统中使用微服务化的架构了(不是银行业从业者如信息有误请指正)。

    其实你可以把技术升级看做一个balance的过程,替换成本和必要性,学习成本实施成本等等,有时候对于已经构建在庞大业务体系之上的老技术栈,没必要为了追新而追新。就像阿里虽然开源了dubbo,但是淘系内部用的最多的还是稳如老狗的HSF,反而是PDD这类新公司在用dubbo技术,因为没有历史业务的包袱。而很多大公司历史包袱种,至今连上云都无法推行,就比如可口可乐的ERP系统始终不敢迁移到SAP的SaaS方案上。银行业一个道理。

    技术发展总是不断向前的,就像当年使用SSH,现在使用spring boot,两者都能很好构建API,但是从开发成本和社区支持来看,新技术明显有更大的可持续性。当技术升级的balance在新技术一侧有了明显的优势,自然而然就会升级替代,就像很多传统企业逐步将单体集群化改为微服务化一样。

    2021-12-19 12:42:47

  • 前行

    2021-12-15 23:47:41

    公司用的跟老师讲的cloud组件差不多,正好可以系统学下
    作者回复

    哈哈,这家公司简直是太优秀了!

    2021-12-16 22:27:44

  • Better me

    2022-01-03 11:02:33

    老师想问下微服务和SOA的本质区别是什么
    作者回复

    用大白话讲,区别就是卷呗!其实SOA已经应用了服务拆分理念,但微服务更卷,应用一系列领域建模DDD等拆分理论,在领域治理方面粒度也更细。

    当然在技术层面上为了达到独立开发测试运维的微服务价值观,在大厂实践中把“自立门户”这一点推行的比较彻底,一个比较直观的感受是,独立DB(很多SOA架构的系统也是共享DB),更加全面彻底的devops文化和容器编排方案,而且相比SOA来说微服务没有所谓的“企业总线”这一层,取而代之的使用服务治理方案构建端到端的调用(当然了在最外层还是有个网关的),诸如此类

    2022-01-03 18:03:27

  • Rorchachl

    2021-12-14 21:52:58

    业务上了一定规模之后,再通过集群化水平扩展的方式,将单体应用部署到一个集群中,承接更大的用户访问量。

    半仙老师 我有几个问题想咨询下
    用户是怎么访问到集群中的单体的?
    集群中的单体是一份还是多份?
    集群是如何承接更大的访问量的呢
    作者回复

    用户并不知道自己的请求会路由到哪里,你在浏览器打开一个网址,在这个背后会请求DNS服务器做解析然后将请求路由到你的网关。我们以单体应用集群化部署来说,在网关背后你可以将集群里的机器配置到一个VIP里,也就是虚拟IP,可以通过keepalived LVS构建这个虚IP集群,也有的财大气粗的公司用贵的要死的F5来做,网关将请求转发到VIP上,在这个VIP池内通过负载均衡再把请求转发到处于live状态的单体应用节点上。当然,大型应用往往不止一个网关,他们还会再内部网络环境里构建多个zone,一个请求往往经历了多个网关转发。

    对单体应用来说,承接更大的用户量可以通过水平扩展,可以认为集群中有很多很多的单体应用,多重影分身之术。

    Forget it,马上讲微服务了,就不去想着单体应用啥事儿了,后面有的爽的

    2021-12-14 23:11:27

  • 杨逸林

    2021-12-14 08:01:17

    老师,我看贝宝的页面好像都还是用的 Bootstrap,不能说丑吧,只是感觉有点过时了。后端已经全改成微服务了?我问了一个贝宝的员工(外包),贝宝是大小周,这么好的吗?还招人吗?贝宝不是最近几年才在中国成立北京和上海的公司吗?
    作者回复

    paypal后面几千个微服务还是很庞大的,不过页面层为了安全因素,所以没用纯前端渲染的酷炫效果,很多地方用了bff层渲染。

    贝宝那个大小周(每6周一次3天休假)不是永久政策,只是在疫情期间的特殊政策,大家理性看待哈。和其它外企比较的话,这边工作时间里还是安排的很紧凑的,但毕竟是外企所以涨薪嘛不能跟互联网公司比,这点也要有心理预期。PP在国内成立已经很久了,感兴趣的话,可以搜索公众号“PayPal招聘”,有看中的职位随时找我内推哈

    2021-12-14 14:36:55

  • ziky

    2021-12-13 19:39:20

    老师你好,什么时候开放全部课程呀
    作者回复

    下周开始是以每周三篇的进度来更新,前几课先来几道前菜,后面基本每篇都是动手做项目实战的系列。

    实战项目的源码会开放的比较快,基础好的同学可以去把玩一下源码,从源码里也能了解下后面章节的内容。

    2021-12-13 23:44:55

  • Colorful3

    2021-12-19 12:20:31

    老师您好,我是一个自由职业开发。
    前几个月做了一个外企的外包项目,也是我第一次实际工作中使用 spring cloud技术栈,如今刚好外包项目做完了没什么事,回过头来学习巩固下。
    也与您分享下他们公司的技术选型:
    - 微服务框架: Spring Cloud Hoxton.SR8,Spring Boot 2.3.5.RELEASE
    - 持久层框架:Baomidou Mybatis-plus 3.4.1
    - 微服务技术栈:zuul gateway,openfegin,ribbon,eureka等
    - 数据库连接池:Alibaba Druid 1.1.3
    - 动态数据源:Baomidou Dynamic-datasource 3.3.3
    - 缓存框架:redis
    - 日志打印:logback
    - 配置中心:apollo 1.7.0

    实际做完了这个项目,再结合您课程中所讲到的点,确实体会颇深。目前也学习研究了市面上所讲的一些spring cloud alibaba课程,基本都是停留在基础使用、搭建跑通的层面上,我自己研究也遇到一些技术难点,官方文档和网上也鲜少查到解决方案。看了前两讲内容,也对后面的内容非常期待。
    希望后面跟随老师一起学习!加油加油!
    作者回复

    这个选型是十分稳健的选型,整体用的netflix技术栈,我在之前也做了几年netflix,后面逐步转向alibaba组件的。netflix风格会感觉非常沉稳,alibaba组件挺跳的哈哈,能玩出花头。

    碰到的技术难点可以在评论区交流,专栏里的内容未必会涉及的非常深入,在评论区可以尽情讨论

    2021-12-20 20:11:59

  • Q

    2021-12-15 09:14:12

    对微服务的了解只停留在应用层,期待能有更深层次的掌握
  • 易燃易爆闻一多

    2021-12-28 09:42:43

    现在客户的新项目,在某基金。就是微服务架构albb的套件。但是没有用到过seta和sentinel因为,tob的业务访问量很小。数据也是只读不写。数据是核心系统产生,当初感觉用微服务纯粹冗余。结果甲方要求做容灾和负载。。顺利无缝扩展
    作者回复

    是的,seata是个双刃剑,非必要不要上这种重量级的一致性解决方案,事务性消息+补偿+日志表就是一种可靠廉价的一致性方案了。sentinel还是很好用的,但开源sentinel需要做一系列改造实现规则持久化,使用阿里云自有的服务就省点事儿了

    2021-12-28 14:38:52

  • Jaising

    2022-03-29 16:02:14

    半仙老师,像2B,2G许多行业专网内大流量低并发系统,也会做关注点分离、服务拆分,但是大多数服务都是单点部署也不会遇到性能瓶颈,也适合用微服务嘛
    作者回复

    回想起以前在SAP的时候,巨复杂的超级巨无霸单体应用也能过的很滋润,还贼稳定。甚至兄弟部门像successfactor这样的巨型saas也是单体,其实这种应用拆成微服务反而会搞的bug满天飞。能跑,能抗住,就成了管他是不是微服务呢,同学说对不对

    2022-03-30 21:14:12

  • 6点无痛早起学习的和尚

    2021-12-24 08:23:43

    公司没有完全用开源那套微服务框架。
    微服务技术栈:
    内部调用:dirpc/thrift
    服务发现和注册:disf
    配置:Apollo(不是携程那个)
    限流熔断:911
    作者回复

    限流熔断叫911,这个框架起名我要给个老铁双击666啊。起名字的这老哥是个人才

    2021-12-25 00:16:59

  • 破发者

    2021-12-15 08:09:48

    老师,对于一些低延时的服务,比如转账、取款之类的处理,改造为微服务是否意味着交易耗时更长了,交易高并发时拥堵得更厉害了?
    作者回复

    微服务从总时间上肯定会拉长的,与本地方法调用相比,微服务无可避免的会在建立服务连接阶段发生网络损耗,当然还有一些api调用的授权检查(比如签名验签黑白名单)会拉长处理时间。但是相比单体应用来说,在同等算力的条件下,微服务也让你有更多的途径来更好的分配你的集群算力,比如给主链路上的服务做弹性机房,按需分配更多的计算资源,增加主链路服务的吞吐量来解决高并发的问题,这是扩大内需,很多大厂都有这类弹性方案

    2021-12-15 16:30:05

  • 小智

    2021-12-13 23:14:31

    老师写了一本书,可以买来看
    作者回复

    那本书是以netflix组件库为主,这门课以alibaba组件库为主:)

    2021-12-14 14:37:59

  • KaiFeng

    2021-12-14 03:49:46

    熟悉的声音再次响起,那个996福报,老城区改造……哈哈
    半仙老师,我来学习啦😀
    作者回复

    哦呦老同学呀,来来握个爪先。极客比较正经,我就入乡随俗了,这次讲课风格没以前那么浪了~别不习惯

    2021-12-14 14:31:10

  • 夏天

    2021-12-13 17:32:56

    这个课程什么时候能出完呀
    作者回复

    后面会以每周3篇的速度更新

    2021-12-13 23:40:26

  • Fan

    2022-02-21 19:04:25

    上游,下游业务的访问压力其中 上游, 下游是怎样区别的?数据的流动方向?
    作者回复

    其实就把这个理解为一个河流好了,上游水源地流向下游入海口,面相终点的一般叫做下游

    2022-02-23 23:50:05

  • 码小呆

    2022-02-13 20:01:03

    目前公司的根据不同的项目又用到不同的技术,有一些项目用到微服务技术,有一些项目没有用到微服务技术,不过都是已springboot为核心框架来做。
  • kimoti

    2021-12-14 16:57:10

    老师,微服务的数量有没有可能到几亿个微服务?
    作者回复

    感觉全球平均下来每几个人就分到一个微服务,这么牛逼的微服务,只能等着未来元宇宙来实现啦。

    2021-12-14 21:49:38

  • 缘分呐

    2021-12-13 23:44:42

    怎么搜不到:主链路规划 相关的内容?谁有这方面的资料?谢谢了
    作者回复

    课程会有相关加餐哦~

    2021-12-14 10:19:48

  • 201

    2021-12-13 19:13:59

    坐等更新