go gprc 使用 教程

技术栈

grpc
go
protobuff
go语言中文文档:www.topgoer.com
1.环境1.1. 安装protoc

项目地址 https://github.com/protocolbuffers/protobuf

下载protobuff, 有条件的github上直接下载,github下载地址,或者可以从maven仓库下载

在maven仓库中找到对应的版本,进行下载,linux ,windows 都有

1589089027209.png

这里我下载 windows 64 位的这个

下载下来的是可执行文件,直接放到环境变量里面,这个文件名太长了,把后缀都去掉

我放的路径 %GOPATH%\bin\protoc.exe

1.2. 安装 protoc-gen-go

直接go get -u github.com/golang/protobuf/protoc-gen-go

go get 的比较慢的话可以用代理。需要配置下代理。

看下 %GOPATH%\bin\ 有没有protoc-gen-go.exe ,没有的话需要找到下载的包进行安装。

下载目录在:%GOPATH%\pkg\mod\github.com\golang\protobuf@xxx\protoc-gen-go

进入目录然后 go install ,然后再去看bin 目录就会生成protoc-gen-go.exe

1589090845985.png

2. 建项目实践1. 建目录 gr***rj

go mod init gr***rj

这个是我创建后的目录

2. 编写proto文件

消息体可以嵌套,也可以引入其他的proto文件

字段类型对比

.proto TypeGo Type说明doublefloat64floatfloat32int32int32使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代uint32uint32使用变长编码uint64uint64使用变长编码sint32int32使用变长编码,这些编码在负值时比int32高效的多sint64int64使用变长编码,有符号的整型值。编码时比通常的int64高效。fixed32uint32总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效。fixed64uint64总是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效。sfixed32int32总是4个字节sfixed64int64总是8个字节boolbool默认 falsestringstring一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本,默认值为空。bytes[]byte默认是空数组

3. 编译proto文件

proto 文件编写完毕以后,使用protoc 进行编译,编译成成 xxx.pb.go,编译是干什么呢?

protoc --go_out=plugins=grpc:. proto/hello/hello.proto

运行命令后会在 proto 文件同目录生成 xxx.pb.go,对应的service 会成生成一个空的实现(指的是只做了实现,并没有具体业务功能),这里需要注意的是,默认go环境变量已经配置正确,gopath\bin 在环境变量里面。

hello.proto(最简的)

编译后的文件

4. 实现服务端接口逻辑

服务端可以实现,也可以不实现,也可以改下上面的默认生成的这个实现类,这里重新实现了下,里面写自己的业务逻辑。

server/handler/hello.go(最简实现)

5. 服务端代码

6. 客户端代码

protoc 生成的go 代码里面包括服务端的定义,和客户端的定义(协议的打包,解包都包括了)

gr***rj/client/hello.go