Giter VIP home page Giter VIP logo

workerman-thrift's Introduction

workerman

workerman 是一个高性能的PHP socket服务框架,开发者可以在这个框架下开发各种网络应用,例如Rpc服务、聊天室、游戏等。 workerman 具有以下特性

  • 多进程
  • 支持TCP/UDP
  • 支持各种应用层协议
  • 使用libevent事件轮询库,支持高并发
  • 支持文件更新检测及自动加载
  • 支持服务平滑重启
  • 支持长连接
  • 支持以指定用户运行worker进程

更多请访问www.workerman.net

所需环境

workerman需要PHP版本不低于5.3,只需要安装PHP的Cli即可,无需安装PHP-FPM、nginx、apache workerman不能运行在Window平台

安装

1、下载 或者 git clone https://github.com/walkor/workerman-thrift

2、运行 composer install

启动停止

以ubuntu为例

启动
php start.php start -d

重启启动
php start.php restart

平滑重启/重新加载配置
php start.php reload

查看服务状态
php start.php status

停止
php start.php stop

在WorkerMan上使用Thrift

安装Thrift

以ubuntu安装Thrift为例

  • 首先安装Thrift依赖的扩展包
    sudo apt-get install libboost-dev automake libtool flex bison pkg-config g++
  • 下载Thrift
    http://thrift.apache.org/download/
  • 解压缩后安装
    sudo ./configure && sudo make && sudo make install

使用Thrift

定义一个Thrift的IDL文件 HelloWorld.thrift

namespace php Services.HelloWorld
service HelloWorld
{
    string sayHello(1:string name);
}  

注意:命名空间统一使用 Services.服务名

编译接口文件

thrift -gen php:server HelloWorld.thrift

拷贝编译好的文件到workerman下的目录

cp ./gen-php/Services/HelloWorld /yourdir/workerman/applications/ThriftRpc/Services/ -r

编写handler文件

在Applications/ThriftRpc/Services/HelloWorld/目录下创建HelloWorldHandler.php如下

<?php
// 统一使用Services\服务名 做为命名空间
namespace Services\HelloWorld;

class HelloWorldHandler implements HelloWorldIf {
  public function sayHello($name)
  {
      return "Hello $name";
  }
}

初始化

在Applications/ThriftRpc/start.php 中初始化服务,包括进端口和程数

require_once __DIR__ . '/ThriftWorker.php';

// helloworld
$hello_worker = new ThriftWorker('tcp://0.0.0.0:9090');
$hello_worker->count = 16;
$hello_worker->class = 'HelloWorld';

// another worker
//$another_worker = new ThriftWorker('tcp://0.0.0.0:9091');
//$another_worker->count = 16;
//$another_worker->class = 'AnotherClass';

运行

进入workerman-thrift根目录运行

php start.php start -d

workerman-Thrift客户端的使用

workerman-Thrift客户端支持的特性

支持故障节点自动踢出及故障节点恢复检测

  • 当某个节点无法访问的时候,客户端会自动将该节点踢掉
  • 有一定的几率(默认5/10000,保证在有故障节点时业务成功率在99.95%以上)重新访问故障节点,用来探测故障节点是否已经存活
  • 故障节点自动踢出及节点恢复检测功能需要客户端PHP支持sysvshm

支持异步调用

  • workerman-Thrift客户端支持请求发送与接收返回分离
  • 业务可以通过一个客户端实例发送多个请求出去,但是不必立刻接收服务端回应
  • 待业务需要对应的服务端回应时再接收数据,使用服务器回应的数据
  • 异步调用实现了并行计算,可以大大的减少客户端业务的等待时间,极大的提高用户体验

workerman-Thrift客户端使用示例

