2、核心概念回顾:分布式事务(XA、TCC、Saga、Seata)、鉴权拦截(OAuth2、JWT、Spring Security Filter)

在进入 Development 环境移植适配之前,必须对齐两个核心知识域:分布式事务与鉴权拦截。本章将系统梳理 XA、TCC、Saga、Seata 四种事务模型,以及 OAuth2、JWT、Spring Security Filter 三套鉴权拦截机制,为后续的环境适配打下理论基础。

2.1 分布式事务模型对比

分布式事务用于保证跨多个数据库、服务或消息队列的数据一致性。根据一致性强度与实现方式,主流模型分为以下四类:

模型 一致性级别 典型协议/实现 适用场景 主要缺点
XA 强一致性(ACID) 2PC(两阶段提交) 短事务、数据库原生支持 阻塞协议、性能低、单点风险
TCC 最终一致性 Try-Confirm-Cancel 长事务、业务可补偿 业务侵入性强、需实现三阶段接口
Saga 最终一致性 Choreography / Orchestration 跨服务长流程、事件驱动 补偿逻辑复杂、无隔离性
Seata 最终一致性(AT模式) AT / TCC / Saga / XA 微服务、云原生、多语言 AT模式依赖全局锁、性能有损耗
Development 环境提示: 在本地开发环境中,XA 通常依赖数据库 XA 驱动和事务管理器(如 Atomikos),配置较重;TCC 和 Saga 更适合通过代码模拟;Seata 提供轻量级 AT 模式,是移植适配的首选。

2.2 四种事务模型详解

2.2.1 XA(2PC)

XA 是基于两阶段提交(Prepare + Commit/Rollback)的分布式事务规范。所有参与者先投票(Prepare),协调者根据投票结果决定全局提交或回滚。其核心流程如下:

  • 阶段一(Prepare): 事务管理器向所有资源管理器发送 prepare 请求,资源管理器执行事务但不提交,返回 yes/no。
  • 阶段二(Commit/Rollback): 若全部返回 yes,则发送 commit;否则发送 rollback。

2.2.2 TCC(Try-Confirm-Cancel)

TCC 将每个事务操作拆分为三个阶段,由业务代码显式实现:

  • Try: 预留资源、检查业务条件。
  • Confirm: 确认执行业务操作,使用 Try 阶段预留的资源。
  • Cancel: 取消业务操作,释放 Try 阶段预留的资源。

2.2.3 Saga

Saga 将长事务拆分为一系列本地事务,每个本地事务对应一个补偿事务。若某个本地事务失败,则按逆序执行补偿事务。Saga 有两种编排模式:

  • Choreography( choreography): 每个服务在本地事务完成后发布事件,触发下一个服务。
  • Orchestration(编排): 由协调器(Orchestrator)统一调用各服务并处理补偿。

2.2.4 Seata

Seata 是阿里开源的分布式事务框架,支持 AT、TCC、Saga、XA 四种模式。其中 AT 模式 是 Seata 的核心创新:通过代理数据源自动生成 undo log,实现无侵入的最终一致性。Seata 架构包含三个核心组件:

  • TC(Transaction Coordinator): 事务协调器,维护全局事务状态。
  • TM(Transaction Manager): 事务管理器,开启/提交/回滚全局事务。
  • RM(Resource Manager): 资源管理器,管理分支事务资源。
Development 环境适配要点: Seata 的 AT 模式在开发环境中只需引入 seata-spring-boot-starter 并配置 TC 地址即可快速验证,无需修改业务 SQL,是移植适配的最佳起点。
分布式事务模型对比架构图 分布式事务模型对比架构图 XA (2PC) 强一致性 · 阻塞协议 TCC 最终一致性 · 业务侵入 Saga 最终一致性 · 事件驱动 Seata 多模式 · AT 无侵入 Prepare + Commit 数据库原生支持 单点阻塞风险 Try → Confirm/Cancel 业务补偿接口 高代码侵入 Choreography/Orchestration 补偿事务逆序执行 无隔离性 AT/TCC/Saga/XA 自动 undo log 全局锁损耗 Development 环境移植适配建议 XA 适合数据库原生测试;TCC/Saga 需模拟补偿逻辑;Seata AT 模式配置最轻量 推荐优先使用 Seata AT 模式进行本地开发验证

