TarsPHP新しいバージョンがリリースされて、いるProtobuf契約をサポート

2008年から今日までタールテンセントは、統一されたアプリケーションフレームワークTAF(合計アプリケーションフレームワーク)使用される層の背後にあるロジックであったが、現在はC ++やJava、PHPをサポートし、囲碁の言語をNodejs。フレームワークは、完全なソリューションをユーザーに提供し、開発、運用、保守を必要とし、製品またはサービスのテストは、オンライン迅速な開発、展開、テストを支援します。これは、スケーラブルなプロトコルコーデック、高性能RPC通信フレームワーク、ルートの名前を組み合わせて、リリースのモニタリングを発見し、統計情報を記録、構成管理は、迅速マイクロサービスの利用を通して、あなた自身の安定性と信頼性の高い分散アプリケーションを構築することができるものである、と完全かつ効果的なサービスのガバナンスを実現。

ソリューションのPHP言語でタール、次の4つの側面を設計する主な考慮事項としてTarsPHP:

  • 完全に機能する:既存のC ++、JavaとNodeJSシステム機能をベンチマーキング、
  • 柔軟性:PHPと争う柔軟な理論、?
  • 軽量:最軽量設計、表面的な、プラグアンドプレイ
  • 効率的な:プラグSwooleのコルーチンの翼、飛ぶために持っていました

いるProtobufプロフィール

(PBと呼ぶ)プロトコルバッファは、Googleの言語に中立なオープンソースであり、プラットフォームに依存しない、スケーラブルな形式の配列データは、通信プロトコル、データ・ストレージのために使用することができます。これは、XMLに似てますが、XMLより小さく、より速く、より簡単です。

PBは、伝送ネットワークおよびRPCコールに来るならば、我々は通信プロトコルを導入する必要があり、コーディングプロトコルです。符号化プロトコルとしてHTTP2、PBの使用上の通信プロトコルとしてGoogleのオープンソースフレームワークgRPC RPC。

そして、PBのサポートについてTarsGo異なります

TarsGoは、PBのサポート、本質的プロトプロトコルファイルサポートに関するタールプロトプロトコル合意にファイルを変換する機能を提供し、各コールの実際の使用はタール契約です。このサービスは、互いに他のタールのサービスと連携することができます。

PBの上TarsPHPサポートは、gRPCサービス、タール上で展開サービスプラットフォーム、タール参加プラットフォームのアドレス指定可能、タールのプラットフォーム管理を構築することです。このサービスは、プロトコルをコーディングとしているProtobufを使用して、ネットワーク通信プロトコルとしてHTTP2にgRPCを使用し、他のPBクライアントが相互に動作することができます。

二つの異なる方向は、私はあなたが区別を願って、混在させることはできません。

関連データ

私たちは、同じHTTPサービスを使用し、Pbがタール通信プロトコルおよびバックエンドサービスと圧力測定を使用しました。

  • サーバー環境:2芯4G、PHP 7.2.16、swoole 4.4.0
  • 非トランスポート・サービスは、任意の直接的なリターンのない単純なバックエンドサービスへのping、ビジネスプロセスを指します。
  • シンプルな単一のRPCアクセスが集中砲火int型、ランド値の世代番号を返し、バックエンドサービスの数を意味し、mysqlの回数は使用しません。
  • シングル複雑PRCは、実際に構造的完全性の弾幕オブジェクトを複数備え、バックエンド構造に集中砲火のリストを取得します。
QDPS PB TARS
非輸送サービス 3800 6200
シングルシンプルなRPC 3600 6150
シングル複雑なRPC 1050 1150

観点から圧力測定データは、タールPBの長さよりも高い性能が、二つのパッキンとの間のコントラストは、PBパッキング及びアンパッキング性能の性能はタールよりもわずかに良好であることを見出し開梱、私が考えるこの結果の主な原因はgRPCは、通信プロトコルとしてHTTP2を使用することですより多くのオーバーヘッドを必要とタールカスタム通信プロトコルを比較しました。

使用TarsPHPはPBサーバーを構築します

環境を初期化します

  • Protocインストール

    • Protocはまず、ライブラリの主な役割は、梱包しているProtobufプロトコルデータを開梱されたライブラリをインストールする必要があります。参照することができます  https://github.com/protocolbuffers/protobuf/tree/master/src  直接インストール。

      ./autogen.sh
      ./configure
      make
      make install
      

      protoc -version通常出力した場合、インストールは完了です

  • PHPいるProtobufインストール

    • PHPのいるProtobufの拡張機能をインストールする必要後、この拡張機能は、主にPHPとprotocライブラリの途中でブリッジとして使用されています。

      git clone https://github.com/protocolbuffers/protobuf.git
      cd ./php/ext/google/protobuf/
      phpize
      ./configure
      make
      make install
      (需要编辑php.ini文件,开启protobuf扩展)
      

      -riいるProtobuf出力がPHP場合は、正しくインストール。

  • Swooleインストール

    • バージョン4.4.0以上を使用することをお勧めします、あなたはHTTP2およびOpenSSLサポートを開く必要があります。

