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サーバによると展開することができます。
注意すべきいくつかのこと:
- 私たちは、インターフェースロジックのimplディレクトリを実装する必要があります。
- services.php、ホームクラスの位置にSRCで指定されたホーム-API、protocolNameがPBで、serverTypeのはgrpcです
- プロトコルの種類にタールプラットフォームは、TCP、非タール契約です。
- ここに示したように、「グーグル/いる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下で使用されるように。
- ActComment.protoは、ディレクトリタールにファイルをコピーします
- ActCommentPb.proto.phpファイル、コンテンツ、および偽withServant =を変更一致tars.proto.phpコンテンツコード・サーバーの生成を構築
- PHPを実行... / srcに/ベンダー/ phptars / tars2php / SRC / proto2php.php ./actCommentPb.proto.php
- 生成されたコードの後に、関連するプロトコル/ QD / ActCommentPbServerを見ることができます。(サーバ側のコードと同様の、CommentObjServant.phpのproto2phpが生成され、他のドキュメントproto2phpコールprotocプラグイン生成)
- サーバー側とPSR-4での議定書とGPBMetadataのcomposer.jsonに追加するなどの必要があります。
- そして、あなたは直接法の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
著者:張勇