Как классический протокол rpc, grpc немного тяжеловат, но его стоит изучить.
Вы можете быстро начать работу с этой структурой grpc с помощью следующего содержимого.
Полный код кейса выложен на github:GitHub.com/аккуратная жизнь/нет…
Установить инструменты командной строки
PHP нужен этот дополнительный инструмент protoc, grpc_php_plugin, чтобы сгенерировать этот файл формата protobuf в класс на языке PHP.
Go необходимо установить инструмент protoc-gen-go для создания определения класса на языке go из файла определения интерфейса в формате protobuf.
Для Java не нужно вручную устанавливать дополнительные инструменты, достаточно иметь maven, что еще раз говорит о превосходстве java (
protoc
После распаковки поместите каталог 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 для компиляции одним щелчком мыши.