プロトファイルを書きます

ActDemo審査サービスにおけるタールファイル参照TarsPHPは、我々はactComment.protoに合意文書を書きました。

契約文書と異なるタール、所定のプロトコルプロト入力及び出力パラメータは、メッセージのみの構造である必要があり、入力及び出力パラメータは、パッケージ内の単一のメッセージに必要とされます。

syntax = "proto3";  
  
package protocol.QD.ActCommentPbServer;  //包名,会根据包名生成 php类路径

service CommentObj {  
  rpc ping(PingRequest) returns (PingResponse) {};  
  
  rpc getCommentCount(CountRequest) returns (CountResponse) {};  
  
  rpc createComment(CreateRequest) returns (CreateResponse) {};  
  
  rpc getComment(GetRequest) returns (GetResponse) {};  
}  
  
//输入参数通用结构体  
message CommonInParam {  
    int32 appId = 1;  
    int32 areaId = 2;  
    int64 userId = 3; //用户信息  
    string userIp = 4; //来源名称  
    string serverIp = 5; //调用方服务器ip  
};  
  
//输出参数通用结构体  
message CommonOutParam {  
    int32 code = 1;  //接口返回码  
    string message = 2;  //接口返回提示信息  
};  
  
message SimpleComment {  
    int32 id = 1;  
    int64 activityId = 2;  
    int64 userId = 3;  
    string content = 4;  
    string title = 5;  
    string ext1 = 6;  
    int64 createTime = 7;  
};  
  
message QueryParam {  
    int64 activityId = 1;  
    int32 page = 2;  
    int32 size = 3;  
    int32 orderType = 4;  
};  
  
message CreateRequest {  
    CommonInParam inParam = 1;  
    SimpleComment comment = 2;  
};  
  
message CreateResponse {  
    CommonOutParam outParam = 1;  
};  
  
message GetRequest {  
    CommonInParam inParam = 1;  
    QueryParam queryParam = 2;  
};  
  
message GetResponse {  
    CommonOutParam outParam = 1;  
    repeated SimpleComment list = 2;  
};  
  
message PingRequest {  
};  
  
message PingResponse {  
};  
  
message CountRequest {  
};  
message CountResponse {  
    int32 count = 1;  
};

サーバー側のコードを生成します

protocプロト・ファイルは、対応するクラスコードのphpに応じて生成することができるが、gRPCウィジェットのクライアントコードを生成するために使用することができるプロトサーバー側のコードを生成する公式のファイルをサポートしていません。あなたは私たちもgrpcライブラリとgrpc PHP拡張をインストールする必要があり、クライアントのコードを生成する必要がある場合。

だから、私たちのアイデアが必要なクラスを生成し、その後、独自のプロトファイル生成サーバ側のインターフェイスを解決するPHPのprotocを使用することで、このプロセスは非常に多くの既存のtars2phpプロセスのようなものですので、我々はそれをproto2php呼び出します。

2つのツールの使用は、あまりにも多くの問題を発生させるために、我々は、使用を容易にproto2phpへの統合の過程でプロトを呼び出します。

のは、いくつかの基本的な情報を設定しtars.proto.phpを構築してみましょう。

return array(
    'appName' => 'QD',
    'serverName' => 'ActCommentPbServer',
    'objName' => 'CommentObj',
    'withServant' => true, //决定是服务端,还是客户端的自动生成
    'tarsFiles' => array(
        './actComment.proto',
    ),
    'dstPath' => '../src/protocol', //这里指定的是 impl 基础interface 生成的位置
    'protocDstPath' => '../src', //这里指定的是 protoc 生成的问题
    'namespacePrefix' => 'Protocol',
);

その後、PHPを実行... / srcに/ベンダー/ phptars / tars2php / SRC / proto2php.php ./tars.proto.php
GPBMetadataディレクトリとディレクトリのプロトコルを生成してきました。プロトコルファイルはプロトクラスPHPを生成され、それはさらにCommentObjServant.php proto2phpファイル生成サーバ側クラスインターフェースです。TarsPHPのPBサーバの構築は、このクラスを実装する必要があります。

TarsPHP PBサーバーの展開

デモのReadme tarsphp PBサーバによると展開することができます。

注意すべきいくつかのこと:

  1. 私たちは、インターフェースロジックのimplディレクトリを実装する必要があります。
  2. services.php、ホームクラスの位置にSRCで指定されたホーム-API、protocolNameがPBで、serverTypeのはgrpcです
  3. プロトコルの種類にタールプラットフォームは、TCP、非タール契約です。
  4. ここに示したように、「グーグル/いるProtobuf」を必要と自動ロードプロトコルをcomposer.jsonを追加する必要が設​​定され、GPBMetadataする必要があります:
    {
        "name" : "tars-tcp-server-demo",
        "description": "tars tcp server",
        "require": {
            "phptars/tars-server": "~0.3",
            "phptars/tars-deploy": "~0.1",
            "phptars/tars-log": "~0.1",
            "phptars/tars2php": "~0.1",
            "ext-zip" : ">=0.0.1",
            "google/protobuf": "^3.8"
        },
        "autoload": {
            "psr-4": {
                "Server\\" : "./",
                "Protocol\\" : "./protocol",
                "GPBMetadata\\" : "./GPBMetadata"
            }
        },
        "minimum-stability": "stable",
        "scripts" : {
            "deploy" : "\\Tars\\deploy\\Deploy::run"
        }
    }
    

