wokerman thrift调试历程

Posted 呆呆熊的技术路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wokerman thrift调试历程相关的知识,希望对你有一定的参考价值。

前期准备:

 1yum -y update
2wget http://mirrors.cnnic.cn/apache/thrift/0.9.0/thrift-0.9.0.tar.gz
3yum -y groupinstall "Development Tools"
4
5wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
6tar xvf autoconf-2.69.tar.gz
7cd autoconf-2.69
8./configure --prefix=/usr
9make && make install
10
11wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
12tar xvf automake-1.14.tar.gz
13cd automake-1.14
14./configure --prefix=/usr
15make && make install
16
17wget http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz
18tar xvf bison-2.5.1.tar.gz
19cd bison-2.5.1
20./bootstrap.sh
21./configure --prefix=/usr
22make && make install
23
24yum -y install libevent-devel zlib-devel openssl-devel

thrift安装包:

1wget https://mirrors.cnnic.cn/apache/thrift/0.9.3/thrift-0.9.3.tar.gz
2
3./configure && sudo make && sudo make install
1启动
2/usr/server/php7/bin/php start.php start
3关闭
4/usr/server/php7/bin/php start.php stop

下面我们实际创建个例子

1.第一步模仿下官方例子,自己建一个thift协议

1namespace php Services.UserInfo
2service UserInfo
3{
4    string sayHello(1:string name);
5    i32 getMyScore(1:string age)
6}
7

命名空间第一个语言名,后面为生成的命名空间名称。
此处实现了两个方法:一个返回字符串类型 第二个返回int32类型
他们均接受一个字符串参数

2.生成代码文件

1thrift -gen php:server UserInfo.thrift

3.在当前目录下的 gen-php/Services应该生成了个UserInfo的文件夹。

UserInfo此为命名空间目录,下面的文件夹共有两个文件。

  1. Types.php 2. UserInfo.php

  1. 将生成的文件目录UserInfo 复制到 workerman 下面的Applications/ThriftRpc/Services/下

