首页 > 其他分享 >2 01 | 是什么推动了单体应用到微服务架构的演进?

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

时间:2023-04-10 11:15:12浏览次数:33  
标签: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感兴趣的朋友。我是姚秋辰,我们下节课再见!

标签:01,服务,演进,迭代,单体,应用,架构,快速
From: https://www.cnblogs.com/PengChengLi/p/17302254.html

相关文章

  • 秒杀架构设计
    今天我们从7个不同的维度,讲讲秒杀系统的架构设计,主要知识点如下:Nginx+前后端分离+CDN缓存+网关(限流+熔断)集群的路由层+Redis(缓存热点数据、分布式锁)MQ集群业务处理层数据库层(读写分离、热点隔离)1.秒杀业务的特点  瞬间大量的刷新页面的操作瞬间大......
  • 01背包和完全背包
    01背包内层循环应从大到小完全背包内层循环应从小到大背包问题一般外层循环为物品,内层循环为背包对01背包来说可以交换顺序对于完全背包来说不可交换顺序,如在力扣518零钱兑换Ⅱ中,外层循环为物品,内层循环为背包求的是组合数;外层循环为背包,内层循环为物品求的是排列数。......
  • GhostDoc Enterprise.v2022.2.22190.VS2017-VS2022.Extension安装包分享
    这个网站似乎是屏蔽了中国大陆和中国香港的IP,不知道怎么想的。似乎是有点看不起我们?原版安装包v2022.2.22190,支持vs2017到vs2022,可以通过百度网盘下载。链接:https://pan.baidu.com/s/13hrjHHn_51RDUMiIcylu-A?pwd=dxym提取码:dxym -------------------------------------......
  • 分布式存储技术(下):宽表存储与全文搜索引擎的架构原理、特性、优缺点解析
    对于写密集型应用,每天写入量巨大,数据增长量无法预估,且对性能和可靠性要求非常高,普通关系型数据库无法满足其需求。对于全文搜索和数据分析这类对查询性能要求极高的场景也是如此。为了进一步满足上面两类场景的需求,有了宽表存储和搜索引擎技术,本文将对他们的架构、原理、优缺点做......
  • VS2019使用C语言进行websocket编程
    一直在写C#代码好多年不写C语言代码了,记录一下之前某个项目里用C写的一个websocket服务,用C的优势是写的东西体积小性能高,但是写业务的话还得用C#、Java之类的语言,不然会折腾死人。。。 用VisualStudio新建一个C++(因为不能直接建C语言项目)项目,我演示就创建一个控制台项目。项......
  • VS2013关闭调试而不关闭IIS Express
    在VS主面板打开:工具->选项->调试->编辑继续   取消选中[启用"编辑并继续"] 就OK了(英文版的请对应相应的操作)不过这是针对所有的调试,如果你想针对单个项目就还是保留VS的设置,直接去项目属性里设置在你的Web项目上右键->属性->Web 取消选中[启用"编辑并继续"] 就OK了......
  • MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
    MQTT(EMQX)-LinuxCentOSDocker安装MQTT概述MQTT(MessageQueueTelemetryTransport)是一个轻量级传输协议,它被设计用于轻量级的发布/订阅式消息传输,MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化。是一种简单、稳定、开放、轻量级易于实现的消息协议,在物联网......
  • 庄懂的技术美术入门01笔记
    前言:unity的全英文对我真的是劝退XD这算是真正意义上的第一篇博客,是以笔记的形式,主要是怕自己忘了,或许之后不定时还会对笔记内容进行总结再水一篇1.一般简单的渲染过程模型——输入结构——顶点shader——输出结构——像素shader——渲染结果①模型——输入结构将原模型转化......
  • 大数据经典论文解读 - Kafka - 流批一体架构
    Kafka大数据系统架构是什么样?为什么需要Kafka这样的桥梁作为连接?Kafka的系统设计与传统MQ有什么不同?如何实现分布式?如何动态添加Broker并通知上下游?有了Kafka和Storm后如何搭建流式处理系统?如何处理故障带来地数据不准确?RealtimeDataProcessingatFacebook从应用......
  • K8S架构原理详解
    Kubernetes是什么,为什么上手这么难? Kubernetes是一个基于容器技术的分布式集群管理系统。它是谷歌在大规模应用容器技术方面数十年经验的实际成果。因此,支持大规模的集群管理承载着非常多的组件,分布式本身的复杂度非常高。 Kubernetes到底有什么? 接下来我们一步步来看看K......