前言

如果一个JAVA开发人员,不了解常见架构的演进,肯定会制约自己技术的选型和晋升空间。这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面。(如有说的不对之处还望指正)

一、单体架构

单体架构比较初级,典型的三级架构,前端(Web/手机端)+中间业务逻辑层+数据库层。这是一种典型的Java Spring mvc或者Python Django框架的应用。其架构图如下所示:

单体架构的应用比较容易部署、测试, 在项目的初期,单体应用可以很好地运行。然而,随着需求的不断增加, 越来越多的人加入开发团队,代码库也在飞速地膨胀。慢慢地,单体应用变得越来越臃肿,可维护性、灵活性逐渐降低,维护成本越来越高。
下面是单体架构应用的一些缺点:

**1.复杂性高:**以一个百万行级别的单体应用为例,整个项目包含的模块非常多、模块的边界模糊、 依赖关系不清晰、 代码质量参差不齐、 混乱地堆砌在一起。可想而知整个项目非常复杂。每次修改代码都心惊胆战, 甚至添加一个简单的功能, 或者修改一个Bug都会带来隐含的缺陷。

**2.技术债务:**随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务, 并且越积 越多。“ 不坏不修”, 这在软件开发中非常常见, 在单体应用中这种思想更甚。已使用的系统设计或代码难以被修改,因为应用程序中的其他模块可能会以意料之外的方式使用它。

**3.部署频率低:**随着代码的增多,构建和部署的时间也会增加。而在单体应用中, 每次功能的变更或缺陷的修复都会导致需要重新部署整个应用。全量部署的方式耗时长、 影响范围大、 风险高, 这使得单体应用项目上线部署的频率较低。而部署频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错率比较高。

**4.可靠性差:**某个应用Bug,例如死循环、内存溢出等, 可能会导致整个应用的崩溃。

**5.扩展能力受限:**单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的CPU;有的模块则是IO密集型的,需要更大的内存。由于这些模块部署在一起,不得不在硬件的选择上做出妥协。

**6.阻碍技术创新:**单体应用往往使用统一的技术平台或方案解决所有的问题, 团队中的每个成员 都必须使用相同的开发语言和框架,要想引入新框架或新技术平台会非常困难。

二、分布式应用

大型互联网架构演进过程
架构师应具备的分布式知识
主流分布式架构设计详解

文末有架构图集领取
中级架构,分布式应用,中间层分布式+数据库分布式,是单体架构的并发扩展,将一个大的系统划分为多个业务模块,业务模块分别部署在不同的服务器上,各个业务模块之间通过接口进行数据交互。数据库也大量采用分布式数据库,如redis、ES、solor等。通过LVS/Nginx代理应用,将用户请求均衡的负载到不同的服务器上。其架构图如下所示:

分布式架构
该架构相对于单体架构来说,这种架构提供了负载均衡的能力,大大提高了系统负载能力,解决了网站高并发的需求。另外还有以下特点:

**1.降低了耦合度:**把模块拆分,使用接口通信,降低模块之间的耦合度。

**2.责任清晰:**把项目拆分成若干个子项目,不同的团队负责不同的子项目。

**3.扩展方便:**增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。

**4.部署方便:**可以灵活的进行分布式部署。

**5.提高代码的复用性:**比如service层,如果不采用分布式rest服务方式架构就会在手机wap商城,微信商城,pc,android,ios每个端都要写一个service层逻辑,开发量大,难以维护一起升级,这时候就可以采用分布式rest服务方式,公用一个service层。
缺点 : 系统之间的交互要使用远程通信,接口开发增大工作量,但是利大于弊。

三、微服务架构

服务的前世今生
基于分布式思想下的RPC解决方案
Dubbo应用及源码解读
SpringBoot
SpringCloud应用及源码解读
Docker虚拟化技术

文末领取清晰图片
微服务架构,主要是中间层分解,将系统拆分成很多小应用(微服务),微服务可以部署在不同的服务器上,也可以部署在相同的服务器不同的容器上。当应用的故障不会影响到其他应用,单应用的负载也不会影响到其他应用,其代表框架有Spring cloud、Dubbo等。其架构图如下所示:

微服务架构
**1.易于开发和维护:**一个微服务只会关注一个特定的业务功能,所以它业务清晰、代码量较少。开发和维护单个微服务相对简单。而整个应用是由若干个微服务构建而成的,所以整个应用也会被维持在一个可控状态。

**2.单个微服务启动较快:**单个微服务代码量较少, 所以启动会比较快。

**3.局部修改容易部署:**单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。

**4.技术栈不受限:**在微服务架构中,可以结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,可以使用Neo4j;甚至可根据需要,部分微服务使用Java开发,部分微服务使用Node.js开发。
微服务虽然有很多吸引人的地方,但它并不是免费的午餐,使用它是有代价的。使用微服务架构面临的挑战。

**1.运维要求较高:**更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行。而在微服务中,需要保证几十甚至几百个服务服务的正常运行与协作,这给运维带来了很大的挑战。

**2.分布式固有的复杂性:**使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战。

**3.接口调整成本高:**微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。

**4.重复劳动:**很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。尽管可以使用共享库来解决这个问题(例如可以将这个功能封装成公共组件,需要该功能的微服务引用该组件),但共享库在多语言环境下就不一定行得通了。

四、云原生架构

云计算从工业化应用到如今,已走过十五个年头,然而大量应用使用云的方式仍停滞在传统 IDC 时代: 虚拟机代替了原来的物理机:使用文件保存应用数据,大量自带的三方技术组件,没有经过架构改造(如 微服务改造)的应用上云,传统的应用打包与发布方式等等。对于如何使用这些技术,没有绝对的对与错, 只是在云的时代不能充分利用云的强大能力,不能从云技术中获得更高的可用性与可扩展能力,也不能 利用云提升发布和运维的效率,是一件非常遗憾的事情。
因此云的时代需要新的技术架构,来帮助企业应用能够更好地利 用云计算优势,充分释放云计算的技术红利,让业务更敏捷、成本更低的同时又可伸缩性更灵活,而这 些正好就是云原生架构专注解决的技术点。

云原生优势
**1.代码结构发生巨大变化:**在云的环境中,比如“如何获取存储”变成了若干服务,包括对象存储服务、块存储服务和没有随机 访问的文件存储服务。云不仅改变了开发人员获得这些存储能力的界面,还在于云产品在这些 OpenAPI 或者开源 SDK 背后把分布式场景中的高可用挑战、自动扩缩容挑战、安全挑战、运维升级挑战等都处理了

**2.非功能性特性的大量委托:**不能说云计算解决了所有非功能性问题,但确实大量非功能性特性,特别是分布式环境下复杂非功能 性问题,被云产品处理掉了以大家最头疼的高可用为例,云产品在多个层面为应用提供了解决方案:

  • 虚机:当虚机检测到底层硬件异常时,自动帮助应用做热迁移,迁移后的应用不需重新启动而仍然具备对外服务的能力,应用对整个迁移过程都不会有任何感知;
  • 容器:有时应用所在的物理机是正常的,只是应用自身的问题(比如 bug、资源耗尽等)而无法正常 对外提供服务。容器通过监控检查探测到进程状态异常,从而实施异常节点的下线、新节点上线和生产流量的切换等操作,整个过程自动完成而无需运维人员干预;
  • 云服务:如果应用把“有状态”部分都交给了云服务(如缓存、数据库、对象存储等),加上全局对
    象的持有小型化或具备从磁盘快速重建能力,由于云服务本身是具备极强的高可用能力,那么应用本身会变成更薄的“无状态”应用,因为高可用故障带来的业务中断会降至分钟级;如果应用是 N-M 的对等 架构架构模式,那么结合Load Balancer 产品可获得几乎无损的高可用能力!

**3.高度自动化的软件交付:**基于云原生的自动化软件交付相比较当前的人工软件交付是一个巨大的进步。以微服务为例,应用微 服务化以后,往往被部署到成千上万个节点上,如果系统不具备高度的自动化能力,任何一次新业务的 上线,都会带来极大的工作量挑战,严重时还会导致业务变更超过上线窗口而不可用。

对于云原生架构,由于文章限制没有全部展示出来,那如果有感兴趣了解的老友们呢…可以私信我【架构】获取,喜欢小编的分布式、微服务系统图的也能分享给大家哦~小编对架构体系做了一系列的系统图,很开心能分享给大家!