GRPC安装和生成代码
注:
GRPC是谷歌开源的一个可以跨语言的RPC框架- 它有一个很重要的依赖文件:
protocol buffers(proto3),它类似于HTTP传输中的url+json- Documentation | gRPC
- Language Guide (proto 3) | Protocol Buffers Documentation (protobuf.dev)
Goland安装protobuf插件- 新建三个
Package:client、server、pb pb包下新建hello_grpc.proto文件
|
|
- 安装grpc和proto的解释器(编译工具),在当前
pb的上两级目录执行命令:
|
|
这俩安装完后,会自动生成两个可执行文件protoc-gen-go.exe和protoc-gen-go-grpc.exe,并放到$GOPATH的bin目录下
- 在当前
pb的上一级目录执行下面命令,拉取grpc代码包
|
|
- 在
pb目录下创建build.bat文件:
|
|
- 添加
bin目录的绝对路径到环境变量Path中 - 进入
pb目录,打开powershell(在Goland的终端中可能会报错,在文件夹下右键打开终端),执行下面命令编译proto,在当前目录下生成hello_grpc.pb.go和hello_grpc_grpc.pb.go文件:
|
|
- 自此即通过
proto自动生成grpc的方法
编写客户端和服务端
server.go:
|
|
client.go:
|
|
客户端运行结果:

服务端运行结果:

protobuf的基础使用方法
- 保证有
go.mod文件,若没有的话,使用go mod init生成 - 在
src下新建pb文件夹,这里我由于上面建过pb,所以我新建pb_1文件夹(下文统一用pb指代) - 在
pb文件夹下给protobuf做好分包:在pb下新建person文件夹,在person文件夹下新建person.proto文件
|
|
- 在
pb目录下创建build.bat文件:
|
|
- 添加
bin目录的绝对路径到环境变量Path中(上面做过的就不用再添加了) - 进入
pb目录,打开powershell(在Goland的终端中可能会报错,在文件夹下右键打开终端),执行下面命令编译proto,在当前目录下生成person.pb.go文件:
|
|
- 自此即通过
proto自动生成grpc的方法 - 可以看到在
person.pb.go文件中生成了对应的结构体
|
|

交叉引用
- 在
pb新建home文件夹,在home文件夹下新建home.proto文件
|
|
- 在
person.proto中引入home.proto
|
|
- 在
build.bat中加入命令:
|
|
- 可以看到
person.pb.go中出现了IHome
|
|
定义服务
- 在
person.proto文件中添加:
|
|
- 在
pb_1目录下,执行下面命令生成grpc方法:
|
|
- 注意
person_grpc.pb.go的SearchServiceClient和SearchServiceServer接口中的四个方法:
|
|
GRPC server的四种传输模式
紧接上面的定义服务继续学习
普通服务

- 普通服务就是之前做的那种,客户端调用一次服务端就马上返回一个值
- 参数是一个入参,一个回参就可以了
代码示例
- 删除上面学习中的
pb_1中的home目录,修改person_grpc.pb.go
|
|
- 修改
build.bat:
|
|
- 在
pb_1目录下执行.\build.bat - 编写服务端代码
server.go
|
|
- 编写客户端代码
client.go
|
|
- 启动服务端,客户端发起请求,得到响应:
name:"我收到了I'm wyatt的信息"
流式传入(客户端流)

- 客户端往服务器发消息时是一个流,服务器会一直接收,最后返回接收成功与否
- 参数是一个流入,一个出参
代码示例
server.go:
|
|
client.go:
|
|
启动服务端,客户端发起请求:服务端每隔1s接收到一次客户端发来的信息我是客户端发来的信息,10s后接收到nil,服务端向客户端返回响应信息完成了
流式返回(服务端流)

- 客户端告知服务端要取一个流,服务端返回一个流
- 参数是一个入参,一个流出
server.go:
|
|
client.go:
|
|
启动服务端,客户端发起请求:客户端每隔1s接收到一次客户端的响应信息我是客户端发来的信息,10s后接收到nil,服务端向客户端返回响应信息完成了
流式出入(双向流)


- 双向流有两种形式:
- 一种是客户端不断的给服务端传,服务端也不断的给客户端回;
- 另一种是把channel接入,是即刻的,类似聊天室,客户端发一句,服务端回一句
代码示例
server.go:
|
|
client.go:
|
|
启动服务端,客户端发起请求:客户端每隔1s发送一次信息Name: "wyatt",服务端接收到后返回该信息给客户端,客户端打印,10s后,服务端发送结束信息给客户端,客户端接收到后打印,双向流结束
GRPCGateway的简单应用
- GRPCGateway:给grpc生成的文件附加一个http1.1的restful供外界访问
- gRPC-Gateway Documentation Website
使用步骤:
- prerequisites:由于之前装过
protoc-gen-go-grpc和protoc-gen-go,所以只需要装protoc-gen-go-grpc就行:
|
|
-
Adding gRPC-Gateway annotations to an existing proto file:,先在
src下新建pb_2目录,然后安装例程中import后的路径创建"google/api/annotations.proto"和google/api/http.proto,最后添加依赖包,将https://github.com/googleapis/googleapis/blob/master/google/api/annotations.proto和https://github.com/googleapis/googleapis/blob/master/google/api/http.proto中代码复制到自己创建的对应文件中: -
在
pb_2目录下新建.\build.bat文件,添加gateway的生成语句:
|
|
/pb_2/person/person.proto:
|
|
server.go:
|
|
- 在
pb_2目录下执行.\build.bat后,可以看到在person目录下生成person.pb.gw.go - API访问结果:

