ホームページ  >  記事  >  バックエンド開発  >  PHP 開発: Grpc と Protobuf を使用した高パフォーマンス RPC サービスの実装

PHP 開発: Grpc と Protobuf を使用した高パフォーマンス RPC サービスの実装

WBOY
WBOYオリジナル
2023-06-15 22:03:062823ブラウズ

インターネット技術の継続的な発展に伴い、分散システム アーキテクチャがますます一般的になってきました。 RPC (Remote Procedure Call) は、分散システム アーキテクチャの通信方式として、開発者からますます注目を集めています。 RPC サービスの実装では、パフォーマンスをいかに向上させるかが重要な問題になります。この記事では、Grpc と Protobuf を使用して高パフォーマンスの RPC サービスを実装する方法を紹介します。

1. Grpc および Protobuf とは

Grpc は、Google が開発した高性能、軽量、クロスランゲージ RPC フレームワークです。 HTTP/2 ベースのプロトコルを使用しており、クライアントとサーバーの両方のストリーミング データ送信、データ圧縮、SSL セキュリティ認証などの多くの機能をサポートしており、クラウド コンピューティング、ビッグ データ、モノのインターネットなどの分野で広く使用されています。

Protobuf (プロトコル バッファー) は、Google がオープンソース化した効率的なシリアル化形式です。ネットワーク送信とデータ ストレージに使用され、構造化データをバイナリ形式にシリアル化し、異なるプラットフォームや言語上のプログラム間で送信および解析できます。 Protobuf の最大の特徴は、サイズが小さい、高速である、言語に依存しないという点であり、ネットワークの送信や保存に非常に適したデータ形式です。

2. Grpc と Protobuf の利点

RPC サービスの実装プロセスにおいて、Grpc と Protobuf を使用すると次の利点が得られます:

  1. 効率的なデータ送信
#Grpc は、HTTP/2 ベースのプロトコルを使用し、多重化、ヘッダー圧縮、フロー制御などの機能をサポートしており、セキュリティを確保しながらデータ転送効率を向上させることができます。

Protobuf はバイナリ エンコーディングを使用しており、従来の XML や JSON データ形式よりもデータの送信と保存が効率的で、データ パケットのサイズを削減し、ネットワーク送信のコストを削減できます。

    クロスプラットフォーム、多言語サポート
Grpc は、C、Java、Python、Go、Node.js、Ruby などの複数のプログラミング言語をサポートしています。クロスプラットフォームで使用できます。

Protobuf は、C、Java、Python、Go、Ruby、C# などの複数のプログラミング言語もサポートしており、異なる言語が同じデータ形式を介して通信できるようにします。

    コード ジェネレーターはコードを自動的に生成します。
Grpc および Protobuf のコード ジェネレーターは、定義された Protobuf ファイルに基づいて対応するサーバー コードとクライアント コードを生成し、手動での重複コードの作成を回避します。仕事。

3. 実装手順

以下では、Grpc と Protobuf を使用して高パフォーマンス RPC サービスを実装するための具体的な手順を紹介します:

    Grpc と Protobuf をインストールする
まず、Grpc と Protobuf をインストールする必要があります。対応するインストール パッケージを公式 Web サイト (https://grpc.io/docs/langages/) からダウンロードするか、パッケージ マネージャーを通じてインストールできます。

    プロトコル バッファー ファイルの定義
プロトコル バッファー ファイルを定義するときは、メッセージ形式、サービス インターフェイス、RPC メソッドなどを指定する必要があります。たとえば、以下はサンプル ファイルです。

syntax = "proto3";

message Request {
    string message = 1;
}

message Response {
    string message = 1;
}

service GrpcService {
    rpc SayHello(Request) returns (Response) {}
}

このうち、Request と Response はメッセージ形式、GrpcService はサービス インターフェイス、SayHello は RPC メソッドです。プロトコル バッファー ファイルを定義することで、異なる言語でも同じデータ形式を使用して通信できます。

    サーバー側コードの作成
サーバー側コードでは、定義されたサービス インターフェイスを実装する必要があります。定義された Protobuf ファイルに基づいてサーバー側コードを自動的に生成し、その中に SayHello メソッドを実装できます。 PHP を例にとると、コードは次のとおりです。

require __DIR__ . '/vendor/autoload.php';

use GrpcServerGrpcGrpcServiceServer;
use GrpcServerGrpcRequest;
use GrpcServerGrpcResponse;

class GrpcService extends GrpcServiceServer
{
    public function SayHello(Request $request) : Response
    {
        $response = new Response();
        $response->setMessage("Hello " . $request->getMessage());
        return $response;
    } 
}

$server = new SwooleCoroutineHttpServer("0.0.0.0", 9090);
$server->handle("/grpc", GrpcService::class);
$server->start();

このうち、GrpcService は、生成された Grpc サーバー コード内の GrpcServiceServer クラスを継承し、SayHello メソッドを実装します。サービスの開始時に、GrpcService クラスをアドレス ポートにバインドしてサービスを開始できます。

    クライアント コードの記述
クライアント コードでは、まず Grpc クライアントを作成し、サーバーの SayHello メソッドを呼び出す必要があります。定義された Protobuf ファイルに基づいてクライアント コードを自動的に生成することもできます。 PHP クライアントのコード例は次のとおりです。

require __DIR__ . '/vendor/autoload.php';

use GrpcServerGrpcGrpcServiceClient;
use GrpcServerGrpcRequest;

$client = new GrpcServiceClient("localhost:9090", [
    'credentials' => GrpcChannelCredentials::createInsecure(),
]); 

$request = new Request();
$request->setMessage("John");

$response = $client->SayHello($request);
echo $response->getMessage();

その中で、Grpc クライアントが作成され、サーバーのアドレスとポート、および関連する証明書情報が渡されます。次に、Request オブジェクトを作成し、その message 属性を設定し、Grpc サーバー内の SayHello メソッドを呼び出して応答結果を取得して出力します。

4. 概要

この記事では、Grpc と Protobuf を使用して高パフォーマンスの RPC サービスを実装するための具体的な手順を紹介します。 Grpc と Protobuf には、ネットワーク転送とデータ ストレージにおいて大きな利点があり、RPC サービスのパフォーマンスを効果的に向上させることができます。実際の開発では、特定のアプリケーション シナリオに応じて適切な RPC フレームワークを選択できるため、分散システムの効率とパフォーマンスが向上します。

以上がPHP 開発: Grpc と Protobuf を使用した高パフォーマンス RPC サービスの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。