Think Deep,Work Lean

玩转GRPC

Posted on By zack

gPRC 介绍

(1) 特性

  • gRPC 是 google 开源的一种基于 http2 的协议;
  • 通过统一的规范定义好 proto 文件后,通过命令生成不同语言的 API;
  • 传输效率高。

服务端

gRPC server 运行起来后,客户端需要带上 proto 文件来访问 server。

客户端也可以不用带 proto 文件来访问,此时需要使用 Server Reflection

--- a/examples/helloworld/greeter_server/main.go
+++ b/examples/helloworld/greeter_server/main.go
@@ -40,6 +40,7 @@ import (
        "google.golang.org/grpc"
        pb "google.golang.org/grpc/examples/helloworld/helloworld"
+       "google.golang.org/grpc/reflection"
 )

 const (
@@ -61,6 +62,8 @@ func main() {
        }
        s := grpc.NewServer()
        pb.RegisterGreeterService(s, &pb.GreeterService{SayHello: sayHello})
+       // Register reflection service on gRPC server.
+       reflection.Register(s)
        if err := s.Serve(lis); err != nil {
                log.Fatalf("failed to serve: %v", err)
        }

客户端(命令行工具)

对于 http restful 接口的应用,可以直接通过浏览器来访问。即客户端是浏览器,命令行可以用 curl。

同理对于 grpc proto_buffer 的应用,可以使用 grpc_cli 命令行。

grpc_cli

该命令行是官方推荐的工具

(1) 安装

git clone https://github.com/grpc/grpc
git submodule update --init
mkdir -p cmake/build
cd cmake/build
cmake -DgRPC_BUILD_TESTS=ON ../..
make grpc_cli

(2) 命令

./grpc_cli --help
No command specified
  grpc_cli ls ...         ; List services
  grpc_cli call ...       ; Call method
  grpc_cli type ...       ; Print type
  grpc_cli parse ...      ; Parse message
  grpc_cli totext ...     ; Convert binary message to text
  grpc_cli tojson ...     ; Convert binary message to json
  grpc_cli tobinary ...   ; Convert text message to binary
  grpc_cli help ...       ; Print this message, or per-command usage

grpcurl

grpcurl 是 go 语言编写的一个命令行工具,安装简单

brew install grpcurl

或是直接下载release文件

grpcc

grpcc是 js 语言编写的一个命令行工具

npm install -g grpcc

部署 gRPC 服务

部署使用 server reflection 的 grpc server

git clone https://github.com/grpc/grpc-go.git
cd grpc-go
cd examples/features/reflection/server
go run main.go

如果包无法下载,可以替换 google.golang.org/grpc 为 github 的地址 go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest

查看 service

~ grpc_cli ls localhost:50051
grpc.examples.echo.Echo
grpc.reflection.v1alpha.ServerReflection
helloworld.Greeter
➜  ~ grpc_cli ls localhost:50051 helloworld.Greeter -l
filename: examples/helloworld/helloworld/helloworld.proto
package: helloworld;
service Greeter {
  rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {}
}

查看方法 method

➜  ~ grpc_cli ls localhost:50051 helloworld.Greeter.SayHello -l
  rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {}

查看message的类型

➜  ~ grpc_cli type localhost:50051 helloworld.HelloRequest
message HelloRequest {
  string name = 1 [json_name = "name"];
}

调用一个远程方法

➜  ~ grpc_cli call localhost:50051 SayHello "name: 'gRPC CLI'"
connecting to localhost:50051
message: "Hello gRPC CLI"
Rpc succeeded with OK status

如果没有使用reflection server,需要指定proto文件 –proto_path

客户端详细使用方法,可以参考官网

总结

gRPC 官网定义了协议的标准,每个语言都可以去实现它,因此有了各个语言的仓库,如grpc-go仓库;如果要从web直接访问服务,因此有了grpc-web仓库