什么是 SOA 架构

SOA(Service-Oriented Architecture) 架构是面向服务的架构,是一种将单体应用粗粒度的划分为服务的架构,其核心是将业务功能抽象为独立、可重用、松耦合的服务,也就是将业务功能通过 IT 技术封装为服务,并通过标准化的接口

进行发布、查找和调用,从而达到构建灵活的企业 IT 应用系统。

从应用技术开发层面来看,就是将应用程序的功能模块以独立、分布式、可复用的服务的形式组织起来,然后通过标准的接口和契约,使不同的服务能够跨平台、跨语言、跨系统集成,组成企业的各种应用系统。

集成通常是依赖企业服务总线(ESB)来实现服务间的通信和集成。

这里的 “服务”,业务层面指的是能执行完整的、独立的业务功能;程序层面指的是包含完整的代码和数据,是一个独立的功能单元。

SOA 的目标是提高企业 IT 资产的重用性,降低企业 IT 系统集成成本,提高业务灵活性和 IT 响应速度。

在 SOA 架构中,所有组件都是独立自主的,能为其它组件提供服务。

SOA 架构示意图:

SOA 架构发展三阶段

SOA(Service-Oriented Architecture,面向服务的架构)的概念最早由 Gartner 公司在 1996 年提出。

当时,软件技术和市场环境尚未成熟,SOA 并未被广泛实施和关注。

随着互联网的兴起和电子商务的快速发展,企业业务逐渐向互联网迁移,推动了对灵活、可复用服务的需求。

Web 服务的出现为 SOA 的实现提供了技术基础,尤其是基于 XML、SOAP、WSDL 等标准的 Web 服务技术,使得跨平台、跨语言的服务调用成为可能。

第一阶段:孕育阶段

SOA(Service-Oriented Architecture,面向服务的架构)的概念最早由 Gartner 公司在 1996 年提出,但是当时技术尚不成熟,未被广泛实施。

第二阶段:标准化阶段

随着 Web 服务标准的确立(如 SOAP、WSDL、UDDI),SOA 开始被企业关注和应用,形成较为成熟的技术规范体系。

第三阶段:成熟应用阶段

2005 年以后,SOA 推广加速,厂商联合制定中立标准(如 WS-Policy),并将关注点扩展到安全、业务流程和事务处理等领域。

单体架构出现的问题

对于小型项目或初创项目,单体架构具有开发速度快、修改简单、部署方便等优点。

但是,随着业务的快速发展,业务的复杂性也随着增加,单体架构的弊端也逐渐显现:

代码库膨胀

随着业务功能不断增加,单体代码库的代码量会随之增加,直到膨胀。这也会导致代码结构变得复杂、代码间的耦合也越来越紧密。

可用性受限

任何小的改动都可能影响到整个系统的可用性,一个小的代码修改可能导致整个系统出现问题,“牵一发而动全身”。

代码维护困难

第一新加入的开发人员需要花费大量的时间来理解整个系统,代码量大理解代码变的困难。

第二修改 bug 时,一个小的错误可能导致整个系统崩溃,影响系统可用性。

扩展性瓶颈

单体架构通常只能进行整体扩展,无法针对某个高负载的业务功能模块进行独立扩展,因为整个系统功能代码都是耦合在一起。

开发与部署效率低下

  • 多个团队同时在一个大型代码库中开发,修改、增加代码,容易产生代码冲突。

  • 每次功能更新都需要重新构建、测试和部署整个应用,发布周期长,效率低下。

为了解决单体架构在大型企业应用中日益突出的问题,面向服务的架构(SOA) 就应运而生。

SOA 如何解决单体架构问题

