大型网络架构演化
架构演化过程:J2EE架构 -> SSH 架构 -> SSM 架构 -> 分布式架构 -> SOA 架构 ->微服务架构 ->前后端分离架构->云原生
- J2EE架构:在互联网发展的早期,J2EE(Java 2 Platform, Enterprise Edition)架构成为企业级应用的标准。它提供了一个多层的、分布式的应用模型,包含了Servlets、JavaServer Pages (JSP)、Enterprise JavaBeans (EJB)等技术。
- SSH架构:随着开发效率和可维护性的需求提升,SSH架构(Struts + Spring + Hibernate)开始流行。这一架构简化了J2EE的复杂性,通过Struts进行Web层的MVC设计,Spring管理业务对象及其依赖关系,Hibernate处理数据持久化。
- SSM架构:随后,SSM架构(Spring + SpringMVC + MyBatis)逐渐取代了SSH。SSM架构提供了更灵活的数据持久化方案,MyBatis相比Hibernate更加轻量级,且具有更高的定制性。
- 分布式架构:随着业务规模的扩大,单一服务器难以满足性能需求,分布式架构应运而生。它通过将应用拆分成多个服务,运行在不同的服务器上,实现了负载均衡和系统的高可用性。
- SOA架构:服务导向架构(SOA)强调服务的重用性和互操作性。它通过定义服务接口,使得不同的服务可以跨平台、跨语言进行通信,进一步提升了系统的灵活性和可扩展性。
- 微服务架构:微服务架构是SOA的进一步发展,它将应用程序划分为一组小的、独立的、松散耦合的服务,每个服务围绕具体的业务能力构建,可以独立部署和扩展。
- 前后端分离架构:随着Web应用的发展,前后端分离架构成为趋势。前端负责用户界面和用户体验,后端提供API接口处理业务逻辑和数据存储,两者通过JSON或XML等格式进行数据交互。
- 云原生架构:最终,随着云计算技术的发展,云原生架构成为新的趋势。它包括容器化、微服务、持续交付、DevOps等理念,使得应用能够最大化地利用云计算的弹性、可扩展性和敏捷性。
J2EE 架构
- Appliction Client(应用程序客户端):Application Client 是一种基于 Java 的客户端应用程序,它运行在客户端机器上,通常用于访问 J2EE 应用服务器上的 EJB(Enterprise JavaBeans)组件
- Java Applet(Java 小程序):Java Applet 是一种小型的 Java 程序,它嵌入在 HTML 页面中,并在支持 Java 的 Web 浏览器中运行。
- J2EE paltform(J2EE平台):标准化的、基于Java的企业级应用开发环境
- Servlet:Servlet是一种Java类,特别设计用来扩展服务器的能力,以响应客户端的请求,尤其是HTTP请求。
- JSP:允许在HTML页面中嵌入Java代码。
- EJB:是一种用于构建分布式、事务型、多用户的企业级应用程序的Java组件,用于实现业务逻辑。分为会话Bean、实体Bean和消息驱动Bean
SSH 架构
- SSH代表的是Struts + Spring + Hibernate
- Struts:负责Web层的控制器功能,处理HTTP请求并返回响应。
- Spring:负责业务逻辑层的管理,包括事务管理、依赖注入、AOP等。
- Hibernate:负责持久层,即数据访问层,通过ORM技术将Java对象映射到数据库表
SSM 架构
- SSM代表的是Spring MVC + Spring + MyBatis
- Spring MVC:是Spring框架的一部分,负责Web层的控制器功能,与Struts类似,但它更加模块化和灵活。
- Spring:在SSM中,Spring同样负责业务逻辑层的管理,包括事务管理、依赖注入、AOP等。
- MyBatis:负责持久层,与Hibernate不同,MyBatis是一个半ORM框架,它允许开发者直接编写SQL语句,提供了更细粒度的控制。
SSH 与SSM 架构的区别
- Web层框架:
- SSH使用Struts作为Web层框架,而SSM使用Spring MVC。
- Spring MVC通常被认为比Struts更灵活和强大,它提供了更好的类型安全和更少的XML配置。
- 持久层框架:
- SSH使用Hibernate作为ORM框架,而SSM使用MyBatis。
- Hibernate提供了全ORM解决方案,开发者不需要编写SQL语句,而MyBatis提供了更灵活的SQL管理,适合需要复杂SQL操作的场景。
- 配置和灵活性:
- SSH中的Struts和Hibernate都需要较多的XML配置,而SSM中的Spring MVC和MyBatis倾向于使用注解和Java配置,减少了XML的使用,提高了开发效率。
- Spring MVC和MyBatis的组合通常被认为在配置和定制方面更加灵活。
- 性能:
- MyBatis通常被认为在性能上优于Hibernate,因为它允许开发者直接控制SQL语句,避免了ORM框架可能带来的性能开销。
- Spring MVC相对于Struts也有性能上的优势,因为它更加轻量级。
- 社区和生态:
- SSH中的Struts由于安全问题(如Struts 2的漏洞)和较重的配置,其使用逐渐减少。
- SSM中的Spring MVC和MyBatis由于Spring框架的广泛使用和MyBatis的灵活性,它们在社区中的活跃度更高。
分布式架构
该分布式架构图展示的的重点在于加入了分布式通信处理层,它采用了消息中间件的方式将业务层和数据存储层解耦;同时可以支持实时数据操作以及非实时请求处理。
1. 分布式通信处理层
- 解耦业务与数据存储:通过集成消息中间件(如Apache Kafka或RabbitMQ),实现了业务逻辑层与数据存储层之间的解耦。这种方式提高了系统的灵活性和可维护性,使得各个组件可以独立开发和扩展。
- 消息驱动架构:采用基于消息的通信机制,确保了系统组件之间的松耦合和高内聚。消息中间件作为通信的桥梁,可以处理高吞吐量的数据传输,同时支持多种消息传递模式(如发布/订阅、点对点)。
2. 实时数据操作支持
- 高性能缓存:为了满足实时请求的性能要求,系统集成了高性能的缓存组件(如Redis或Memcached)。缓存用于存储热点数据,减少数据库访问延迟,显著提升系统响应速度。
- 数据同步机制:实现了一套高效的数据同步机制,确保缓存与数据库之间的数据一致性。这可能包括写入时更新缓存、缓存失效策略等。
3. 非实时请求处理
- 批处理与后台任务:对于非实时请求,系统采用批处理和后台任务处理机制。这些机制可以在系统负载较低时执行,有效利用资源,提高处理效率。
- 异步处理:非实时操作可以通过异步消息队列进行处理,这样即便在高并发情况下,也能保证系统的稳定性和响应性。
分布式架构演化过程
- 单体架构:应用程序、数据库、文件等所有资源都在一台服务器上
- 垂直架构:整个网站分为3台服务器:应用服务器、文件服务器和数据库服务器
- 本地缓存:缓存在应用服务器上的本地缓存
- 分布式缓存:缓存在专门的分布式缓存服务器上的远程分布式缓存
- 服务集群:通过负载均衡调度服务器,可以将来自用户浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多用户,就在集群中加入更多的应用服务器,使应用服务器的压力不再成为整个网站的瓶颈。
- 数据库读写分离:应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库这样当服务器读数据的时候,就可以通过从数据库获得数据。
- 反向代理:反向代理部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。
- CDN:CDN 部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据
- 分布式文件系统/分布式数据库:分布式文件系统/分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用
- 业务拆分:将一个网站拆分成许多不同的应用,每个应用独立部署
- 分布式服务:提取公用业务独立部署,应用系统只需要管理用户界面,通过分布式服务调用共用业务服务完成具体业务操作
SOA 面向服务架构
- SOAP:简单对象访问协议定义了服务请求者和服务提供者之间的消息传输规范
- WSDL:Web 服务描述语言是对服务进行描述的语言
- UDDI:统一描述、发现和集成,提供了一种服务发布、查找和定位的方法,是服务的信息注册规范
- ESB: 企业服务总线(Enterprise Service Bus,ESB)架构模式在于整合,可能是公司内部各团队的服务,也可能是公司之间的不同服务,组成一个整体,来向外提供服务
微服务架构
- 微服务架构,在软考架构师教材中被定义为面向服务架构(SOA)的一种去中心化的演进形式。
- nacos:是一个用于服务发现、配置管理和服务管理的开源平台,它是阿里巴巴公司开源的项目,主要服务于微服务架构和分布式系统
- 通信协议
- Dubbo:Dubbo是一个高性能、轻量级的开源Java RPC框架,由阿里巴巴开源。它主要用于解决分布式系统中服务之间的调用问题.
- fegin:Feign是一个声明式的、模板化的HTTP客户端,用于简化HTTP接口的调用
- REST API:是一种基于REST架构风格的网络API,用于Web服务和Web应用程序之间的交互
前后端分离架构
- 将前端和后端分为两个不同项目,前后端工程师需要约定交互接口,实现并行开发,加快项目整体的开发效率。
- 前后端分离已成为互联网项目开发的业界标准使用方式,将前端和后端的开发进行解耦。并且前后端分离会为以后的大型分布式架构、微服务架构、多端化服务(各种客户端,比如浏览器、车载终端、安卓、IOS等)打下坚实的基础
- 前端核心技术:
- Node.js:Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。它允许开发者使用 JavaScript 编写服务器端脚本,运行在服务器上。
- npm:npm 是 Node.js 的默认包管理器,也是世界上最大的软件注册库
- Ajax:Ajax 是一种用于创建交互式网页的技术,它可以在不重新加载整个页面的情况下与服务器交换数据和更新部分网页内容。Ajax 技术是前后端分离架构的基础。
- 三大主流前端框架:
- React:React 是由 Facebook 开发并维护的一个用于构建用户界面的 JavaScript 库。它于 2013 年发布,并迅速成为最受欢迎的前端框架之一。
- Vue.js:Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面,特别是单页应用程序(SPA)。它由尤雨溪于 2014 年创建,并且随着时间的推移,社区和生态系统都在迅速发展。
- Angular:Angular.js(也称为 Angular 1.x)是由 Google 开发的一个开源的 Web 应用框架。Angular(2及以后版本)发布于2016年,Angular(通常指的是 Angular 2+)引入了许多新的概念和改进,例如 TypeScript 的使用、组件化架构、更强大的模块系统等
- 应用层/API网关:应用层网关是一种网络服务,它在应用层上操作,可以理解并处理特定应用程序的协议和数据。API网关是一个管理API调用的服务器,它是服务端点请求处理的一个中心点,用于转发请求到相应的服务实例。它可以提供路由、协议转换、身份验证、限流、监控、缓存等功能。
云原生架构
在探索云原生架构之前,首先需要理解其背后的三级服务支持模型,即:
- IaaS(基础设施即服务):提供基础的计算、存储和网络资源,用户可以在此之上部署和运行各种应用程序。
- PaaS(平台即服务):为开发者提供一整套开发工具和运行环境,简化了应用程序的部署和管理过程。
- SaaS(软件即服务):通过互联网提供软件应用,用户无需安装和维护,直接在线使用。
云原生架构的构建依赖于以下三大核心技术:
- 微服务架构:通过将应用程序分解为独立的、可协作的微服务,提高了系统的可伸缩性和可维护性。
- 容器技术:利用容器化技术以及容器编排技术,如Docker和Kubernetes,实现应用程序的轻量级、可移植和隔离的运行环境。
- DevOps:通过DevOps的自动化和持续集成/持续部署(CI/CD)流程,加速软件开发和交付,确保高质量的软件产品。
技术实现:
- docker:Docker是一个开源的应用容器引擎,它允许开发者打包他们的应用及其依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows机器上,实现快速部署和扩展。
- Kubernates:Kubernetes(K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了跨多个主机的容器集群管理能力。
- zookeeper:ZooKeeper是一个开源的分布式协调服务,用于维护配置信息、命名服务、分布式同步和集群管理。它通常用于分布式应用中的协调和一致性保证。
- jenkins:Jenkins是一个开源的自动化服务器,主要用于持续集成和持续交付/部署(CI/CD)。它支持各种自动化任务,如构建、测试和部署软件。
- APM:APM(Application Performance Management)是一种监控和管理应用程序性能的工具和方法论,旨在帮助IT运维团队检测和诊断应用程序的性能问题。
- BPM:BPM(Business Process Management)是一套用于建模、执行、监控和优化业务流程的管理实践和技术。它帮助企业更有效地管理和改进其业务流程。
ServerMesh + ServerLess 架构
- ServerMesh : ServerMesh 是一种新兴的网络架构概念,它借鉴了服务网格(Service Mesh)的理念,并将其扩展到服务器层面。在 ServerMesh 架构中,服务器的网络流量被抽象化,并且通过一个控制平面进行管理。这允许更细粒度的网络控制、监控和安全性。ServerMesh 的目标是简化分布式系统的网络管理,提高系统的可靠性和性能.
- ServerLess: Serverless 是一种云计算的执行模型,在这种模型中,云提供商自动管理基础架构,让开发者可以专注于编写和部署代码,而不必担心服务器或底层硬件的管理。
- 应用托管服务:应用托管服务,由专业第三方提供商所提供,旨在托管、部署及管理应用程序。这类服务以组件化的形式,增强了系统的非功能性质量特性,如可伸缩性、可靠性和安全性。通过这些服务,开发者得以将精力集中于应用程序的开发和创新,而无需分心于底层基础架构的运维细节。
阿里云原生架构
- EDAS(企业级分布式应用服务):EDAS是一个企业级的应用管理平台,支持微服务架构和分布式系统的开发、部署、监控和运维。
- SAE(Serverless应用引擎):SAE是一个全托管、免运维的Serverless平台,允许开发者专注于业务代码,无需管理底层服务器
- CSB(云服务总线):CSB是一种企业服务总线,用于连接、管理和集成云服务,支持服务之间的数据交换和流程编排
- GTS(全局事务服务):GTS提供分布式事务的最终一致性解决方案,确保分布式系统中的数据一致性
- 消息队列
- RocketMQ:一种分布式消息中间件,用于处理大规模消息的传输
- Kafka:基于Apache Kafka构建的托管消息队列服务,适用于大数据场景
- MQTT:一种轻量级的消息协议,适用于物联网(IoT)设备
- AMQP:基于高级消息队列协议的消息队列服务,用于企业级消息传递
- ARMS(应用实时监控服务):ARMS提供实时监控、故障排查和性能管理服务,帮助开发者发现并解决问题
- PTS(性能测试服务):PTS是一种云上的性能测试服务,用于模拟用户行为进行压力测试,评估系统的性能瓶颈
- AHAS(应用高可用服务):混沌工程,AHAS提供应用的高可用性保障,包括限流、降级和熔断等机制
- APDS(应用性能诊断服务):APDS帮助开发者分析和诊断应用性能问题,提升应用性能
- ECS(弹性计算服务):ECS提供可扩展的计算资源,用户可以根据需求创建和管理云服务器
- SLB(负载均衡):SLB分布网络流量到多个ECS实例,提高应用的可用性和可靠性
- VPC(虚拟私有云):VPC允许用户在阿里云上创建一个隔离的网络环境,类似于传统数据中心的网络
- ACK(阿里云容器服务Kubernetes版):ACK是基于Kubernetes的容器管理服务,支持容器化应用的部署、管理和扩展
- OSS(对象存储服务):OSS提供大容量的、高可靠性的云存储服务,适用于数据备份、归档和大数据分析
- ACS(访问控制系统):ACS是一种安全管理系统,用于控制用户和应用程序对云资源的访问
- SLS(日志服务):SLS提供日志收集、存储、查询和分析服务,帮助用户了解应用和系统的运行状况