PHP 连接使用gRPC服务过程

gPRC在当下已经很流行了,特别是用Go写gPRC服务确实十分便捷。PHP也有需要作为客户端连接使用gRPC。为此,记录一下PHP适配gRPC服务的过程。

一、编译生成grpc_php_plugin

主要目的是用于生成PHP客户端代码。如果没有grpc_php_plugin,使用下面语句也能生成核心PHP代码。

protoc   --php_out=.   test.proto

但缺乏Client类实现,需要自己编写Client类。为方便,还是引入grpc_php_plugin吧。

git clone --recurse-submodules -b v1.50.0 --depth 1 --shallow-submodules 
https://github.com/grpc/grpc
 
cd grpc
mkdir -p cmake/build
pushd cmake/build
cmake ../..
make protoc grpc_php_plugin
sudo cp grpc_php_plugin /usr/bin/
popd

上述指令先将grpc源代码及必要的子模块源码克隆到本地,然后编译生成grpc_php_plugin可执行程序。为方便使用,将生成的grpc_php_plugin拷贝到了 /usr/bin

二、生成PHP代码

现在可以根据proto文件生成PHP代码了。

protoc   --php_out=.  --grpc_out=.  --plugin=protoc-gen-grpc=/usr/bin/grpc_php_plugin test.proto

运行上面的命令,就会生成两个子目录,一个为 GPBMetadata,这个目录名字是固定的,里面只有一个文件;另一个目录名字是proto里定义的package名(只不过把第一个字母变成大写了),这个目录里的文件有我们需要的TestClient.php。将这两个目录连同里面的文件拷贝到项目位置。

三、安装grpc for PHP

先安装PECL和Composer,如果都已经有了,这步就可以省略了

sudo apt-get install autoconf zlib1g-dev php-dev php-pear
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

再安装 gRPC 扩展程序

sudo pecl install grpc
sudo pecl install protobuf

然后在 php.ini 中增加下面两行,启用 gRPC 扩展程序

extension=grpc.so
extension=protobuf.so

四、配置项目

使用 composer 初始化项目,如果是已经存在的项目,就可以省略这个步骤。

composer init

安装 grpc/protobuf 的客户端库文件。

composer require grpc/grpc
composer require google/protobuf

然后编辑composer自动生成的composer.json,在”autoload” “psr-4” 下,增加两行,把刚才自动生成的两个目录加进去,

"autoload": {
        "psr-4": {
            ...  ....
            "GPBMetadata\\": "./GPBMetadata/",
            "Test\\":"./Test/"
            ...   ...
        }
},

然后重新加载一下配置

composer dump-autoload

五、编写程序

现在,就可以开始编写程序,使用TestClient.php 直接访问使用gRPC服务了。

对于普通的grpc服务,网上有很多例子,调用是简单的,只需使用ChannelCredentials的createInsecure函数

// 创建客户端实例
$testClient = new testClient('192.168.1.100:50051', [
    'credentials' => Grpc\ChannelCredentials::createInsecure()
]);

对于使用单向TLS安全认证的gRPC服务,就需要使用createSsl函数(传入服务器的证书),并且还需要将参数grpc.ssl_target_name_override的值设置为 创建这个服务器证书时所使用的Common Name

// 创建客户端实例
$testClient = new testClient('192.168.1.100:50051', [
   'grpc.ssl_target_name_override' => 'test.com',
    'credentials' => Grpc\ChannelCredentials::createSsl(file_get_contents('../ssl/server.pem'))
]);

对于使用双向TLS安全认证的gRPC服务,调用createSsl 函数方式如下

// 创建客户端实例
$testClient = new testClient('192.168.1.100:50051', [
   'grpc.ssl_target_name_override' => 'test.com',
    'credentials' => Grpc\ChannelCredentials::createSsl(file_get_contents('../ssl/ca.pem'),file_get_contents('../ssl/client.key'),file_get_contents('../ssl/client.pem'))
]);

createSsl函数的的第一个参数为根证书,第二个参数为客户端私钥,第三个参数为客户端公钥证书。

发表评论