通過gRPC讓PHP調用Go的服務


*由於篇幅限制,本文只能提供一個簡單的使用流程,不會對具體的概念深入解釋

你至少需要了解的基本知識: PHP, Composer, Go, ProtoBuf, gRPC

#第一步:編寫 .proto 文件

在本例中,我們定義一個計算器類,擁有相加,相減兩個方法,以及定義參數和返回值的類型

syntax = "proto3"; //使用的proto3語法版本
package grpc_test; // 包名
//定義一個服務,包含兩個方法
service Calculator {
    rpc Add (RequestData) returns (ResponseData) {}
    rpc Reduce (RequestData) returns (ResponseData) {}
}
// 定義一個請求類型
message RequestData {
    int32 a = 1;
    int32 b = 2;
}
// 定義一個返回類型
message ResponseData {
    int32 c = 1;
}

#使用protoc編譯器編譯 .proto 文件

protoc -I ./proto \
    ./proto/grpc_test.proto \
    --php_out=./php_src \
    --go_out=plugins=grpc:./go_src \
    --grpc_out=./php_src \
    --plugin=protoc-gen-grpc=/opt/share/grpc_php_plug

說明:
1 指定.proto文件目錄
2 指定.proto文件位置
3 根據proto文件定義生成對應php代碼
4 根據proto文件定義生成對應的go代碼
5 輸出grpc的php調用客戶端代碼
6 grpc_php_plugin插件位置(這個需要下載源代碼編譯得出)

該命令執行后,會在go_src下生成相關的go代碼,php_src下生成對應的php代碼

#利用生成的go代碼編寫gRPC服務

package main

import (
    "context"
    "fmt"
    "google.golang.org/grpc"
    pb "grpc_test/go_src" //引入了生成的go代碼
    "log"
    "net"
)

func main() {
    lis, err := net.Listen("tcp", "192.168.0.220:8888")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterCalculatorServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

type server struct {
    pb.UnimplementedCalculatorServer
}

func (s *server) Add(ctx context.Context, in *pb.RequestData) (*pb.ResponseData, error) {
    fmt.Println("add:")
    return &pb.ResponseData{
        C: in.A + in.B,
    }, nil
}
func (s *server) Reduce(ctx context.Context, in *pb.RequestData) (*pb.ResponseData, error) {
    fmt.Println("reduce:")
    return &pb.ResponseData{
        C: in.A - in.B,
    }, nil
}

#編譯並運行代碼,服務就開始監聽了

#准備PHP環境
這一部分稍微就麻煩點,需要安裝兩個擴展grpc,protobuf 可以通過pecl安裝:

pecl install grpc
pecl install protobuf
安裝后在對應的php.ini文件中添加
extension=grpc.so
extension=protobuf.so

將ptotoc編譯生成的php代碼添加到composer.json中
"psr-4": {
"GPBMetadata\\":"app/grpc/GPBMetadata/",
"Grpc_test\\":"app/grpc/Grpc_test/"
},

#編寫PHP客戶端調用代碼

namespace App\grpc;

use Grpc\ChannelCredentials;
use Grpc_test\CalculatorClient;
use Grpc_test\RequestData;

class Grpctest
{
    public function add() {
        $ins = new CalculatorClient("192.168.0.220:8888",[
            'credentials' => ChannelCredentials::createInsecure()
        ]);
        $req = new RequestData();
        $req->setA(40);
        $req->setB(20);
        list($res, $status) = $ins->Reduce($req)->wait();
        dd($res->getC());
    }
}

如果一切順利,這里應該打印出最終結果 20

#最后梳理一下整個流程

1.首先編寫proto文件
2.生成對應的服務端和客戶端輔助代碼
3.借助輔助代碼編寫服務端和客戶端


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM