SOA 架构和微服务架构都是软件设计中的架构风格,它们都旨在通过将应用程序分解为独立的服务来提高系统的灵活性和可维护性。它们在解决系统的可扩展性、模块化、解耦性等方面有很多相似之处,但也存在一些关键的区别。

一、服务

在软件架构中,服务 通常指的是一段实现特定功能的独立程序单元,它是为满足某种业务需求而开发的模块,通常具有清晰的接口和定义。

服务通常有以下特点:

  • 自治性:每个服务都是独立的、自治的,意味着服务有自己的逻辑和数据存储,并且可以独立部署和管理。这种自治性是服务架构(如 SOA 和微服务架构)能够支持分布式部署和高可扩展性的基础。
  • 松耦合:服务之间应该是松耦合的,即它们之间的依赖关系尽量减少。服务通过标准化的接口(如 API、消息队列等)进行交互,这意味着一个服务的修改通常不需要影响其他服务。
  • 封装性:服务通常封装了特定的业务逻辑或功能,外部系统或其他服务仅通过服务提供的接口与其交互,而无需关心其内部实现细节。这种封装性有助于提升系统的模块化和灵活性。
  • 复用性:服务通常设计为可重用的,意味着一个服务可以在不同的上下文或应用中被复用。服务的重用性有助于提升开发效率,减少重复开发。
  • 标准化:服务通常通过标准化的接口与外部系统或服务交互。常见的接口形式包括 REST API、SOAP Web Services、gRPC 等。这些标准接口使得不同服务间的通信变得简单、灵活,且具有良好的跨平台兼容性。

二、SOA

面向服务(Service-Oriented)是指一种软件设计和架构风格,旨在通过将应用系统中的功能模块化成独立的、可重复使用的服务,并通过标准化接口和协议使得这些服务能够彼此独立、解耦并协同工作。

SOA(Service-Oriented Architecture)架构 是面向服务思想在架构中的具体实现,它强调系统中的各个模块通过服务进行交互和协作。SOA 中的每个服务都有清晰的功能边界,服务之间通过标准的 通信协议(如 SOAP、WSDL 等) 进行通信,并且通常会借助 企业服务总线(ESB) 进行服务发现、路由、协议转换等任务。

在 SOA 中,服务是高度抽象的,它们实现了特定的业务功能,服务可以跨越不同的技术平台和硬件系统运行。SOA 有助于企业实现不同应用系统之间的集成,尤其是在异构系统和分布式环境中。

(一) 架构

SOA 架构示意图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                   +-----------------------+
| Service Consumer |
| (Client Application) |
+-----------+-----------+
|
+----------v----------+
| Service Interface |
+----------+----------+
|
+----------v----------+
| Enterprise Service |
| Bus (ESB) |
+----------+----------+
|
+-----------------------+-----------------------+
| | |
+------v------+ +-------v-------+ +-------v-------+
| Service | | Service | | Service |
| Provider 1 | | Provider 2 | | Provider 3 |
+-------------+ +---------------+ +---------------+

  • 服务提供者:提供具体服务实现的组件或系统,通常是功能模块(例如订单服务、支付服务等)。
  • 服务消费者:需要调用服务的应用或系统,通常是客户端应用,它们通过标准接口(如 SOAP 或 WSDL)向服务提供者发起请求。
  • ESB 企业服务总线:作为服务之间的通信和协调中介,负责消息路由、协议转换、安全管理等。ESB 可以确保服务之间的松耦合和异构系统的集成。
  • 服务接口:抽象层,定义了服务的接口规范(调用方式、参数和返回类型等)。

(二) 标准和协议

在 SOA 架构中,使用了多种标准和协议来实现服务之间的通信、数据传输、服务发现等功能。以下是 SOA 常用的主要标准和协议:

