前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >wokerman thrift调试历程

wokerman thrift调试历程

作者头像
用户2825413
发布2019-07-16 14:15:35
7310
发布2019-07-16 14:15:35
举报
文章被收录于专栏:呆呆熊的技术路
代码语言:javascript
复制
前期准备:
yum -y update
wget http://mirrors.cnnic.cn/apache/thrift/0.9.0/thrift-0.9.0.tar.gz
yum -y groupinstall "Development Tools"

wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar xvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure --prefix=/usr
make && make install

wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
tar xvf automake-1.14.tar.gz
cd automake-1.14
./configure --prefix=/usr
make && make install

wget http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz
tar xvf bison-2.5.1.tar.gz
cd bison-2.5.1
./bootstrap.sh
./configure --prefix=/usr
make && make install

yum -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此为命名空间目录,下面的文件夹共有两个文件。Types.php 2. UserInfo.php将生成的文件目录UserInfo 复制到 workerman 下面的Applications/ThriftRpc/Services/下cp ./UserInfo /data/www/xxx/workerman-thrift/Applications/ThriftRpc -r

在复制过来的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.php1require "/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);
UserInfo服务是我们新增的服务,address是我们的端口号,是个数组的配置。地址是可以支持多个,进行随机请求处理。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
12double: 64位浮点型
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到命名空间中log文件地址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}
require加载进来的名字 repositories仓库地址workerman运行:1/usr/server/php7/bin/php start.php status
2查看运行状态
监控workerman运行http://127.0.0.1:55757/
需要额外配置  Applications/Statistics/Lib/Cache.php1 public static $ServerIpList = array('127.0.0.1');
定义返回一个二维数组类型php中获取数据库中查询的一维数组返回回来:注册我们提供的服务地址启动服务
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 呆呆熊的技术路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档