Используйте grpc для достижения трехсторонней интермодуляции php, java, go

gRPC

Как классический протокол rpc, grpc немного тяжеловат, но его стоит изучить.

Вы можете быстро начать работу с этой структурой grpc с помощью следующего содержимого.

Полный код кейса выложен на github:GitHub.com/аккуратная жизнь/нет…

Установить инструменты командной строки

PHP нужен этот дополнительный инструмент protoc, grpc_php_plugin, чтобы сгенерировать этот файл формата protobuf в класс на языке PHP.

Go необходимо установить инструмент protoc-gen-go для создания определения класса на языке go из файла определения интерфейса в формате protobuf.

Для Java не нужно вручную устанавливать дополнительные инструменты, достаточно иметь maven, что еще раз говорит о превосходстве java (

protoc

Раздел GitHub.com/protocol…

После распаковки поместите каталог bin в PATH

Скомпилируйте grpc_php_plugin

ссылка на сборку

git clone https://github.com/grpc/grpc.git
cd grpc
brew install autoconf automake libtool shtool
LIBTOOL=glibtool LIBTOOLIZE=glibtoolize make -j8

Библиотека исходного кода grpc большая и может быть скомпилирована напрямую с 8 ядрами. Скомпилированный grpc_php_plugin находится в каталоге bins/opt/, а grpc_php_plugin помещается в PATH.

Установите расширение grpc для php

Расширенный адрес:Полиэтиленовый материал.PHP.net/package/GRP…

Скомпилировать protoc-gen-go

адрес проекта:GitHub.com/golang/pro Т…

git clone https://github.com/golang/protobuf.git
cd protobuf/protoc-gen-go
go build

Эффект операции следующий

Поместите этот сгенерированный protoc-gen-go в PATH

дизайн корпуса

go: предоставить сервер grpc, предоставить интерфейс sayHello, параметр представляет собой строку, представляющую имя, а возвращаемое значение — «Hello», соединенное с именем java и php в качестве клиента, вызывающего этот клиент go

зависимость grpc

go

"golang.org/x/net/context"                                                                                                                                                                      
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"

java

<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-netty</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-protobuf</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-stub</artifactId>
    <version>1.0.0</version>
</dependency>

php

"grpc/grpc": "^v1.9",                                                                                                                                                                       
"google/protobuf": "^v3.5"

основной код

прото-файл

syntax = "proto3";

option go_package = "pbf";

package helloworld;

// The greeting service definition.
service Hello {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloResponse {
  string message = 1;
}

Этот файл protobuf определяет две структуры данных, HelloRequest и HelloResponse, а также интерфейс SayHello.

Используйте следующие команды, чтобы скомпилировать этот прото-файл в соответствующие структуры данных php и go.

#!/bin/bash

for file in ./protos/*.proto; do
    echo "生成对应的php类文件: $file"
    protoc -I ./protos --php_out=./php/pbf --grpc_out=./php/pbf --plugin=protoc-gen-grpc=$(which grpc_php_plugin) $file
done

protoc -I ./protos --go_out=plugins=grpc:./go/pbf ./protos/*.proto

код ядра сервера go

// helloServer implements helloworld.HelloServer
type helloServer struct{}

// SayHello implements helloworld.HelloServer
func (s *helloServer) SayHello(ctx context.Context, in *pbf.HelloRequest) (*pbf.HelloResponse, error) {
	return &pbf.HelloResponse{Message: "Hello " + in.Name}, nil
}

func main() {
	s := grpc.NewServer()
	pbf.RegisterHelloServer(s, &helloServer{})

	reflection.Register(s)
   s.Serve(lis)
}

func (s *helloServer) SayHello(ctx context.Context, in *pbf.HelloRequest) (*pbf.HelloResponse, error)Внутри находится конкретная реализация интерфейса SayHello.

код ядра клиента php

$name = '小明';

$client = new Helloworld\HelloClient('localhost:8488', [
    'credentials' => Grpc\ChannelCredentials::createInsecure(),
]);
$request = new Helloworld\HelloRequest();
$request->setName($name);
list($response, $status) = $client->SayHello($request)->wait();

echo '服务端返回状态码: ' . $status->code . PHP_EOL;
echo "服务器端回复内容:" . $response->getMessage() . PHP_EOL;

код 0 означает нормальный

основной код клиента Java

private final HelloGrpc.HelloBlockingStub blockingStub;

public HelloClient(String host, int port) {
    //初始化连接
    channel = ManagedChannelBuilder.forAddress(host, port)
            .usePlaintext(true)
            .build();
    //初始化远程服务Stub
    blockingStub = HelloGrpc.newBlockingStub(channel);
}

public String sayHello(String name) {
    //构造服务调用参数对象
    Helloworld.HelloRequest request = Helloworld.HelloRequest.newBuilder().setName(name).build();
    //调用远程服务方法
    Helloworld.HelloResponse response = blockingStub.sayHello(request);
    //返回值
    return response.getMessage();
}

sayHello()Вот метод вызова sayHello через grpc.

Посмотреть эффект

Как видите, с этими тремя программами все в порядке.

некоторые замечания

Компиляция go, java и php была написана в Makefile, и вы можете использовать make для компиляции одним щелчком мыши.

Ссылка на ссылку

  1. GitHub.com/golang/pro Т…
  2. blog.CSDN.net/сильный молодой…