SOA 通过将单体应用拆分成松耦合、自治的服务单元来解决上述问题:

  • 服务封装与松耦合:SOA 将业务功能封装成独立的服务,服务之间通过标准接口和协议来通信,降低模块之间耦合度,便于维护和升级。

  • 复用性:将公共业务功能封装为独立服务可以被多个业务模块、应用复用,业务应用通过服务编排灵活组合,支持企业业务快速发展。

  • 业务敏捷性:业务功能变化时,只需要修改相关的服务,不影响系统其它部分。

  • 独立部署与扩展:虽然 SOA 的服务粒度较粗,但是服务可以独立部署,也支持热点服务的扩展,提升系统的伸缩性。

  • 技术异构:服务之间的通信遵循一些协议标准,比如 SOAP 、WSDL 等,能够实现技术异构系统之间的通信。

  • 集中治理和标准化:通常通过企业服务总线(ESB)统一治理、安全、路由等,SOA 推动了服务标准的制定。

SOA 架构出现的问题

ESB 复杂度高:ESB 本身可能成为单点故障和性能瓶颈,其开发、部署和维护成本高。

部署与扩展困难:SOA 架构中的服务划分比较粗粒度,导致服务间的强依赖,部署和独立扩展较为困难,灵活性没有微服务高。

服务治理复杂:在大型 SOA 系统中,服务的版本管理、依赖管理、监控等治理工作面临挑战。

SOA 中的规范定义带来过度的复杂性,落地成本非常之高。SOAP 实现的 Web Service,在性能上和易用性上并不完美。

虽然定义了庞大的 Web Service 协议家族,通过标准协议实现了不同系统之间的通信,但是它们的学习、使用成本都非常高。

微服务架构

微服务架构可以看作是在 SOA 基础上的一种更细粒度的服务拆分和实现方式。它也是将单体应用拆分为多个更小的、自治的服务,每个服务围绕独立的业务功能构建,独立部署和运行,

服务间通过轻量级通信协议(如 HTTP 、gRPC )进行通信。

它去掉了厚重繁琐的 ESB ,没有采用 SOAP 、WSDL 等复杂的标准和协议。

随着技术发展,与微服务架构配套的技术发展也突飞猛进,出现了链路追踪、API Gateway、服务注册和发现、配置中心、CICD、Docker 容器 等等技术,

为微服务架构的快速发展奠定了基础。

SOA 架构与微服务架构的区别

架构概述对比

SOA 面向服务的架构:SOA 是将应用程序拆分为粗粒度、可复用、可独立部署的服务,然后通过接口、协议规范来实现跨平台、多语言、多系统集成的架构,通常依赖企业服务总线(ESB)来实现服务间的通信与集成。

微服务架构(Microservices Architecture):微服务架构是在 SOA 基础上的一种更细粒度的服务拆分和实现方式。它是将应用拆分为多个更小、自治的服务,每个服务围绕独立的业务能力构建,独立部署、独立运行、独立小团队负责。

服务之间通信协议使用轻量级的协议(如 HTTP、gRPC 等)进行通信。

服务拆分粒度

  • SOA 服务粒度较粗:SOA中的服务往往是较大的业务模块或功能单元。比如:电商系统中的 “商品管理系统” 即为一个 SOA 服务。

  • 微服务服务粒度较细:微服务强调将业务拆分为更小的、具体的功能服务。比如:“商品管理系统” 可能拆分为 “商品基本信息管理”、“供应商管理”、“库存管理”等多个微服务。

通信机制与技术实现

  • SOA 通信依赖 ESB:SOA 架构通常使用企业服务总线(ESB)作为服务间通信的核心,ESB 负责路由、消息转换、协议适配等功能,属于较为重量级的实现。在搭配 SOAP(XML 格式,消息体数据量大) 等比较重的标准协议。ESB 易成为系统瓶颈。

  • 微服务采用轻量级通信:微服务架构丢掉了 ESB,采用轻量级协议如 HTTP、RPC 进行服务间通信,强调去中心化,避免单点瓶颈。

服务自治与独立部署

  • SOA服务依赖共享资源:SOA 服务往往共享数据库或其他资源,服务间存在一定耦合,部署和扩展相对集中。

  • 微服务完全自治:每个微服务拥有独立的数据库和运行环境,支持独立部署和扩展,能够根据业务需求灵活伸缩资源。

技术栈与运维实践

  • SOA 偏向传统技术:SOA 多采用传统的企业级中间件和技术,注重系统集成和兼容已有系统,运维相对复杂。

  • 微服务利用现代技术:微服务架构广泛采用容器化(如Docker)、自动化部署、DevOps、链路追踪等现代技术,支持快速迭代和持续交付。

团队组织

  • SOA 架构:通常是按技术分层的团队(如UI团队、业务逻辑团队、数据库团队)。

  • 微服务架构:通常是全功能团队(Cross-functional teams),围绕业务能力构建。

SOA和微服务架构对比总结

重要的区别

特性 SOA 微服务
粒度 粗粒度服务,通常代表一个完整的业务流程或领域 细粒度服务,每个服务只关注一个单一的业务能力
耦合度 相对松耦合,服务通过ESB进行协调,但ESB可能导致中心化依赖和单点故障 高度松耦合,服务独立运行,通过轻量级机制通信,去中心化
集成方式 依赖ESB进行服务的路由、转换和编排,实现集中式集成 采用API Gateway、服务注册与发现、轻量级通信(HTTP REST/消息队列)进行集成,去中心化集成
技术栈 倾向于统一的技术栈和协议(如XML、SOAP、WSDL),通常由集中团队管理 可技术异构性,每个服务可自由选择最适合的技术栈
数据存储 通常共享集中式数据库,或通过ESB协调多个数据库 每个微服务拥有独立的数据存储,强调数据自治
部署方式 倾向于单体部署或少量大型服务部署,独立部署能力有限 强调独立部署,每个服务可独立上线、回滚
团队组织 通常是按技术分层的团队(如UI团队、业务逻辑团队、数据库团队) 通常是全功能团队(Cross-functional teams),围绕业务能力构建
演进目标 提高企业级服务重用性,降低集成成本 提高系统可伸缩性、灵活性、高可用性,加速产品迭代

一些联系的点

尽管 SOA 和微服务存在显著差异,但它们并非完全独立的概念,而是有着密切的联系,甚至可以说微服务是 SOA 在特定背景下的一种演进和发展。

  • 1、共同的服务化思想:两者都基于 “服务化” 的核心思想,即将业务功能抽象为独立的服务,并通过接口对外暴露。这是它们共同的基石。

  • 2、松耦合目标:两者都追求服务间的松耦合,以提高系统的灵活性、维护性、伸缩性。

  • 3、分布式系统范畴:两者都属于分布式系统架构的范畴,需要处理分布式环境下的通信、事务、数据一致性等问题。

  • 4、演进关系:微服务可以看作是 SOA 在互联网时代、云计算环境下的一种 “进化”。SOA 在早期解决了企业级应用集成的痛点,但随着业务的快速变化和复杂性增加,其中心化的 ESB 和粗粒度服务逐渐暴露出部署、扩展和运维上的瓶颈。微服务则通过更细粒度的服务划分、去中心化的治理和独立部署的特性,解决了这些痛点,更好地适应了敏捷开发和DevOps的实践。

  • 5、并非完全替代关系:微服务并非完全取代 SOA。在某些传统企业、业务流程相对稳定、集成复杂度较高的场景下,SOA 仍然有其价值。例如,一些遗留系统的集成,ESB 的集中化管理能力仍然是有效的选择。微服务更适用于需要快速迭代、高度可伸缩、容错性强的互联网应用和新业务系统。微服务也不是万能银弹,需要综合考虑使用。

我现在把微服务架构相关的博客文章也发布到了 github 上,便于阅读(左边栏打开可以看到全部的标题),还有历史修改追踪。

当然也希望大家能点个 星 star 鼓励鼓励。

