Apache Seata 2.3.0 版本发布详解:Fastjson2 序列化、国产数据库与 gRPC 全面进化
Apache Seata 2.3.0 版本发布详解:Fastjson2 序列化、国产数据库与 gRPC 全面进化
Apache Seata(incubating) 2.3.0 是分布式事务框架 Seata 的重要里程碑版本,重点补齐了序列化生态、国产数据库适配与通信协议能力:新增 Fastjson2 RPC 消息与 UndoLog 序列化、支持人大金仓(Kingbase)与神通(Oscar)数据库、客户端与服务端全面支持 gRPC 协议,并落地了 Saga 注解化与 Raft 节点间 SSL 通信。阅读本文后,你将掌握 2.3.0 的核心新增能力、底层实现原理(含源码证据)、关键修复点以及升级使用时的注意事项,可直接指导你的选型与迁移实践。
本文内容主体源自官方版本说明 changes/zh-cn/2.3.0.md,并结合当前仓库源码进行了深化验证。
版本概览与更新总览
2.3.0 的更新可归纳为四大主题:
- 序列化能力增强:新增 Fastjson2 序列化器,同时支持 RPC 消息与 UndoLog 两种场景;
- 数据库生态扩展:新增人大金仓(Kingbase)与神通(Oscar)两款国产数据库支持;
- 通信协议升级:Client 与 Server 支持 gRPC 协议,并配套 gRPC 序列化器(默认 Protobuf);
- 高可用加固:支持 Raft 节点间 SSL 通信,并修复了大量 Raft、Nacos 注册、UndoLog 生成等场景的缺陷。
此外,2.3.0 还包含若干优化与重构:移除只读 XA 事务的分支注册操作、拆分 merge 消息以提升服务端并行处理能力、优化 AT 模式锁释放逻辑、优化快速失败(fail fast)、为 namingserver 模块加入 Jib 支持以构建 Docker 镜像等。
序列化增强:Fastjson2 加持 RPC 与 UndoLog
Fastjson2 RPC 消息序列化
在 2.3.0 之前,Seata 的 RPC 消息序列化已支持 Kryo、Hessian、Protobuf、FST 等多种方式。2.3.0 通过 PR #6904 新增了 Fastjson2 序列化支持,新增独立模块 serializer/seata-serializer-fastjson2,该模块依赖 seata-common、seata-core、json-common-core 与 com.alibaba.fastjson2:fastjson2(见 serializer/seata-serializer-fastjson2/pom.xml)。
核心实现类 Fastjson2Serializer.java 通过 @LoadLevel(name = "FASTJSON2") 注解注册到 SPI 加载体系:
- 序列化采用 JSONB 二进制格式(
JSONB.toBytes),相比文本 JSON 更紧凑高效; - 反序列化通过
Fastjson2JsonbParser.parseObject完成,配合SerializerSecurityRegistry.getAllowClassType()注册的白名单类型构建 autoType 过滤器,兼顾安全性与反序列化能力; - 实现
Initialize接口,在init()中调用Fastjson2ObjectReaderWarmup.warmup对允许类做预热,优化首次反序列化性能。
在 Fastjson2SerializerFactory.java 中可看到序列化特性配置的细节:
- Reader 特性:
FieldBased(基于非静态字段反序列化,含私有字段,在 FieldBased 配置下更安全)、IgnoreAutoTypeNotMatch、UseNativeObject、UseDefaultConstructorAsPossible; - Writer 特性:
WriteClassName、FieldBased、ReferenceDetection、WriteNulls、NotWriteDefaultValue、NotWriteHashMapArrayListClassName、WriteNameAsSymbol。
模块还通过 META-INF/services/org.apache.seata.core.serializer.Serializer 注册服务实现,并配套了 Fastjson2SerializerTest 与 Fastjson2ConcurrentRefDeserializationTest 等测试用例验证序列化正确性与并发反序列化场景。
UndoLog 的 Fastjson2 序列化
在 AT 模式下,UndoLog(回滚日志)的存储格式直接影响回滚效率与兼容性。PR #6974 为 UndoLog 增加了 Fastjson2 序列化方式,与 UndoLog 原有的 Jackson 序列化并存,允许用户根据业务场景选择。这一点与 RPC 消息序列化是相互独立的两条链路,共同丰富了 Fastjson2 在 Seata 内的应用面。
国产数据库支持:人大金仓与神通
2.3.0 新增了两款国产数据库的支持,在 rm-datasource 模块中形成了完整的适配族:
- 人大金仓(Kingbase),PR #6876;
- 神通数据库(Oscar),PR #6864。
以神通数据库为例,仓库中可找到完整的适配链(见 rm-datasource/src/main/java/org/apache/seata/rm/datasource/exec/oscar/):
- SQL 解析与表结构:
OscarEscapeHandler(关键字转义)、OscarTableMetaCache(表元数据缓存); - SQL 执行:
OscarInsertExecutor(INSERT 语句执行器,与 Kingbase 的KingbaseInsertExecutor对应); - UndoLog 回滚:
OscarUndoInsertExecutor、OscarUndoDeleteExecutor、OscarUndoUpdateExecutor,以及汇聚它们的OscarUndoExecutorHolder; - UndoLog 管理:
OscarUndoLogManager; - 资源初始化:
OscarResourceIdInitializer。
这些实现通过 META-INF/services/org.apache.seata.rm.datasource.exec.InsertExecutor、org.apache.seata.rm.datasource.undo.UndoExecutorHolder、org.apache.seata.rm.datasource.undo.UndoLogManager、org.apache.seata.sqlparser.EscapeHandler、org.apache.seata.sqlparser.struct.TableMetaCache 等服务文件注册,随类路径自动加载,业务侧无需额外配置即可启用。Kingbase 侧的结构与此对称(见 rm-datasource/src/main/java/org/apache/seata/rm/datasource/exec/kingbase/ 等目录),并配有 KingbaseInsertExecutorTest、OscarInsertExecutorTest、KingbaseTableMetaCacheTest、OscarTableMetaCacheTest 等单元测试(rm-datasource/src/test)。
通信协议:gRPC 支持落地
Client 与 Server 的 gRPC 支持
PR #6881 让 Client 和 Server 都支持了 gRPC 协议。仓库中新增了 extensions/rpc/seata-grpc 模块,基于 io.grpc:grpc-netty、grpc-protobuf、grpc-stub 构建(见 extensions/rpc/seata-grpc/pom.xml)。
其核心实现以拦截器(Interceptor)方式无缝接入业务调用链,对用户代码透明:
- 客户端侧:ClientTransactionInterceptor.java,在请求发出前绑定全局事务上下文(通过
GrpcHeaderKey在 gRPC Metadata 中传递 XID 等事务信息); - 服务端侧:ServerTransactionInterceptor.java 与 ServerListenerProxy.java,负责解析并绑定传入的事务上下文,将 gRPC 调用纳入全局事务。
配套测试 GrpcTest.java、ClientTransactionInterceptorTest、ServerTransactionInterceptorTest 覆盖了事务上下文在 gRPC 调用链中的传递与恢复。
gRPC 序列化器与默认 Protobuf
PR #6992 新增了 gRPC 序列化器,且 PR #6991 将 gRPC 协议的序列化默认值设为 Protobuf。也就是说,使用 gRPC 协议时默认采用 Protobuf 进行消息编解码,用户无需额外配置即可获得高效的二进制传输,只有在需要其他序列化方式时才需显式修改。
Saga 注解化:告别状态机定义文件的另一种写法
PR #6973 引入了 Saga 注解化支持,将 Saga 的声明方式从"编写状态机 JSON/语言定义"扩展到"直接以注解标记业务方法"。仓库中新增了独立模块 saga/seata-saga-annotation,核心要素包括:
SagaTransactional注解(saga/seata-saga-annotation/src/main/java/org/apache/seata/saga/rm/api/SagaTransactional.java),用于标记参与 Saga 编排的业务方法;SagaAnnotationResourceManager(saga/seata-saga-annotation/src/main/java/org/apache/seata/saga/rm/SagaAnnotationResourceManager.java),继承AbstractResourceManager,以resourceId为键缓存SagaAnnotationResource,并检测同名资源重复注册(抛出RepeatRegistrationException),保证资源唯一性;- 拦截器解析链:SagaAnnotationActionInterceptorParser 与 SagaAnnotationActionInterceptorHandler 负责将注解方法包装为可被 Saga 引擎调用的动作。
模块通过 META-INF/services 注册 ResourceManager、InterfaceParser、AbstractRMHandler 等 SPI 实现(见 saga/seata-saga-annotation/src/main/resources/META-INF/services),并配有 SagaAnnotationResourceManagerTest 验证资源注册与冲突检测。
注意:PR #7127 同步修复了 Saga 注解化导致的服务端
branchType解码失败问题,因此使用注解化 Saga 时务必升级服务端至 2.3.0 及以上版本。
高可用与安全:Raft 节点 SSL 通信
PR #6926 为 Raft 节点间通信增加了 SSL 支持,让基于 SOFA JRaft 的 Seata 服务端集群在公网或不可信网络环境下也能加密传输日志与快照数据。
从实现看,RaftServer.java 在 start() 中通过配置项 SERVER_RAFT_SSL_ENABLED 判断是否开启 SSL;开启时调用 enableSSL(),将 seata.server.raft.ssl 前缀下的配置写入 JRaft/bolt 的系统属性(bolt.server.ssl.enable、bolt.server.ssl.clientAuth、bolt.client.ssl.enable、keyStore 路径/密码/类型、kmf/tmf 算法等),并强制要求相关配置值非空。
对应配置示例可在 server/src/main/resources/application.raft.example.yml 中查看:
seata:
server:
raft:
group: default
server-addr:
snapshot-interval: 600
apply-batch: 32
max-append-bufferSize: 262144
max-replicator-inflight-msgs: 256
disruptor-buffer-size: 16384
election-timeout-ms: 1000
reporter-enabled: false
serialization: jackson
compressor: none
sync: true # sync log&snapshot to disk
# raft nodes ssl config
ssl:
enabled: false
client:
keystore:
path: ssl/cbolt.pfx
password:
type: pkcs12
server:
keystore:
path: ssl/bolt.pfx
password:
type: pkcs12
kmf-algorithm: SunX509
tmf-algorithm: SunX509
启用 SSL 时需为每个 Raft 节点准备 client 与 server 两套 PKCS12 密钥库(示例中为 ssl/cbolt.pfx 与 ssl/bolt.pfx),并将 ssl.enabled 置为 true。2.3.0 同时修复了 seata.server.raft.ssl 前缀不存在的问题(PR #7117),确保该配置段能被正确解析。
关键缺陷修复盘点
2.3.0 修复了一批直接影响生产稳定性的缺陷,按主题归类如下:
锁与事务一致性
- PR #6932:修复开启本地事务时,file 与 raft 模式下锁争抢失败未退出、可能导致残留锁的问题;
- PR #6994:修复
update join语句未更新到数据时构建 UndoLog 异常的问题; - PR #6996(优化项):优化 AT 事务模式的锁释放逻辑;
- PR #7054(优化项):file 模式下竞争不到锁时输出锁持有者的 xid,便于排查锁等待;
- PR #6826(优化项):移除只读 XA 事务的分支注册操作,减少无谓的注册开销。
Raft 模式
- PR #6925:修复 Raft 模式下 Follower 崩溃可能导致 Client 继续使用过期令牌的问题;
- PR #7005:修复 Raft 模式下两阶段并发可能导致 NPE 的问题;
- PR #7027(优化项):raft 模式下 reload 行为与 file 模式保持一致;
- PR #7022:修复
application.raft.example.yml中store.mode属性配置错误。
注册中心与元数据
- PR #6940:修复 NacosRegistry lookup 时
transactionServiceGroup为空导致 NPE; - PR #6947:修复 nacos 注册中心查询可用地址时的空指针问题;
- PR #6923:增强 401 错误处理,通过刷新令牌重试,提升鉴权场景的健壮性;
- PR #7044:修复数据源关闭后 TableMeta 刷新错误的问题;
- PR #7025:修复
vGroupMappingManager未初始化的问题。
UndoLog 与 SQL
- PR #7010:修复使用达梦数据库时删除 UndoLog 发生 SQL 语法错误(
context为关键字场景); - PR #6943:修复并发状态下
convertBranchSession转换报错问题。
打包与环境
- PR #6899:修复 file.conf 打包后的读取问题;
- PR #6948:修复 ARM64 平台 CI 构建问题;
- PR #6984:修复 openjdk23 下无法构建 docker 镜像的问题(PR #6918 同时将基础镜像切换为 eclipse-temurin 的 openjdk 镜像)。
Saga 相关
- PR #6890:修复 Saga 设计器 JSON 转标准 JSON 过程中子状态机补偿节点无法被识别的问题;
- PR #7127:修复 Saga 注解化导致的服务端
branchType解码失败问题。
性能与工程优化
2.3.0 在性能与工程层面也有明显动作:
- PR #6807:拆分
MergedWarpMessage,使消息可完全并行处理,显著增强服务端并行处理能力(对应配置项enable-parallel-request-handle); - PR #7023:优化快速失败,当所有 Server 均不可用时尽快失败而非长时间等待;
- PR #7043:获取不到 MQ 的
sendResult时直接完成回滚,避免事务悬挂; - PR #6993:优化 metrics 指标;
- PR #7040:优化
ConfigurationFactory加载时的打印信息; - PR #7046:去除 spring-webmvc 依赖冲突;
- PR #7151 / #7153 / #7152:升级 xstream 至 1.4.21、tomcat-embed 至 9.0.98,并移除 org.eclipse.jetty 依赖,收敛依赖树;
- PR #6950:移除 JVM 参数
app.id; - PR #7017:移除 seata-server 模块对部分模块的依赖,降低耦合;
- PR #7051:为 namingserver 模块添加 Jib 支持,可直接构建 Docker 镜像。
测试与工程质量
2.3.0 同步提升了测试覆盖:
- PR #6869:增加
seata-core模块单元测试覆盖率; - PR #6927:增加 seata-rocketmq 模块的测试用例;
- PR #7018:增加
seata-tm模块的测试用例; - PR #7030:增加
seata-common模块的测试用例。
这些测试与本仓库内大量新增的单元测试(如 Fastjson2 序列化测试、Kingbase/Oscar 执行器测试、gRPC 拦截器测试、Saga 注解资源管理测试)一起,为 2.3.0 的功能可靠性提供了保障。
升级与使用建议
结合本版本变更,升级或选用 2.3.0 时建议关注以下几点:
- 序列化器选择:若希望使用 Fastjson2 序列化 RPC 消息,需引入
seata-serializer-fastjson2模块并配置序列化类型为FASTJSON2;UndoLog 的 Fastjson2 序列化与 Jackson 并存,可按需配置; - 国产数据库:Kingbase 与 Oscar 均通过 SPI 自动适配,接入时确认应用数据库驱动版本与 Seata 2.3.0 兼容即可;
- gRPC 协议:Client 与 Server 需同时升级到 2.3.0 并启用 gRPC,序列化默认 Protobuf;gRPC 集成通过拦截器完成,业务代码无侵入;
- Raft SSL:启用前务必为各节点生成 client/server 两套 PKCS12 密钥库,并按 application.raft.example.yml 的
seata.server.raft.ssl段完整配置,否则RaftServer.enableSSL()会因配置值为空直接抛出IllegalArgumentException; - 补丁完整性:涉及 Saga 注解化、Raft、Nacos 注册中心等场景的用户,建议将 Client 与服务端一并升级,以覆盖 PR #6925、#7005、#7025、#7127 等修复。
总结
Apache Seata(incubating) 2.3.0 是一次能力扩充与稳定性加固并重的版本:Fastjson2 让序列化生态更加丰富,Kingbase/Oscar 让国产化数据库适配更进一步,gRPC 打通了新一代通信协议,Saga 注解化降低了编排门槛,Raft SSL 则补齐了集群安全通信的最后一块拼图。同时,围绕锁竞争、UndoLog、Nacos 注册中心与并发场景的大量缺陷修复,使该版本具备了更高的生产可用性。对于正在评估或升级 Seata 的团队,2.3.0 是值得关注的目标版本。