Composer 不提供服务网格能力,它只是依赖管理工具;所谓“基于 Composer 构建服务网格”,实为通过 composer require 安装熔断等组件库,并在代码中手动集成、配置和调用才能实现对应功能。

Composer 本身不提供服务网格能力,也不内置熔断降级逻辑——它只是依赖管理工具。所谓“基于 Composer 构建服务网格”,本质是用 Composer 安装和组织那些真正实现熔断、降级、通信的 PHP 库,再通过代码集成形成网格行为。
composer require 装的是什么?不是熔断器,而是熔断器的载体
你执行 composer require hyperf/circuit-breaker 或 composer require mix/micro-hystrix,装进去的不是开箱即用的“服务网格”,而是一个可编程的熔断组件。它不自动拦截所有 HTTP 请求,也不会自己发现服务实例或路由流量。
- Hyperf 的
hyperf/circuit-breaker依赖Psr\SimpleCache接口,需手动绑定 Redis 或 ArrayCache 实现状态持久化;缺缓存驱动时,isOpen()永远返回false - Mix Micro Hystrix 的
CircuitBreaker::do()必须显式包裹业务调用,不加这层包装,熔断逻辑完全不生效 - 所有这类库都不修改 PHP 的 autoloader 或请求生命周期——它们只在你调用时才起作用
为什么不能直接在 composer.json 里配“全局熔断”?
因为 Composer 不参与运行时控制。它的 autoload、scripts、repositories 都只在安装/更新阶段执行。你想让每个 Guzzle 请求都自动走熔断,就得自己封装 HTTP 客户端,或用 AOP(如 goaop/framework)织入逻辑——而这一步,Composer 只负责帮你装好 GoAOP 和熔断器,不写一行拦截代码。
- 常见误操作:
"scripts": {"post-autoload-dump": "php bin/circuit-init.php"}—— 这个脚本只在dump-autoload时跑一次,无法维护运行时状态 - 真正的状态(失败计数、时间窗口、半开探测)必须存在进程内(Swoole)或外部存储(Redis),且由每次请求触发更新
- 如果用 FPM,每次请求都是新进程,除非用 Redis,否则计数器无法跨请求累积,熔断基本失效
Hyperf + circuit-breaker 的最小可行集成要点
Hyperf 是目前 PHP 生态中对服务网格支持最直接的框架,但即使如此,仍需手动串联几个关键点才能让熔断“动起来”:
立即学习“PHP免费学习笔记(深入)”;
- 安装后必须发布配置:
php bin/hyperf.php vendor:publish hyperf/circuit-breaker,否则circuit_breaker.php配置文件不会生成 - 配置里的
default策略只对Hyperf\CircuitBreaker\Annotation\CircuitBreaker注解生效;没加注解的方法,哪怕用了HttpClient,也不受控 - 若想对 Guzzle 实例统一加熔断,得继承
GuzzleHttp\Client,在request()方法里调用CircuitBreaker::call(),并传入唯一$name标识下游服务 - 注意
sleepWindow单位是毫秒(Hyperf 默认 60000),而 Mix Hystrix 是秒(默认 10)——混用时容易误设成 10 毫秒,导致刚熔断就立刻半开
降级逻辑不是自动 fallback,而是你写的那个 _demotion 方法
像 clevephp/la-limiting 这类库,声明 index_demotion() 就能触发降级,看起来很自动化。但它背后依赖的是运行时方法名反射 + 命名约定,不是语言特性,更不兼容 PSR-4 自动加载规则。
- 如果控制器类用了 trait 引入方法,
_demotion后缀方法可能找不到——PHP 不会自动从 trait 中匹配 - Hyperf 的
@CircuitBreaker(fallback="fallbackMethod")要求fallbackMethod是同一类中的 public 方法,且签名必须与原方法一致(包括参数类型和数量) - 最易忽略的一点:fallback 方法里不能再调用同一个熔断器保护的下游服务,否则可能陷入嵌套熔断或死循环
真正难的从来不是装哪个包,而是把状态存哪、谁来重置计数、半开探测怎么选请求、降级数据是否要缓存——这些决策没法靠 composer install 解决,只能靠你在代码里写清楚。



















