sofa-pbrpc icon indicating copy to clipboard operation
sofa-pbrpc copied to clipboard

PHP扩展设计

Open zd-double opened this issue 9 years ago • 0 comments

功能

以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();
    }

扩展接口

  • 扩展的工作流程分为三个部分
    1. 初始化RpcServiceStub:创建RpcChannel和RpcController等组件
    2. 用户Method注册:解析输入输出Descriptor,在method_board添加表项
    3. 用户传递的request pb结构转换成google 的pb结构
    4. 调用CallMethod发起RPC调用
    5. 将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会在扩展目录下给出。

zd-double avatar Jan 19 '16 13:01 zd-double