<?php
    
    // 引入客户端文件
    require_once 'yourdir/workerman/applications/ThriftRpc/Clients/ThriftClient.php';
    use ThriftClient\ThriftClient;
    
    // 传入配置,一般在某统一入口文件中调用一次该配置接口即可
    ThriftClient::config(array(
                         'HelloWorld' => array(
                           'addresses' => array(
                               '127.0.0.1:9090',
                               '127.0.0.2:9191',
                             ),
                             'thrift_protocol' => 'TBinaryProtocol',//不配置默认是TBinaryProtocol,对应服务端HelloWorld.conf配置中的thrift_protocol
                             'thrift_transport' => 'TBufferedTransport',//不配置默认是TBufferedTransport,对应服务端HelloWorld.conf配置中的thrift_transport
                           ),
                           'UserInfo' => array(
                             'addresses' => array(
                               '127.0.0.1:9393'
                             ),
                           ),
                         )
                       );
    // =========  以上在WEB入口文件中调用一次即可  ===========
    
    
    // =========  以下是开发过程中的调用示例  ==========
    
    // 初始化一个HelloWorld的实例
    $client = ThriftClient::instance('HelloWorld');
    
    // --------同步调用实例----------
    var_export($client->sayHello("TOM"));
    
    // --------异步调用示例-----------
    // 异步调用 之 发送请求给服务端(注意:异步发送请求格式统一为 asend_XXX($arg),既在原有方法名前面增加'asend_'前缀)
    $client->asend_sayHello("JERRY");
    $client->asend_sayHello("KID");
    
    // 这里是其它业务逻辑
    sleep(1);
    
    // 异步调用 之 接收服务端的回应(注意:异步接收请求格式统一为 arecv_XXX($arg),既在原有方法名前面增加'arecv_'前缀)
    var_export($client->arecv_sayHello("KID"));
    var_export($client->arecv_sayHello("JERRY"));

workerman-Thrift及客户端目录结构

客户端放在了workerman/applications/ThriftRpc/Clients目录下

在workerman里面客户端和服务端共用了Lib 和 Services 目录,单独使用客户端时,如果客户端没有这两个目录,需要从workerman上将这两个目录拷贝过去

workerman/applications/ThriftRpc + 
                              |- Clients +
                              |          |- ThriftClient.php    // workerman-thrift客户端主文件
                              |          |- AddressManager.php  // 带故障节点踢出功能的地址管理器
                              |- Lib +
                              |      |- Thrift +                // Thrift自带的文件,这里实际上和服务端共用了一套
                              |                |- ........      
                              |- Services +                     // 服务相关的文件,这里实际上和服务端共用了一套
                                          |- HelloWorld +
                                          |             |- HelloWorld.php         // thrift生成的文件
                                          |             |- Types.php              // thrift生成的文件
                                          |             |- HelloWorldHandler.php  // 服务端需要写的文件,客户端不需要
                                          |- 其他服务 +
                                          |           |- ...............
                                          .           .
                                          .           .
                                          .           .

性能测试

环境

系统:Debian GNU/Linux 6.0
cpu :Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz * 24
内存:64G

WorkerMan:开启24个Worker进程处理业务请求
压测软件:loadrunner

业务逻辑

HelloWorld sayHello

结果

吞吐量:平均8200/S
内存占用:24*12M=288M
cpu平均使用率:55%
load:16
流量:15M/S

处理曲线平稳,无内存泄漏,无流量抖动

workerman-thrift's People

Contributors

billowqiu avatar walkor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

workerman-thrift's Issues

业务接口比较多

业务接口多,然后单个service文件很大,超过1w行代码了,导致php应用端调用的地方内存偏高,有解决办法嘛

是在这里提问题么?

try {
$client = ThriftClient::instance('HelloWorld');
} catch(Exception $e) {
exit($e -> getMessage());
}

但是抓取不到异常的服务器(连不上)报错

请问可以配置用户密码连接吗?

我翻看了一下源码,没有找到相关配置的代码,请问有相关的配置吗,如果没有那是否表示别人得到了rpc服务器的IP和端口就可以进行连接了?有没有相应的安全验证呢?刚接触thrift不久望解答,谢谢!

批量调用失败

有一个问题,采用workman的php做thrift服务端,java客户端,批量调用测试的时候为啥每次都得open一下,否则直接死了,也没有任何异常信息,但是貌似php直接调用时ok的。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.