在yii3中搭建可水平扩展的微服务架构需初始化最小化骨架、移除web相关组件、配置nacos服务发现或openfeign代理、集成seata at模式实现分布式事务,并统一事务分组与禁用schema缓存。

在Yii3中搭建可水平扩展的微服务架构,需绕过传统单体应用的耦合限制,直接对接PSR-11容器、独立路由与异步通信机制。
初始化Yii3微服务基础结构
使用官方工程模板创建独立服务:执行 composer create-project yiisoft/yii-project-template my-service,该命令会生成不含前端依赖、仅含核心PSR组件的最小化骨架。
删除 config/web.php 和 public/index.php —— 微服务不走Web入口,【必须保留 config/console.php 和 bin/yii】,否则无法启动CLI服务或执行RPC注册。
修改 config/common.php,移除所有与 yii\web 相关的组件声明(如 response、request、urlManager),只保留 di、log、cache 等跨协议通用组件。
配置服务发现与RPC通信
方法一:基于Nacos客户端直连
安装Nacos SDK:composer require "nacos/nacos-sdk-php:dev-master",注意Yii3不兼容旧版nacos-php,必须用支持PSR-18的dev分支。
在 config/services.php 中注册Nacos实例:
return [ 'nacos' => [ 'class' => \Nacos\Client::class, 'serverAddr' => 'http://nacos:8848', 'namespaceId' => 'yii3-microservice', ],];
方法二:通过OpenFeign风格的HTTP代理(推荐)
创建 src/Client/UserServiceClient.php,继承 yiisoft/http-client/HttpClient,并在构造函数中注入Nacos解析器;调用时自动从Nacos拉取 user-service 实例列表并负载均衡。
这一步不能跳过服务健康检查:每次RPC前需调用 /actuator/health 接口验证目标服务存活,【失败则降级返回空数组而非抛出异常】,避免雪崩传导。
构建分布式事务链路
第一步:在每个微服务的 config/db.php 中启用Seata AT模式代理数据源
将原生PDO连接替换为 SeataDataSource 包装器,并配置 seata.service.vgroupMapping.my_tx_group=default 与 seata.service.grouplist=seata-server:8091。
第二步:在业务代码中显式开启全局事务
于用户注册控制器中,调用 $this->seata->beginTransaction('user-register-flow');后续对用户表与角色绑定表的所有写操作,均由Seata拦截SQL并生成undo_log。
第三步:确保所有参与服务均部署在同一Seata vgroup 下——若用户服务用 my_tx_group,权限服务也必须使用相同vgroup名,否则事务协调器无法识别为同一分布式事务单元。
第四步:禁用Yii3默认的PDO事务嵌套行为。在 config/db.php 中设置 'enableSchemaCache' => false,防止Schema缓存干扰Seata的SQL解析。