技术 / 协议 定义 作用 在 SOA 中的用途
SOAP
(Simple Object Access Protocol)
一种基于 XML 的通信协议,用于 Web 服务之间的消息传递。 定义了跨平台、跨语言的消息格式,支持基于 HTTP、SMTP 等协议的通信。 在 SOA 中,SOAP 用于在服务之间传递消息,支持请求 / 响应机制,确保服务之间的通信是标准化的,通常用于调用 Web 服务。
WSDL
(Web Services Description Language)
一种基于 XML 的语言,用于描述 Web 服务的接口和操作。 描述 Web 服务的接口、操作、输入输出数据、通信协议等。 在 SOA 中,WSDL 用于定义和描述 Web 服务的契约(接口)。服务消费者通过 WSDL 了解服务提供者的功能和调用方式。
UDDI
(Universal Description, Discovery, and Integration)
一个开放的 Web 服务目录标准,用于发布、查找和集成 Web 服务。 提供 Web 服务的注册、查找和集成机制,支持服务的动态发现。 在 SOA 中,UDDI 用作服务目录,服务提供者可以将服务注册到 UDDI 目录,消费者可以通过查询 UDDI 发现和集成 Web 服务。
BPEL
(Business Process Execution Language)
一种用于描述和编排跨多个 Web 服务的业务流程的语言。 定义和执行跨多个 Web 服务的复杂业务流程,支持服务之间的协作。 在 SOA 中,BPEL 用于定义业务流程,编排多个 Web 服务以完成特定业务逻辑,如订单处理、支付和库存管理。
WS-Security
(Web Services Security)
一个 Web 服务安全标准,定义了如何对 SOAP 消息进行加密、签名和身份验证等安全处理。 提供 Web 服务消息的安全性,确保消息的机密性、完整性和认证。 在 SOA 中,WS-Security 用于保护 SOAP 消息,防止敏感数据泄露、消息篡改或身份伪造,确保 Web 服务的安全通信。

下图描述了这些协议和标准在 SOA 中的应用:

  1. 服务提供者使用 WSDL 描述其服务。该定义被发布到服务存储库,该存储库可以使用通用描述、发现和集成(UDDI)。
  2. 服务使用者向存储库发出一个或多个查询以定位服务并确定如何与该服务进行通信。
  3. 服务提供者提供的部分 WSDL 被传递给服务使用者。这告诉服务使用者服务提供者的请求和响应是什么。
  4. 服务使用者使用 WSDL 向服务提供者发送请求。
  5. 服务提供者向服务使用者提供预期的响应。
  6. 图中的服务存储库通常是 UDDI 注册中心。
  7. 图中的消息通过 SOAP 协议来传递。

(三) ESB

ESB(Enterprise Service Bus)企业服务总线是 SOA 中的重要组件,用于实现不同应用和服务之间的通信、集成和协调。ESB 的目标是简化和标准化服务之间的交互,尤其是在复杂的企业级系统中,通过它实现跨系统、跨平台的互操作性。

ESB 的主要功能包括:

  • 消息路由:ESB 能够根据预定义的规则将消息从一个服务传送到另一个服务。它支持各种路由模式,如点对点、发布 - 订阅等。
  • 协议转换:ESB 可以在不同的通信协议之间进行转换,帮助不同系统之间的互操作。例如,它可以将 SOAP 消息转换为 RESTful API 调用,或者将 XML 消息转换为 JSON 格式。
  • 数据转换:ESB 支持不同数据格式之间的转换,如将 XML 数据转换为 JSON、CSV 等格式,以适应不同系统的需求。
  • 安全性:ESB 能够提供安全功能,如身份验证、授权、消息加密和签名等,确保在服务调用过程中数据的安全性。
  • 服务监控与管理:ESB 可以对服务的运行情况进行实时监控,收集和分析日志数据,帮助管理员发现潜在的瓶颈或故障。

(四) BPEL

BPEL(Business Process Execution Language)业务流程执行语言用于描述和执行跨多个服务的复杂业务流程。它定义了不同服务的调用顺序、条件逻辑、错误处理等。BPEL 是业务流程自动化的核心工具,通常用来协调服务之间的交互。

BPEL 的主要功能包括:

  • 业务流程编排:通过 BPEL,多个服务可以按顺序协同工作,形成一个完整的业务流程。
  • 条件与分支处理:在流程中,可以根据特定条件进行判断和分支。
  • 事务管理:在跨服务的流程中,BPEL 可以保证事务的一致性。
  • 错误处理:如果某个服务调用失败,BPEL 可以指定错误处理逻辑。

三、微服务

微服务(Microservices Architecture)架构 是一种将应用程序拆分为一组小型、自治、独立的服务的架构模式。每个微服务专注于某一特定的业务功能,拥有自己的数据库和部署方式,并通过轻量级的协议(如 HTTP/REST、gRPC 等)进行通信。与 SOA 不同,微服务更强调 去中心化,通常没有 ESB 这种中介层,而是使用 API 网关来处理请求。

(一) 架构

微服务架构示意图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                     +-----------------------+
| Service Consumer |
| (Client Application) |
+-----------------------+
|
+-------------v--------------+
| API Gateway |
| (Routing & Aggregation) |
+-------------+--------------+
|
+-----------------------+-----------------------+
| | |
+-------v-------+ +-------v-------+ +-------v-------+
| Service | | Service | | Service |
| Provider A | | Provider B | | Provider C |
+---------------+ +---------------+ +---------------+
| | |
+------v------+ +------v------+ +------v------+
| DB A | | DB B | | DB C |
| (Database) | | (Database) | | (Database) |
+-------------+ +-------------+ +-------------+
  • 服务提供者:每个微服务负责特定的业务功能。服务之间是松耦合的,通常独立部署,可以使用不同的技术栈。
  • 服务消费者:需要调用服务的应用或系统,通常是客户端应用,它们通过标准接口(REST API)向服务提供者发起请求。
  • 数据库:每个微服务通常拥有自己的数据库,不共享数据库,确保了服务的独立性和自治性。
  • API 网关:微服务架构中的重要组成部分,它接收客户端请求并将其路由到相应的微服务。它还负责聚合来自不同微服务的响应,简化客户端与后端服务的交互。

(二) REST 风格

REST(Representational State Transfer)是一种基于 Web 的架构风格,用于设计分布式系统中的通信方式,尤其是网络应用中的资源交互。它并不是一个协议,而是一组约定和设计原则,常用于基于 HTTP 协议的 Web 服务。

REST 包含以下基本概念:

  1. 资源(Resource):系统中可以被唯一标识的对象或数据,可以是用户、商品、订单、图片等。每个资源都可以通过一个唯一的 URI(统一资源标识符)来访问。
  2. 表述(Representation):描述资源在某一时间的状态,可以用 JSON、XML、HTML、YAML 等多种格式。客户端与服务器之间的数据交换通常是通过这些表述来完成的。客户端请求资源时,可以指定它希望服务端以何种格式返回数据。
  3. 状态转移 (State Transfer):客户端通过 HTTP 方法(如 GET、POST、PUT、DELETE)对资源进行操作,传递消息以改变资源的状态。客户端与服务器之间的交互是 无状态 的,每个 REST 请求都是独立的,不依赖于前一次请求的状态。服务端不会存储任何客户端的会话信息,每次请求都应包含完成操作所需的全部信息。

REST 相对于 SOAP 来说更加轻量,不需要复杂的 XML 消息格式,也不需要使用专门的协议栈(如 SOAP 消息传递的标准)。因此,在资源消耗较小的环境下(如移动应用、IoT 设备等),REST 通常被作为 Web 服务的实现方式。

在微服务架构中,REST 被广泛用于服务间的通信,它利用标准的 HTTP 协议和轻量级的 JSON 格式,通过一组清晰、规范的 API 路径和 HTTP 方法(如 GET、POST、PUT、DELETE)来操作资源。RESTful API 的设计遵循无状态性原则,服务间的请求是独立的,不依赖于服务器的会话状态,从而提高了扩展性和性能。

四、SOA 与微服务对比

维度 SOA 微服务
服务粒度 服务粒度较大,服务通常是功能相对复杂的模块,可能包含多个业务功能。 服务粒度较小,每个微服务专注于一个单一的业务功能或领域。
服务治理 使用 ESB(企业服务总线)进行服务治理、消息路由、协议转换等。 通常使用 API 网关进行请求路由、负载均衡、安全认证等功能。
数据管理 服务之间可以共享数据库。 每个微服务通常有自己的数据库,避免了数据库的共享,从而降低了服务之间的依赖。
技术栈 通常倾向于使用统一的技术栈和协议(如 SOAP、WSDL)。 支持多种技术栈,服务之间可以使用不同的编程语言、框架、数据库等。
部署 服务的部署通常较为集中,依赖于大型的集成平台(如 ESB)。 每个微服务独立部署,通常使用容器化技术(如 Docker)进行部署和扩展。

总的来说,SOA 适用于较大规模的企业级应用,强调系统集成和服务共享;微服务架构更加关注灵活性、独立性和小而独立的服务单元,适合分布式、高可用、高扩展性的应用场景。