2.3 鉴权拦截核心机制

鉴权拦截是微服务安全的第一道防线。本节回顾 OAuth2、JWT、Spring Security Filter 三者的定位与协作关系。

机制 核心职责 典型组件/协议 开发环境常见问题
OAuth2 授权框架,颁发访问令牌 Authorization Code / Client Credentials / Password 回调地址配置、Token 端点不可达
JWT 令牌格式,携带用户身份与声明 Header.Payload.Signature 密钥不一致、过期时间、签名算法
Spring Security Filter 请求拦截链,执行认证与授权 SecurityFilterChain / OncePerRequestFilter Filter 顺序错乱、忽略路径配置

2.3.1 OAuth2 授权流程

OAuth2 定义了四种授权模式,开发环境最常用的是 Authorization Code(授权码模式) 和 Client Credentials(客户端模式)。核心参与角色:

  • Resource Owner(资源所有者): 用户,授权客户端访问其资源。
  • Client(客户端): 需要访问资源的应用程序。
  • Authorization Server(授权服务器): 颁发令牌。
  • Resource Server(资源服务器): 保护资源,验证令牌。

2.3.2 JWT 令牌结构

JWT(JSON Web Token)由三部分组成,以点号分隔:

// JWT 示例结构
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.POstGetfAytaZS82wHcjoTyoqhMyxXiWdR7Nn7A29Dlcr7ZQq7Z8lBZ1wqAq2pF7iA0b7iK8g
  • Header: 令牌类型(JWT)和签名算法(如 RS256、HS256)。
  • Payload: 声明(Claims),包含用户身份、角色、过期时间等。
  • Signature: 对 Header 和 Payload 的签名,防止篡改。
Development 环境常见陷阱: 本地开发时,JWT 签名密钥(secret)若与生产环境不一致,会导致令牌验证失败。建议在 application.yml 中通过配置中心或环境变量注入密钥,避免硬编码。

2.3.3 Spring Security Filter 链

Spring Security 通过 Filter 链实现请求拦截。每个 Filter 负责一项安全职责,按顺序执行。典型的 Filter 链顺序如下:

  1. SecurityContextPersistenceFilter: 从 Session 中恢复 SecurityContext。
  2. UsernamePasswordAuthenticationFilter: 处理表单登录。
  3. BearerTokenAuthenticationFilter: 解析 JWT Bearer Token。
  4. FilterSecurityInterceptor: 执行 URL 权限判断。
  5. ExceptionTranslationFilter: 处理认证/授权异常。
鉴权拦截核心机制协作图 鉴权拦截核心机制协作图 客户端 OAuth2 授权服务器 JWT 访问令牌 Spring Security Filter 链 SecurityContextPersistence BearerTokenAuthentication FilterSecurityInterceptor Development 环境鉴权拦截适配要点 1. OAuth2:本地需配置授权服务器回调地址(如 http://localhost:8080/login/oauth2/code) 2. JWT:开发环境使用对称密钥(HS256),生产环境切换为非对称(RS256) 3. Spring Security Filter:注意 Filter 顺序,自定义 Filter 需继承 OncePerRequestFilter

2.4 分布式事务与鉴权拦截的交叉点

在微服务架构中,分布式事务与鉴权拦截并非孤立存在。以下场景是 Development 环境移植适配的高频交叉点:

  • 事务上下文传递: 跨服务调用时,分布式事务 ID(如 Seata 的 xid)需通过请求头传递,而鉴权 Token(JWT)同样在请求头中传递。两者可能共用拦截器或 Filter。
  • Filter 顺序冲突: 事务拦截器(如 SeataHandlerInterceptor)与 Spring Security Filter 的执行顺序若配置不当,可能导致 Token 未解析时事务已开启,引发空指针或认证失败。
  • 本地开发环境模拟: 在单机开发环境中,需同时模拟 OAuth2 授权服务器和 Seata TC 服务,端口冲突与配置覆盖是常见问题。