事实上,我个人对单体到微服务架构的演进尽管能够理解,但总是觉得差点意思,所以这边在学习之余,顺便写个笔记总结一下,加深一下印象吧。
系列上一篇文章:《【微服务专题】SpringBoot自动配置简单源码解析》
别看微服务架构牛逼哄哄的样子,但真要从市场上来说:没有最好的架构,只有最合适的架构。存在即合理。
通常来说,我们认为架构发展历史经历了这样一个过程:单体架构 ->
垂直架构 ->
SOA面向服务架构 ->
微服务架构。
接下来,我们从每个架构的特点,以及遇到的问题、如何解决等角度来给大家介绍一下每个架构。
基本介绍
单体架构嘛,我们普通Java程序员接触过最多的一种架构模式了。简单来说就是一个SpringBoot应用,通常来说,所有的业务功能都部署在一块,这样可以减少开发、部署和维护的成本。
特点
所有功能模块都在一个应用里面,一旦应用宕机、或者正常运维关闭启动期间,所有服务都不可用
项目小的时候是这样,项目大的时候你就会戴上痛苦面具了
缺点
下面说的缺点,也正是这个架构在演进当中面临的挑战
我们公司现在的架构局部来说就是这样,ALL-IN-ONE,每次打包编译启动都要7、8分钟,好一点的机器也是5、6分钟。这基本注定了,你不能在高峰期重启服务,一旦重启就是生产事故
这一点我个人认为可能是最重要的一点。还是拿我公司现在的项目来说,某些模块其实负载特别大,但由于项目架构的问题,没办法精准分配流量、硬件资源等,多少是有点浪费的
不过,在单体架构的演进过程中,首先遇到的问题并非模块化问题,而是随着用户量越来越大,网站的访问量不断增大,导致后端服务器的负载越来越高!
还是拿我们公司举例:我们从17年刚开始踏足团餐领域的时候,没多少个客户,所以一台服务器就解决了。但是随着业务的扩张,我们全国已经有8000+的客户,分布在全国各地,无论是从硬件资源,还是运维部署来看,一台服务器肯定不行的。这时候,我们公司就开始了水平扩张的演进。
严格来说还是属于单体架构,只不过做了水平拓展而已,架构图如下:
当然,随着业务深入,我们公司也开始了一些其他尝试。以前所有功能都写在一个工程目录下,迭代了6、7年之后,我的大佬们应该也无法忍受了,你懂的。五花八门的代码,别具一格的代码风格,使得维护、升级改造成本极高!所以,渐渐的,一些比较独特的业务也被抽离出来单独部署一台服务器,这种架构方式我们可以称之为:垂直架构。
基本介绍
所谓水平拓展:多个一摸一样内容的应用
所谓垂直拓展:简单来说专服专用。从业务的垂直领域进行拆分,减少业务的耦合度,以及降低单个war包带来的伸缩性困难问题
特点
专服专用
优点
缺点
这个我深有体会。由于只是简单的垂直架构,也没有接入熔断器之类的东西,所以其中一个环节出错,对调用方的影响是巨大的!特别是在日志不全,报错提示又不友好的前提下,排查问题想当麻烦
但其实在我们公司的垂直架构开发中,我个人还是遇到了一些很让人无奈的问题。诸如:
基于上述这些缺点及问题,于是有人提出了SOA架构。
SOA(Service-Oriented Architecture),也就是面向服务的架构。在SOA中,会采用ESB(企业服务总线)来作为系统和服务之间的通信桥梁,ESB本身还提供服务地址的管理、不同系统之间的协议转化和数据格式转化等。调用端不需要关心目标服务的位置,从而使得服务之间的交互是动态的,这样做的好处是实现了服务的调用者和服务的提供者之间的高度解耦。
总的来说,SOA主要解决的问题是:
特点
优点
缺点
引入了更多中间件,意味着系统复杂度会上升。比如引入redis、mq等,这两个玩意,在没有做高可用的情况下,任何一个崩溃了都会导致服务雪崩。
其实上面说的缺点咱也不知道这算不算缺点,百度是这么说的。但是不可否认的是,随着更多系统、中间件的引入,不可避免地增加了运维成本。
严格来说,微服务架构算是SOA架构的进一步优化,它更加强调服务的【彻底拆分】。面向服务(SOA)和微服务本质上都是服务化思想的一种体现。从架构图来看,微服务其实就是一个SOA下面包含多个SOA,然后最小的SOA就是一个微服务。
伴随着服务粒度的细化,会导致原本10个服务可能拆分成了100个微服务,一旦服务规模扩大就意味着服务的构建、发布、运维的复杂度也会成倍增加,所以实施微服务的前提是软件交付链路及基础设施的成熟化。
由于SOA和微服务两者的关注点不一样,造成了这两者有非常大的区别:
微服务架构就是将每个具体的业务服务构成可独立运行的微服务,每个微服务只关注某个特定的功能,服务之间采用轻量级通信机制REST API进行通信。
优点
缺点
微服务架构主要的目的是实现业务服务的解耦。随着公司业务的高速发展,微服务组件会越来越多,导致服务与服务之间的调用关系越来越复杂。同时,服务与服务之间的远程通信也会因为网络通信问题的存在变得更加复杂,比如需要考虑重试、容错、降级等情况。那么这个时候就需要进行服务治理,将服务之间的依赖转化为服务对服务中心的依赖。除此之外,还需要考虑:
这些都需要对应的技术来实现,我们是自己研发还是选择市场上比较成熟的技术拿来就用呢?如果市场上有多种相同的解决方案,应该如何做好技术选型?
业内比较主流的微服务解决方案进行分析,主要包括:
毫无疑问,我们选择Spring Cloud Alibaba
Spring Cloud提供了一些可以让开发者快速构建微服务应用的工具,比如配置管理、服务发现、熔断、智能路由等,这些服务可以在任何分布式环境下很好地工作。Spring Cloud主要致力于解决如下问题:
需要注意的是,Spring Cloud并不是Spring团队全新研发的框架,它只是把一些比较优秀的解决微服务架构中常见问题的开源框架基于Spring Cloud规范进行了整合,通过Spring Boot这个框架进行再次封装后屏蔽掉了复杂的配置,给开发者提供良好的开箱即用的微服务开发体验。不难看出,SpringCloud其实就是一套规范,而Spring Cloud Netflix、Spring Cloud Alibaba才是Spring Cloud规范的实现。
Alibaba的开源组件在服务治理上和处理高并发的能力上有天然的优势,毕竟这些组件都经历过数次双11的考验,也在各大互联网公司大规模应用过。所以,相比Spring Cloud Netflix来说,SpringCloud Alibaba在服务治理这块的能力更适合于国内的技术场景,同时,Spring Cloud Alibaba在功能上不仅完全覆盖了Spring Cloud Netflix原生特性,而且还提供了更加稳定和成熟的实现
SpringCloud版本说明
SpringClound与SpringBoot版本对应关系:
组件版本关系:
比如,我现有项目SpringBoot版本是:2.6.4,故选择2021.0.1.0版本的SpringCloud。所以选择的组件本本分别如下: