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访问结果: