seata报“no available service”错误,90%因registry.conf与application.yml未闭环配置:注册中心、配置中心、存储三者必须同时对齐,缺一不可。

Seata 服务启动后在 Nacos 控制台看不到实例,或客户端报 no available service,90% 是因为 registry.conf 和 application.yml 没配闭环——注册中心、配置中心、存储三者必须同时对齐,缺一不可。
registry.conf 和 application.yml 必须双写 nacos
只改 registry.conf 的 registry.type = nacos,但 application.yml 里 config.type 还是 file,会导致 Seata 能注册到 Nacos,却拉不到 seataServer.properties 配置,最终卡在 DB 连接失败或锁表初始化异常。
-
registry.conf中registry.type和config.type都得设为nacos -
application.yml的seata.config.nacos.server-addr和seata.registry.nacos.server-addr必须指向同一 Nacos 实例(如192.168.1.100:8848) - namespace 和 group 在两处配置中必须完全一致,比如都用
SEATA_GROUP和6449e725-b486-40d2-9d52-3d3393f5f6c7
seataServer.properties 必须手动上传到 Nacos
Seata 1.6+ 不再自动加载本地 conf/seataServer.properties,它只从 Nacos 拉取。如果漏传或 data-id/group/namespace 错位,服务看似启动成功,实则无法初始化事务会话存储。
- data-id 必须是
seataServer.properties(不能带 .yml 或其他后缀) - group 必须与
application.yml中seata.config.nacos.group一致 - namespace 必须与
application.yml中seata.config.nacos.namespace完全相同(包括空字符串或public) - 关键项至少包含:
store.mode=db、store.db.dbType=mysql、store.db.url、store.db.user、store.db.password
MySQL 表结构和连接池参数必须提前就位
即使 Nacos 配置全对,store.mode=db 下若未建表或 JDBC 连接超时,seata-server.sh 启动几秒后就会静默退出,日志里反复出现 Failed to obtain JDBC Connection。
- 先执行官方 SQL 创建库表:
mysql -u root -p seata - 确保
store.db.url中的 IP、端口、数据库名(如seata)与实际环境完全匹配 - 连接池默认最小连接数为 5,若 MySQL max_connections 不足或防火墙拦截,也会触发连接失败
- 推荐显式配置
store.db.minConn=1和store.db.maxConn=20,避免冷启动卡住
路径、JDK、端口三个底层条件容易被跳过检查
很多问题根本不出在配置逻辑,而卡在基础运行环境:路径含中文/空格、JDK 版本不兼容、防火墙拦端口,这些错误不会报明确提示,只会让服务“假启动”。
- 解压路径禁止含中文或空格,例如
/opt/seata-1.6.1可行,/home/张三/seata不行 - JDK 必须为 OpenJDK 11 或 Oracle JDK 8u202+,
java -version输出需含11.0.x或1.8.0_开头 - Linux 上必须放行两个端口:
8091(Seata 默认服务端口)、8848(Nacos 端口),用sudo firewall-cmd --list-ports | grep -E "(8091|8848)"验证 - 启动命令建议显式指定参数:
sh bin/seata-server.sh -h 192.168.1.100 -p 8091 -m db,避免依赖自动探测
最常被忽略的是 namespace 的严格一致性——哪怕多一个空格、大小写不一致、或用了 public 却在配置里写成空字符串,Nacos 就不会返回配置,Seata 也就无法完成初始化。这不是 bug,是设计使然:它要求注册、配置、存储三者在语义上完全对齐,否则宁可失败也不妥协。