作曲は実行スクリプトを展開、コードのパッケージを生成し、タールプラットフォームにアップロード最後の実行。

クライアントアクセスを使用します

あなたはgRPC生成されたPHPクライアントアクセステストを使用することができ、あなたは直接grpcクライアントがHTTP2のクライアントswooleを使用して構築することができます。

class TestGrpcClient
{
    public static function callGrpc($ip, $port, $path, $requestBuf)
    {
        $cli = new Swoole\Coroutine\Http2\Client($ip, $port, false);
        $cli->connect();
        $req = new swoole_http2_request;
        $req->method = 'POST';
        $req->path = $path;
        $req->headers = [
            "user-agent" => 'grpc-c/7.0.0 (linux; chttp2; gale)',
            "content-type" => "application/grpc",
            "grpc-accept-encoding" => "identity,deflate,gzip",
            "accept-encoding" => "identity,gzip",
            "te" => "trailers",
        ];
        $req->pipeline = false;
        $req->data = $requestBuf;
        $cli->send($req);
        $response = $cli->recv();
        return $response->data;
    }

    public static function main()
    {
        $commonIn = new CommonInParam();
        $commonIn->setUserId(0);
        $commonIn->setAppId(1);
        $commonIn->setAreaId(10);
        $commonIn->setServerIp('127.0.0.1');
        $commonIn->setUserIp('');

        $query = new QueryParam();
        $query->setActivityId(123);
        $query->setPage(1);
        $query->setSize(10);
        $query->setOrderType(1);

        $request = new GetRequest();
        $request->setInParam($commonIn);
        $request->setQueryParam($query);
        
        $requestBuf = $request->serializeToString();
        $packBuf = pack('CN', 0, strlen($requestBuf)) . $requestBuf;

        go(function () use ($packBuf){
            $path = "/protocol.QD.ActCommentServer.CommentObj/getComment";
            $ret = self::callGrpc('127.0.0.1', 10008, $path, $packBuf); //这里注意要修改成你服务在tars上绑定的ip 127.0.0.1不一定可以
            $response = new GetResponse();
            $response->mergeFromString(substr($ret, 5));
            foreach ($response->getList() as $row) {
                var_dump($row->getContent());
            }
        });
    }
}

PHPのclient.php観察リターンを実行します。

クライアント側のコードを生成します

クライアントは、先に述べたが、我々は単にデモアクセスPBサーバー、あなたは、私たちはPBサーバの状態をテストすることができます。あなたはそれを使用する方法を他のタールのサービスのPBサーバにコールする必要がある場合は?タールと我々はまた、PB、クライアント側のコードを生成するための同様の方法を提供します。

タールPBクライアントコードを生成し、PBサービスをコールする方法の一例として、本明細書QD.ActHttpServer TarsActDemo下で使用されるように。

  1. ActComment.protoは、ディレクトリタールにファイルをコピーします
  2. ActCommentPb.proto.phpファイル、コンテンツ、および偽withServant =を変更一致tars.proto.phpコンテンツコード・サーバーの生成を構築
  3. PHPを実行... / srcに/ベンダー/ phptars / tars2php / SRC / proto2php.php ./actCommentPb.proto.php
  4. 生成されたコードの後に​​、関連するプロトコル/ QD / ActCommentPbServerを見ることができます。(サーバ側のコードと同様の、CommentObjServant.phpのproto2phpが生成され、他のドキュメントproto2phpコールprotocプラグイン生成)
  5. サーバー側とPSR-4での議定書とGPBMetadataのcomposer.jsonに追加するなどの必要があります。
  6. そして、あなたは直接法のCommentObjServantクラスとPBの通信サービスに関連する呼び出すことができ、同様の呼び出しをタール。socketModelで入ってくるCommunicatorConfigは4 grpcモードに設定する必要があることに注意してください。

ここでは例を示します。

$inParam = new CountRequest();  
$outParam = new CountResponse();  
  
$conf = self::getConfig();  
$conf->setSocketMode(4);  
  
$servant = new CommentObjServant($conf);  
$servant->getCommentCount($inParam, $outParam);  
  
return $outParam->getCount();

貢献し、プロジェクト・ポイント・スターに参加することを歓迎します。

https://github.com/TarsPHP/TarsPHP

著者:張勇

おすすめ

転載: www.oschina.net/news/108869/tarsphp-support-protobuf