cp ./UserInfo /data/www/xxx/workerman-thrift/Applications/ThriftRpc -r



  1. 在复制过来的UserInfo里面新建 UserInfoHandler.php 文件, 实现UserInfoIf的接口,这些接口是我们在UserInfo.thrift中定义的。
    <br />&lt;?php</li> </ol> namespace Services\UserInfo; class UserInfoHandler implements UserInfoIf {    public function sayHello($name)    {        //mysql查询        return ["123","456"];    } ¨K62K }


    如果你的返回值类型并不是thrift文件定义的那样,将会被强制转义并在后台报一条错误。 必须以Handler结尾的文件类名

    6.绑定端口提供服务

    1$worker = new ThriftWorker('tcp://0.0.0.0:9093');
    2$worker->name = 'UserInfo'//设置进程名称
    3$worker->count = 2;  //开启两个进程提供
    4$worker->class = 'UserInfo'//要提供的服务名称
    1/usr/server/php7/bin/php start.php start 启动
    2/usr/server/php7/bin/php start.php  stop 停止
    3/usr/server/php7/bin/php start.php restart 重启
    4/usr/server/php7/bin/php start.php reload 平滑重启

    注意启动后查看 进程名称是否存在,listen中tcp列表 是否有我们新增的端口
    相应的process数量对应我们刚才设置的count属性。


    服务简单的运行起来了,下面我们看下客户端

    1.首先我们引入ThriftClient.php

    1require "/data/www/xxx/workerman-thrift/Applications/ThriftRpc/Clients/ThriftClient.php";
    2
    3use ThriftClient\ThriftClient

    它会自动帮我们引入我们需要的类

     1thriftClient::config(
    2    array(
    3        'HelloWorld' => array(
    4            'addresses' => array(
    5                '127.0.0.1:9090',
    6                //'127.0.0.2:9191',
    7            ),
    8            'thrift_protocol' => 'TBinaryProtocol',//不配置默认是TBinaryProtocol,对应服务端HelloWorld.conf配置中的thrift_protocol
    9            'thrift_transport' => 'TBufferedTransport',//不配置默认是TBufferedTransport,对应服务端HelloWorld.conf配置中的thrift_transport
    10        ),
    11        'UserInfo' => array(
    12            'addresses' => array(
    13                '127.0.0.1:9093'
    14            ),
    15        ),
    16    )
    17);

    3.获取UserInfo的实例-调用方法

    1$client = ThriftClient::instance('UserInfo');
    2$data = $client->getMyScore(12); //同步调用
    3var_dump($data);
    4
    5$client->asend_sayHello(12); //异步调用
    6echo $client->arecv_sayHello(12); //接收

    注意 异步调用和接收值的传参数必须一致,否则无法定位到该接收哪个值。


    更多的thrift语法使用:

     11基本类型
    2bool: 布尔值 (true or false), one byte
    3
    4byte: 有符号字节
    5
    6i16: 16位有符号整型
    7
    8i32: 32位有符号整型
    9
    10i64: 64位有符号整型
    11
    12double64位浮点型
    13
    14string: Encoding agnostic text or binary string
    1map<string,string> getMyScore(1:i32 age) 

    返回值为key和value均强制转换为为string.

    1list<map<string,string>> getMyScore(1:i32 age)

    注意list结构其实对应php的0,1,2,3有序下标。

    1return [
    2        'data'=>["name" => "小明""age" => 18"is_open" => true],
    3        'common' => [
    4            'uid' => 12,
    5        ],
    6    ];

    返回结果:

     1array (
    2  0 => 
    3  array (
    4    'name' => '小明',
    5    'age' => '18',
    6    'is_open' => '1',
    7  ),
    8  1 => 
    9  array (
    10    'uid' => '12',
    11  ),
    12)

    结构体

    1map<string,map<string,string>> getMyScore(1:i32 age)

    返回值

     1array (
    2  'data' => 
    3  array (
    4    'name' => '小明',
    5    'age' => '18',
    6    'is_open' => 'true',
    7  ),
    8  'uid' => 
    9  array (
    10    0 => '1',
    11    1 => '2',
    12    2 => '3',
    13    3 => '4',
    14    4 => '5',
    15  ),
    16)

    结构体

    1map<string,map<string,string>> getMyScore(1:i32 age)

    返回值:

     1array (
    2  'data' => 
    3  array (
    4    'name' => '小明',
    5    'age' => '18',
    6    'is_open' => 'true',
    7  ),
    8  'uid' => 
    9  array (
    10    0 => '1',
    11    1 => '2',
    12    2 => '3',
    13    3 => '4',
    14    4 => '5',
    15  ),
    16)

    如何为自己的应用程序拓展model层等

    1$loader = new ThriftClassLoader();
    2$loader->registerNamespace('Thrift', THRIFT_ROOT.'/Lib');
    3$loader->registerNamespace('Service', THRIFT_ROOT);
    4$loader->registerNamespace('Model', THRIFT_ROOT.'/Model');
    5$loader->register();

    workerman-thrift/Applications/ThriftRpc/ThriftWorker.php:22
    注册Model到命名空间中

    1/data/www/xxx/workerman-thrift/vendor/workerman/workerman.log

    thrift实际部署工作流

    thrift区分客户端和服务端

     1#!/bin/sh
    2

    3cd `dirname $0`
    4
    5for name in `ls ./thrift`
    6do
    7   thrift -gen php:server ./thrift/$name
    8   cp ./gen-php/Services/* ../Applications/ThriftRpc/Services/ -r
    9  /usr/server/php7/bin/php  ../start.php restart -d
    10
    11done

    在服务器端的脚本,扫描文件生成,复制到业务目录里,然后重启workerman
    但是客户端需要用到生成的文件XXService/XXService.php,整个工作流目前怎么管理还不知道,希望有耐心看到这里的读者给我些思路。 目前用的手动创建目录复制。

    客户端调用实例:

     1require "./Clients/ThriftClient.php";
    2
    3use ThriftClient\ThriftClient;
    4
    5thriftClient::config(
    6    array(
    7        'PayService' => array(
    8            'addresses' => array(
    9                '127.0.0.1:9090',
    10                //'127.0.0.2:9191',
    11            ),
    12            'thrift_protocol' => 'TBinaryProtocol',//不配置默认是TBinaryProtocol,对应服务端HelloWorld.conf配置中的thrift_protocol
    13            'thrift_transport' => 'TBufferedTransport',//不配置默认是TBufferedTransport,对应服务端HelloWorld.conf配置中的thrift_transport
    14        ),
    15    )
    16);
    17
    18$client = ThriftClient::instance('PayService');
    19//获取详情
    20//var_export($client->xxxxx('1144778255615962','26')); 
    21var_export($client->xxxxxx(12312));  

    使用composer安装客户端

    composer.json

     1{
    2  "name":"thrift client",
    3  "require":{
    4    "cto/thrift_client":"dev-master"
    5  },
    6  "repositories":{
    7    "cto/thrift_client":{
    8      "type":"git",
    9      "url":"https://github.com/chinawangyu/thriftClient.git"
    10    }
    11  },
    12  "autoload":{
    13    "psr-4": {
    14      "ThriftClient\\""vendor/cto/thrift_client"
    15    }
    16  }
    17}

    workerman运行:

    1/usr/server/php7/bin/php start.php status
    2查看运行状态

    监控workerman运行

    http://127.0.0.1:55757/
    需要额外配置  Applications/Statistics/Lib/Cache.php

    1 public static $ServerIpList = array('127.0.0.1');
    1. 定义返回一个二维数组类型

    2. php中获取数据库中查询的一维数组返回回来:

    3. 启动服务


以上是关于wokerman thrift调试历程的主要内容,如果未能解决你的问题,请参考以下文章

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

thrift安装及python和c++版本调试

idea远程调试

Idea IntelliJ远程调试教程

PHP代码-psysh调试代码片段工具

方便调试使用的代码片段