tinywan / rpc
适用于webman插件的简单RPC服务
v1.3.0
2024-08-16 06:46 UTC
Requires
- php: >=7.4
- ext-json: *
- tinywan/exception-handler: ^1.5
- workerman/webman-framework: ^1.5
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.6
- phpstan/phpstan: ^1.4
- workerman/webman: ^1.0
README
安装
composer require tinywan/rpc
使用
服务端服务
新建 service/User.php
服务(如果目录不存在,请自行创建)
namespace service; class User { public function get($args) { return response_rpc_json(0,'获取成功', $args); } }
客户端调用
webman框架使用
use Tinywan\Rpc\Client; $request = [ 'class' => 'User', 'method' => 'get', 'args' => [ [ 'uid' => 2023, 'username' => 'Tinywan', ] ] ]; $client = new Client('tcp://127.0.0.1:9512'); $res = $client->request($request); var_export($res);
非webman框架使用
// 建立socket连接到内部推送端口 $resource = stream_socket_client('tcp://127.0.0.1:9512', $errorCode, $errorMessage); if (false === $resource) { throw new \Exception('rpc failed to connect: '.$errorMessage); } $request = [ 'class' => 'user', 'method' => 'get', 'args' => [ [ 'uid' => 2023, 'username' => 'Tinywan', ] ] ]; // 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符 fwrite($resource, json_encode($request)."\n"); // 读取推送结果 $result = fgets($resource, 10240000); fclose($resource); // 解析JSON字符串 $result = json_decode($result, true); var_export($result);
请求响应结果
{ "code": 0, "msg": "用户列表", "data": { "uid": 2024, "username": "Tinywan" } }
请求响应异常结果
{ "code": 404, "msg": "接口调用类不存在", "data": {} }
在客户端发起一个远程调用伪代码中
客户端调用服务端,如果服务端代码为本地则是本地调用,如果服务端代码在另一台机器则需要远程调用(RPC协议)
- 服务端通过插件tinywan/rpc自定义进程实现一个文本text协议服务
- 客户端将Server和B方法,以及B方法可能带有的参数序列化
- 通过stream_socket_client将序列化的消息发送给服务端
- 服务端接收消息并反序列化
- 通过反射调用调用服务端的Server类下的B方法
- 服务端Server类B方法返回的结果序列化
- 将返回的序列化结果通过stream_socket_client发送给客户端
- 客户端通过反序列化得到结果
调用编码
1. 接口方法
包括接口名、方法名
2. 方法参数
包括参数类型、参数值
3. 调用属性
包括调用属性信息,例如调用附件隐式参数、调用超时时间等
-- 返回编码 --
1. 返回结果
接口方法中定义的返回值
2. 返回码
异常返回码
3. 返回异常信息
调用异常信息