gRPC-Go入门教程
protobuf简介
Protocol Buffers(protobuf)
:与编程语言无关,与程序运行平台无关的数据序列化协议以及接口定义语言(IDL: interface definition language)。
要使用protobuf
需要先理解几个概念:
protobuf
编译器protoc
,用于编译.proto
文件开源地址:https://github.com/protocolbuffers/protobuf
编程语言的
protobuf
插件,搭配protoc
编译器,根据.proto
文件生成对应编程语言的代码。protobuf runtime library
:每个编程语言有各自的protobuf runtime
,用于实现各自语言的protobuf
协议。Go语言的
protobuf
插件和runtime library
有过2个版本:第1个版本开源地址:https://github.com/golang/protobuf,包含有插件
proto-gen-go
,可以生成xx.pb.go
和xx_grpc.pb.go
。Go工程里导入该版本的protobuf runtime
的方式如下:import "github.com/golang/protobuf"
第2个版本开源地址:https://github.com/protocolbuffers/protobuf-go,同样包含有插件
proto-gen-go
。不过该项目的proto-gen-go
从v1.20
版本开始,不再支持生成gRPC服务定义,也就是xx_grpc.pb.go
文件。要生成gRPC服务定义需要使用grpc-go
里的progo-gen-go-grpc
插件。Go工程里导入该版本的protobuf runtime
的方式如下:import "google.golang.org/protobuf"
推荐使用第2个版本,对protobuf的API做了优化和精简,并且把工程界限分清楚了:
第一,把
protobuf
的Go实现都放在protobuf的项目里,而不是放在golang语言项目下面。第二,把
gRPC
的生成,放在grpc-go
项目里,而不是和protobuf runtime
混在一起。
有的老项目可能使用了第1个版本的
protobuf runtime
,在老项目里开发新功能的时候也可以使用第2个版本protobuf runtime
,支持2个版本在一个Go项目里共存。但是要注意:一个项目里同时使用2个版本必须保证第一个版本的版本号不低于v1.4
。
gRPC-Go简介
gRPC-Go: gRPC的Go语言实现,基于HTTP/2的RPC框架。
开源地址:https://github.com/grpc/grpc-go
Go项目里导入该模块的方式如下:
import "google.golang.org/grpc"
grpc-go
项目里还包含有protoc-gen-go-grpc
插件,用于根据.proto
文件生成xx_grpc.pb.go
文件。
环境安装
分为3步:
安装Go
步骤参考:Download and install - The Go Programming Language
安装Protobuf编译器
protoc
: 用于编译.proto
文件步骤参考:Protocol Buffer Compiler Installation | gRPC
执行如下命令查看
protoc
的版本号,确认版本号是3+,用于支持protoc3protoc --version
安装
protoc
编译器的Go语言插件protoc-gen-go
插件:用于生成xx.pb.go
文件go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
protoc-gen-go-grpc
插件:用于生成xx_grpc.pb.go
文件go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
注意:有的教程可能只让你安装protoc-gen-go
,没有安装protoc-gen-go-grpc
,那有2种情况:
使用的是第1个版本
github.com/golang/protobuf
的protoc-gen-go
插件。使用的是第2个版本
google.golang.org/protobuf
的protoc-gen-go
插件并且protoc-gen-go
版本号低于v1.20
。从v1.20
开始,第2个版本的protoc-gen-go
插件不再支持生成gRPC服务定义。下面是官方说明:
The v1.20 protoc-gen-go does not support generating gRPC service definitions. In the future, gRPC service generation will be supported by a new
protoc-gen-go-grpc
plugin provided by the Go gRPC project.The
github.com/golang/protobuf
version ofprotoc-gen-go
continues to support gRPC and will continue to do so for the foreseeable future.
官方示例
下载代码
以grpc-go
的v1.41.0版本为例,下载代码并进入到grpc-go/examples/helloworld
目录:
git clone -b v1.41.0 https://github.com/grpc/grpc-go cd grpc-go/examples/helloworld
运行代码
启动服务端
go run greeter_server/main.go
终端会打印如下内容,表示服务端已经启动并且在监听
50051
端口2022/01/02 13:01:08 server listening at [::]:50051
启动客户端。客户端会发送
SayHello
请求给服务端go run greeter_client/main.go
终端会打印如下内容,表示收到了服务端的响应。
2022/01/02 13:01:25 Greeting: Hello world
工程开发
自己在使用protobuf
和grpc-go
开发的时候,按照如下步骤来操作:
定义
.proto
文件,包括消息体和rpc服务接口定义使用
protoc
命令来编译.proto
文件,用于生成xx.pb.go
和xx_grpc.pb.go
文件在服务端实现rpc里定义的方法
客户端调用rpc方法,获取响应结果
我们通过对上面的grpc-go/examples/helloworld
做修改,来说明上述步骤。
第一步,在
helloworld.proto
里增加一个rpc方法SayHelloAgain
,参数和返回值和SayHello
保持一样。// The greeting service definition. service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}// send another greetingrpc SayHelloAgain (HelloRequest) returns (HelloReply) {} }
第二步,在
grpc-go/examples/helloworld
目录使用protoc
命令编译.proto
文件,生成新的helloworld.pb.go
和helloword_grpc.pb.go
文件。命令如下:protoc --go_out=. --go_opt=paths=source_relative \--go-grpc_out=. --go-grpc_opt=paths=source_relative \helloworld/helloworld.proto
第三步,在服务端实现rpc里新定义的方法
SayHelloAgain
。在greeter_server/main.go
添加如下代码:func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {log.Printf("Received: %v", in.GetName())return &pb.HelloReply{Message: "Hello again " + in.GetName()}, nil }
第四步,在客户端调用新定义的rpc方法,获取响应结果。在
greeter_client/main.go
添加如下代码:r2, err2 := c.SayHelloAgain(ctx, &pb.HelloRequest{Name: name}) if err2 != nil {log.Fatalf("could not greet: %v", err2) } log.Printf("Greeting: %s", r2.GetMessage())
第五步,运行程序
先启动服务端
go run greeter_server/main.go
再启动客户端
go run greeter_client/main.go Alice
客户端会打印如下内容:
2022/01/02 13:37:58 Greeting: Hello alice 2022/01/02 13:37:58 Greeting: Hello again alice
至此,我们就对如何在Go工程里使用protobuf
和gRPC
有了一个初步的了解和入门。
进阶学习
想要进一步学习,主要是深入了解protobuf
和gRPC
在Go语言里的使用技巧和原理
protobuf
官方学习地址:https://developers.google.com/protocol-buffers/docs/proto3
https://developers.google.com/protocol-buffers/docs/gotutorial
https://developers.google.com/protocol-buffers/docs/reference/go-generated
https://developers.google.com/protocol-buffers/docs/reference/proto3-spec
gRPC
官方学习地址:Go | gRPC
开源地址
文章和示例代码开源地址在GitHub: https://github.com/jincheng9/go-tutorial
公众号:coding进阶
个人网站:Jincheng9's blog
知乎:无忌 - 知乎
References
Quick start | Go | gRPC
https://github.com/protocolbuffers/protobuf-go/releases/tag/v1.20.0#v1.20-grpc-support
Differences between protoc-gen-go and protoc-gen-go-grpc - Stack Overflow
https://github.com/golang/protobuf
https://github.com/protocolbuffers/protobuf-go
gRPC-Go入门教程相关推荐
- 史上最细gRPC(Go)入门教程(二)---gRPC初体验--hello world
来自:指月小筑 https://lixueduan.com 原文:https://lixueduan.com/post/grpc/02-hello-world/ 本文主要对 gRPC 框架做了简单的介 ...
- gRPC详细入门教程,Golang/Python/PHP多语言讲解
一.gRPC是什么? gRPC,其实就是RPC框架的一种,前面带了一个g,代表是RPC中的大哥,龙头老大的意思,另外g也有global的意思,意思是全球化比较fashion,是一个高性能.开源和通用的 ...
- EMQX 入门教程⑪——通过 ExHook 使用 gRPC 服务接收 EMQX 回调事件(已连接/已断开/已订阅/已发布...)
文章目录 一.前文 二.钩子函数介绍 三.EMQX 4.x 的hook 实现方法 四.EMQX 5.x 的hook 实现方法 五.下载 emqx-extension-examples 六.修改Demo ...
- Egg框架入门教程合集之插件/工具/教程/专栏/开源项目
Egg框架入门教程之示例合集 Awesome Egg.js 很棒的清单,精选了最好的Egg.js插件,工具,教程,文章等.欢迎公关! 内容 博客 文章 讲解 会议活动 外挂程式 应用领域 样板 构架 ...
- Kafka入门教程与详解
1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...
- 【CV】Pytorch一小时入门教程-代码详解
目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...
- python tornado教程_Tornado 简单入门教程(零)——准备工作
前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...
- python向量计算库教程_NumPy库入门教程:基础知识总结
原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...
- mysql query browswer_MySQL数据库新特性之存储过程入门教程
MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...
- python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...
最新文章
- 机房布线的最高境界……
- Node HTTP/2 Server Push 从了解到放弃
- POJ2594 最小路径覆盖
- Xcode插件,模板安装
- java 字符正则匹配算法_算法之字符串——正则表达式匹配
- python tushare获取股票数据_Python 金融: TuShare API 获取股票数据 (1)
- 基于curl的php多线程类(异步请求)
- 【已解决】Error attaching to process: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versi
- 猛然发现,已经第100篇随笔了
- Python学习16 正则表达式2 re模块
- android判断点击次数_Android应用统计-使用时长及次数统计(一)
- python后台——aiohttp入门
- EndpointAddress——不只是一个Uri[上篇]
- Windows搭建Sosoapi
- C/C++ 二维数组传参方法总结
- 极寒天气肆虐美国中西部地区
- Specular Highlights(镜面光)
- 解决百度推送not_same_site的问题
- 25-javaweb接入支付宝支付接口
- c语言法定节日日历程序,一个完整的日历程序(含有农历)