gRPC 是由 Google 开发的一种高性能、通用的 RPC 框架,支持多种语言。它基于 HTTP/2 标准,使用 Protocol Buffers 作为接口描述语言。本文将带您通过一个简单的示例来介绍如何使用 gRPC。
首先我们需要安装grpc
和grpc
对应的工具,以python
和go
举例:
对于go
:使用 go get
安装 gRPC 的 Go 库和 Protocol Buffers 生成插件:
go get google.golang.org/grpc
go get google.golang.org/protobuf/cmd/protoc-gen-go
对于python
:使用 pip 安装 gRPC:
pip install grpcio
pip install grpcio-tools
接下来我们就开始写代码啦,还是以go
为例:
-
首先创建一个
.proto
文件,内容如下:syntax = "proto3"; option go_package = "grpc/proto"; service Hello { rpc Hello(HelloRequest) returns (HelloResponse); } message HelloRequest { string name = 1; } message HelloResponse { string response = 1; }
-
利用命令生成
.proto
对应的程序语言文件:生成
Go
文件:protoc (proto file path) --go_out=. --go-grpc_out=.
生成
Python
文件:python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. (proto file path)
-
编写代码,分别建立
client
和server
包,树形目录如下. ├── go.mod ├── go.sum ├── grpc │ ├── client │ │ └── client.go │ ├── proto │ │ ├── helloworld_grpc.pb.go │ │ ├── helloworld.pb.go │ │ └── helloworld.proto │ └── server │ └── server.go
client.go
文件代码:package main import ( "context" "fmt" "google.golang.org/grpc" "go-try/grpc/proto" ) func main() { conn, err := grpc.NewClient("0.0.0.0:8080", grpc.WithInsecure()) if err != nil { panic(err) } defer conn.Close() cli := proto.NewHelloClient(conn) res, err := cli.Hello(context.Background(), &proto.HelloRequest{Name: "zs"}) if err != nil { panic(err) } fmt.Println(res.Response) }
server.go
文件代码:package main import ( "context" "google.golang.org/grpc" "net" "go-try/grpc/proto" ) type HelloServer struct { proto.UnimplementedHelloServer } func (s *HelloServer) Hello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloResponse, error) { return &proto.HelloResponse{ Response: "Hello " + request.Name, }, nil } func main() { server := grpc.NewServer() proto.RegisterHelloServer(server, &HelloServer{}) listen, err := net.Listen("tcp", "0.0.0.0:8080") if err != nil { panic("faild to listen : " + err.Error()) } err = server.Serve(listen) if err != nil { panic("faild to start grpc : " + err.Error()) } }
-
分别运行
client.go
,server.go
:结果如下:
Hello zs