微服务架构学习与思考(16):SOA架构与微服务架构对比分析?它们之间区别是什么?的更多相关文章

  1. 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍

    微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...

  2. 微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍

    微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍 上一篇关于网关的文章: 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Ngi ...

  3. 微服务架构学习与思考(09):分布式链路追踪系统-dapper论文学习

    一.技术产生的背景 1.1 背景 先来了解一下分布式链路追踪技术产生的背景. 在现在这个发达的互联网世界,互联网的规模越来越大,比如 google 的搜索,Netflix 的视频流直播,淘宝的购物等. ...

  4. 基于Netty的RPC架构学习笔记(五):netty线程模型源码分析(二)

    文章目录 小技巧(如何看开源框架的源码) 源码解析 阅读源码技巧 打印查看 通过打断点调试 查看调用栈 小技巧(如何看开源框架的源码) 一断点 二打印 三看调用栈 四搜索 源码解析 //设置nioso ...

  5. 基于Netty的RPC架构学习笔记(四):netty线程模型源码分析(一)

    文章目录 如何提高NIO的工作效率 举个

  6. IDDD 实现领域驱动设计-SOA、REST 和六边形架构

    上一篇:<IDDD 实现领域驱动设计-架构之经典分层> 阅读目录: SOA-面向服务架构 REST 与 RESTful 资源(Resources) 状态(State) 六边形架构 DDD ...

  7. SOA、REST 和六边形架构

    SOA.REST 和六边形架构 上一篇:<IDDD 实现领域驱动设计-架构之经典分层> 阅读目录: SOA-面向服务架构 REST 与 RESTful 资源(Resources) 状态(S ...

  8. ABP架构学习系列

    ABP实践学习系列 ABP Zero 本地化语言的初始化和扩展 ABP Zero 导航菜单之角色权限 ABP Zero示例项目问题总结  ABP后台服务之作业调度Quartz.NET   ABP架构学 ...

  9. 基于Spring Boot和Spring Cloud实现微服务架构学习

    转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...

  10. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

随机推荐

  1. 【VMware VCF】解决 VCF 环境中组件用户密码过期问题。

    由于长时间没有启动 VCF 环境,现在在启动 SDDC Manager 组件后,UI 一直处于如下图所示的"初始化"状态.当时第一直觉就认为肯定是 VCF 环境组件的用户密码过期了 ...

  2. linux的zip命令详解 | Linux文件打包成Zip的命令和方法

    zip 命令用来压缩文件 参数: -A:调整可执行的自动解压缩文件: -b<工作目录>:指定暂时存放文件的目录: -c:替每个被压缩的文件加上注释: -d:从压缩文件内删除指定的文件: - ...

  3. IP地址查询服务

    IP地址查询站点 https://ip.cn/ http://ip.qq.com/ http://ip138.com/ https://www.apnic.net/ ... IP计算 ip地址在线计算 ...

  4. GIS空间索引技术

    地理信息系统(Geography Information System,简称GIS)的主要任务之一是有效地检索空间数据及快速响应不同用户的在线查询.地理空间索引技术和方法是GIS的关键技术.是快速高效 ...

  5. 关于TCP的握手与挥手

    关于TCP的握手与挥手 前言 由于自己每次都是唱的比懂的好听,光知道唱"三次握手四次挥手",再往里细问SYN标志就只能阿巴阿巴阿巴,为了解决自己的知识储备问题,顺便继续深入了解TC ...

  6. Junit单元测试的maven设置

    maven 官方文档: https://maven.apache.org/surefire/maven-surefire-plugin/usage.html maven是通过插件 maven-sure ...

  7. Tailwind CSS一些你需要记住的原子类

    前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别.它的工作原理是扫描所有 HTML 文件.JavaScript 文件以及任何模板中的 CSS 类名,然 ...

  8. python中执行命令的3种方法

    python中执行命令的3种方法小结 1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在linux上执行的信息. import os os.system ...

  9. 网络编程:select

    原理:参考:https://my.oschina.net/fileoptions/blog/911091 select中内核函数有哪些 源码实现: #undef __NFDBITS #define _ ...

  10. C# INotifyPropertyChanged Small Demo

    public class PChangeTest:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyC ...