架构设计是研发最核心的环节,也是架构师的必备技能,下面我就全面来详解@mikechen
架构设计定义
架构设计:是指在软件系统开发过程中,对系统整体结构、组件之间的关系、模块的划分…等方面进行设计、和规划的过程。
这一过程会涉及到:对系统的需求分析、设计决策、技术选型、模块划分、接口定义、单元测试、性能优化…等多个方面。
如下图所示:
一个好的架构设计,能够保证系统具有良好的可维护性、可扩展性、可靠性和性能,是应用建设里面的最核心环节。
架构设计模式
随着互联网的发展软件架构,从单体架构、到分布式…到如今基础设施的变革,我们迎来了云原生时代。
在云原生时代,软件架构已经不再局限于单体、或分布式架构,而是更加注重将应用程序、与云计算环境无缝集成。
以实现更高的敏捷性、弹性和可靠性,整体上架构设计模式,主要分为如下几类:
1、单体架构
单体架构(Monolithic Architecture)是一种传统的软件架构模式,它将整个软件系统构建为一个单一的、统一的应用程序。
在单体架构中,所有的功能模块、和组件都集中在同一个代码库中,并部署在同一个运行环境中。
如下图所示:
单体架构的设计简单直观,适合小型的应用程序或初创阶段的项目。
但随着应用程序规模的扩大和业务的复杂性增加,单体架构逐渐显露出了性能瓶颈、可扩展性差、耦合度高…等问题。
如果当单体架构的局限性会逐渐显现出来,此时通常需要考虑采用分布式架构、或者云原生架构来解决这些挑战。
2、分层架构
分层架构(Layered Architecture)是一种常见的软件架构模式,也被称为水平分层架构、或分层式架构。
在分层架构中,软件系统被划分为多个水平层次(或称为层)。
每个层次都具有特定的功能和责任,并且每个层次之间的交互是单向的,上层层次可以调用下层层次的服务。
最常见的就是是四层结构,如下图所示:
- 表示层(Presentation Layer):表示层负责与用户进行交互,展示数据给用户并接收用户的输入,它包括用户界面设计、页面渲染、用户输入处理等功能。
- 应用层(Application Layer):应用层是系统的核心层,负责实现系统的业务逻辑和流程,它包括应用程序的主要功能和业务规则,协调各个子系统之间的交互。
- 领域层(Domain Layer):领域层包含了系统的领域模型和业务对象,负责实现系统的业务逻辑,它包括了系统的核心业务规则和数据处理逻辑。
- 数据访问层(Data Access Layer):数据访问层负责与数据存储进行交互,包括:数据库的读写操作、数据模型的映射等功能。
由于每个层次都是独立的,因此可以更容易地实现功能的复用,提高了系统的重用性和开发效率。
3.事件驱动架构
事件驱动架构(Event-Driven Architecture,EDA)是一种软件架构模式,其中系统的不同组件之间通过事件进行通信和协作。
事件驱动架构,通过事件的发布、和订阅机制实现了组件之间的松耦合,可以更容易地进行功能扩展和系统升级。
事件驱动架构通常,包括以下几个关键组件:
分别是:
- 事件生产者(Event Producer):负责产生、和发布事件到事件总线、或消息队列中。
- 事件总线(Event Bus):用于传输、和分发事件到订阅者。
- 事件订阅者(Event Subscriber):订阅感兴趣的事件,并在事件发生时接收、和处理事件。
- 事件处理器(Event Handler):用于处理接收到的事件,执行相应的业务逻辑。
事件驱动架构适用:于需要实现解耦、异步通信、实时处理等功能的系统,
特别适合于复杂、分布式和实时性要求高的应用场景,如大规模数据处理、实时监控、和分布式系统集成等。
3.MVC架构
MVC架构是一种常见的软件架构模式,用于构建交互式的应用程序,例如:Web应用程序、和桌面应用程序。
MVC架构将应用程序分为三个核心组件:Model(模型)、View(视图)和Controller(控制器)。
如下图所示:
- Model(模型):模型负责表示应用程序的数据和业务逻辑,它通常包括数据结构、数据库操作、业务规则以及数据的验证和处理。
- View(视图):视图负责展示模型中的数据给用户,并接收用户的输入,它通常包括用户界面的设计、布局、样式和交互等内容。
- Controller(控制器):控制器负责处理用户的输入、和请求,并根据需要更新模型、和视图。
应用场景:
MVC架构,被广泛应用于构建Web应用程序,并成为了许多流行的Web框架和平台的核心设计理念。
4.微服务架构
微服务架构(Microservices Architecture),是将应用程序划分为一组小型、自治的服务,每个服务都专注于执行一个特定的业务功能。
如下图所示:
微服务架构,会涉及到如下组件:
1、服务注册与发现(Service Discovery)
服务注册与发现组件,用于注册和发现微服务的位置、和实例信息。
2、API 网关(API Gateway)
API 网关是一个入口点,用于接收客户端的请求并将请求路由到适当的微服务。
API 网关可以处理请求路由、负载均衡、安全认证、请求转换等功能,并提供统一的接口给客户端。
3、负载均衡(Load Balancer)
负载均衡组件,用于分发客户端请求到多个服务实例中,以实现请求的负载均衡和高可用性。
负载均衡可以基于不同的策略进行请求分发,如:轮询、随机、权重….等。
4、配置中心(Configuration Center)
配置中心用于集中管理微服务的配置信息,如:数据库连接信息、服务端口、日志级别等。
5、服务监控与管理
服务监控与管理组件,用于监控和管理微服务的运行状态和性能指标,它可以收集服务的日志、指标和追踪信息。
5.云架构
云架构(Cloud architecture),又称云计算架构,是指如何整合各种技术和服务,以在云环境中构建应用程序和系统。
云架构的设计需要,考虑到云服务模型(如:IaaS、PaaS、SaaS)。
如下图所示:
1、IaaS(Infrastructure as a Service)基础设施即服务
IaaS提供了基础的计算、存储和网络资源,用户可以通过虚拟化技术使用这些资源,构建自己的应用程序和环境。
2、PaaS(Platform as a Service)平台即服务
PaaS提供了应用程序开发和部署所需的平台和工具,包括:开发工具、数据库、消息队列、Web服务器等。
用户可以在PaaS平台上开发、测试和部署应用程序,无需关心底层的基础设施。
3、SaaS(Software as a Service)软件即服务
SaaS提供了基于云的应用程序服务,用户通过互联网访问并使用这些应用程序,无需安装、配置或管理任何软件。
典型的SaaS应用程序,包括:电子邮件服务(如Gmail)、办公套件(如Google Docs、Microsoft Office 365)、客户关系管理(CRM)系统(如Salesforce)等。
总之,IaaS、PaaS和SaaS是云计算服务模型的三种主要形式,它们提供了不同级别的云服务。
架构设计六大原则
架构设计都会涉及到原则,以下是常见的6大设计原则:
1.单一职责原则
每个模块、或组件应该只有一个单一的责任,这样可以使系统更加清晰和易于理解,减少代码的复杂度。
2.接口隔离原则
接口隔离原则,它指导着如何设计接口,以及如何将接口进行划分,以使得系统更加灵活、可扩展和易于维护。
接口隔离原则的核心思想是:
- 客户端不应该强制依赖于,它不需要的接口。
- 接口应该小而精简,满足客户端的特定需求,而不是提供过多的功能。
通过遵循接口隔离原则,可以使得系统的组件之间的耦合度降低,提高系统的灵活性和可维护性。
3.依赖倒置原则
依赖倒置原则(Dependency Inversion Principle),简称DIP,是面向对象设计中的一项原则。
依赖倒置原则,它指导着如何设计软件组件之间的依赖关系。
主要会涉及到:
- 高层模块不应该依赖于,低层模块,而是应该依赖于抽象。
- 抽象不应该依赖于具体实现细节,而是具体实现细节应该依赖于抽象。
4.里氏替换原则
里氏替换原则要求子类对象,能够替换父类对象,并且不影响系统的功能正确性。
换句话说,子类应该保持与父类一致的行为,而且在任何使用父类的地方都应该能够安全地替换为子类对象。
5.开闭原则
开闭原则,指导着如何设计软件系统使得系统对扩展开放,对修改关闭。
比如:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
换句话说,软件系统的设计应该允许在不修改现有代码的情况下,进行功能扩展。
6.迪米特法则
迪米特法则也称为最少了解原则,它要求对象之间的通信应该尽可能的简单,并且对象不应该直接与陌生对象通信。
作者简介
陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》