服务端必须安装hyperf/json-rpc和hyperf/rpc-server,缺一不可;若需consul注册则额外添加hyperf/service-governance和hyperf/consul;纯直连调用时后两者可省略。

服务端必须装哪些包
不装全就启动失败,hyperf/json-rpc、hyperf/rpc-server 是硬性依赖,缺一不可。如果后续要注册到 Consul,还得加 hyperf/service-governance 和 hyperf/consul;但纯直连调用(比如 Consumer 固定写死 IP+端口)时,这两个可不装。
常见错误现象:Class Hyperf\JsonRpc\HttpServer not found 或启动时报 Undefined class constant 'SERVER_HTTP',基本就是漏装 hyperf/json-rpc 或 PHP 版本/框架版本不匹配(Hyperf 3.0 要求 PHP ≥ 8.1)。
composer require hyperf/json-rpc hyperf/rpc-server- 若用 Consul:再执行
composer require hyperf/service-governance hyperf/consul - 别装
hyperf/rpc-client—— 这是 Consumer 用的,服务端不需要
server.php 里怎么配 JSON-RPC HTTP Server
Hyperf 3.0 默认只启 HTTP Server,JSON-RPC 需要额外声明一个 jsonrpc-http 类型的 server,并绑定 Hyperf\JsonRpc\HttpServer::onRequest。端口不能和主 HTTP Server 冲突(比如主服务占了 9501,这里就得换 9504 或 9802)。
关键点:
-
'name' => 'jsonrpc-http'必须和@RpcService(server: "jsonrpc-http")注解里的server值一致 -
'type' => Server::SERVER_HTTP不能写成SERVER_BASE或SERVER_TCP,否则协议解析失败 -
'callbacks' => [Event::ON_REQUEST => [\Hyperf\JsonRpc\HttpServer::class, 'onRequest']]这行少一个反斜杠或类名拼错,请求直接 404
示例片段(config/autoload/server.php):
'servers' => [
[
'name' => 'jsonrpc-http',
'type' => Server::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => 9504,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_REQUEST => [\Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
],
],
],
@RpcService 注解参数填什么
注解写错,服务根本不会被扫描注册。最常踩的坑是 name 和 service 不一致,或 protocol 拼错成 json-rpc(正确是 jsonrpc-http)。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
必须字段:
-
name:字符串,Consumer 配置里'name' => 'CalculatorService'要和它完全一致(大小写敏感) -
server:必须是server.php里定义的name,比如"jsonrpc-http" -
protocol:固定填"jsonrpc-http",不是"json-rpc"、"http-jsonrpc"或空字符串 -
publishTo:仅当用 Consul/Nacos 时才设,比如publishTo: "consul";直连模式可省略
示例:
#[RpcService(
name: "CalculatorService",
protocol: "jsonrpc-http",
server: "jsonrpc-http"
)]
接口契约文件必须两边完全一致
Provider 和 Consumer 共享同一个 interface 文件,不是“看起来一样”就行,而是文件路径、命名空间、方法签名(包括参数类型、返回类型、顺序)必须逐字相同。哪怕 Consumer 里多一个默认参数,或 Provider 里少一个 int 类型声明,调用时就会报 Method not found 或类型转换失败。
实操建议:
- 把
App\Rpc\CalculatorServiceInterface放在 Git 公共仓库或 Composer 包里,Provider 和 Consumer 都通过require引入,而不是各自复制一份 - 接口方法不要用可选参数或变长参数 —— JSON-RPC 协议不保证兼容性
- Consumer 的
services.php里'service' => \App\Rpc\CalculatorServiceInterface::class必须指向这个真实存在的 interface,不能是实现类
最容易被忽略的地方:Hyperf 默认不会校验 interface 是否被正确实现,只有运行时调用才暴露问题。上线前务必用 Postman 手动发一次 JSON-RPC 请求验证响应结构。










