sofa-pbrpc
sofa-pbrpc copied to clipboard
PHP扩展设计
功能
以php扩展的方式提供给用户,用户使用扩展库在php程序中向server发起RPC调用
接口设计
用户接口
- PHP-Protobuf库选用allegro/php-protobuf,并修改其pb接口生成工具,增加与RPC相关的Service和Method接口,用户定义proto后通过工具protoc-php.php生成php-protobuf接口文件,该接口中调用sofa-pbrpc php扩展的功能函数,实现RPC调用。
- sofa-pbrpc php扩展为用户提供一个接口类PHPRpcServiceStub,工具生成的pb接口中rpc服务继承于该类,通过该类进行RPC调用,并获取调用的错误码以及错误提示。生成pb接口的Message部分与allegro/php-protobuf保持一致,以EchoServiceStub为例,用户的proto文件中service定义如下:
service EchoServiceStub
{
rpc Echo(EchoRequest) returns(EchoResponse);
}
生成Service/Method函数接口如下:
class EchoServiceStub extends PHPRpcServiceStub
{
// 用户通过EchoServiceStub 类创建rpc服务实例
function __construct($address);
// 在stub中注册method
private function RegisterEcho();
// 设置rpc调用超时
public function SetTimeout($timeout);
// 发起RPC调用
public function Echo($request, $response, $closure);
// 获取错误码
public function Failed();
// 获取错误提示
public function ErrorText();
}
扩展接口
- 扩展的工作流程分为三个部分
- 初始化RpcServiceStub:创建RpcChannel和RpcController等组件
- 用户Method注册:解析输入输出Descriptor,在method_board添加表项
- 用户传递的request pb结构转换成google 的pb结构
- 调用CallMethod发起RPC调用
- 将google pb结构的response转化成用户pb结构 扩展暴露给PHP的接口如下:
PHP_METHOD(PHPRpcServiceStub, InitService);
PHP_METHOD(PHPRpcServiceStub, SetTimeout);
PHP_METHOD(PHPRpcServiceStub, Failed);
PHP_METHOD(PHPRpcServiceStub, ErrorText);
PHP_METHOD(PHPRpcServiceStub, RegisterMethod);
PHP_METHOD(PHPRpcServiceStub, InitMethods);
PHP_METHOD(PHPRpcServiceStub, CallMethod);
- 用户接口中__construct调用InitService创建RPC组件,对service初始化
- RegisterEcho调用RegisterMethod和InitMethods,注册用户函数并初始化
- Echo调用CallMethod完成RPC调用
- SetTimeout调用SetTimeout设置超时
- 用户接口中Failed和ErrorText分别调用扩展中Failed和ErrorText获取错误状态的错误信息
用户使用方法
- 编译生成sofa_pbrpc.so扩展库,通过修改php.ini装载扩展
- 使用protoc-php.php生成proto_pb.php文件,在代码中require该pb接口,sample会在扩展目录下给出。