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仓库。