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.goxx_grpc.pb.go。Go工程里导入该版本的protobuf runtime的方式如下:

      import "github.com/golang/protobuf"
    • 第2个版本开源地址:https://github.com/protocolbuffers/protobuf-go,同样包含有插件proto-gen-go。不过该项目的proto-gen-gov1.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+,用于支持protoc3

      protoc --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/protobufprotoc-gen-go插件。

  • 使用的是第2个版本google.golang.org/protobufprotoc-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 of protoc-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

工程开发

自己在使用protobufgrpc-go开发的时候,按照如下步骤来操作:

  • 定义.proto文件,包括消息体和rpc服务接口定义

  • 使用protoc命令来编译.proto文件,用于生成xx.pb.goxx_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.gohelloword_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工程里使用protobufgRPC有了一个初步的了解和入门。

进阶学习

想要进一步学习,主要是深入了解protobufgRPC在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入门教程相关推荐

  1. 史上最细gRPC(Go)入门教程(二)---gRPC初体验--hello world

    来自:指月小筑 https://lixueduan.com 原文:https://lixueduan.com/post/grpc/02-hello-world/ 本文主要对 gRPC 框架做了简单的介 ...

  2. gRPC详细入门教程,Golang/Python/PHP多语言讲解

    一.gRPC是什么? gRPC,其实就是RPC框架的一种,前面带了一个g,代表是RPC中的大哥,龙头老大的意思,另外g也有global的意思,意思是全球化比较fashion,是一个高性能.开源和通用的 ...

  3. EMQX 入门教程⑪——通过 ExHook 使用 gRPC 服务接收 EMQX 回调事件(已连接/已断开/已订阅/已发布...)

    文章目录 一.前文 二.钩子函数介绍 三.EMQX 4.x 的hook 实现方法 四.EMQX 5.x 的hook 实现方法 五.下载 emqx-extension-examples 六.修改Demo ...

  4. Egg框架入门教程合集之插件/工具/教程/专栏/开源项目

    Egg框架入门教程之示例合集 Awesome Egg.js 很棒的清单,精选了最好的Egg.js插件,工具,教程,文章等.欢迎公关! 内容 博客 文章 讲解 会议活动 外挂程式 应用领域 样板 构架 ...

  5. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  6. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  7. python tornado教程_Tornado 简单入门教程(零)——准备工作

    前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...

  8. python向量计算库教程_NumPy库入门教程:基础知识总结

    原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...

  9. mysql query browswer_MySQL数据库新特性之存储过程入门教程

    MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...

  10. python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...

最新文章

  1. 机房布线的最高境界……
  2. Node HTTP/2 Server Push 从了解到放弃
  3. POJ2594 最小路径覆盖
  4. Xcode插件,模板安装
  5. java 字符正则匹配算法_算法之字符串——正则表达式匹配
  6. python tushare获取股票数据_Python 金融: TuShare API 获取股票数据 (1)
  7. 基于curl的php多线程类(异步请求)
  8. 【已解决】Error attaching to process: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versi
  9. 猛然发现,已经第100篇随笔了
  10. Python学习16 正则表达式2 re模块
  11. android判断点击次数_Android应用统计-使用时长及次数统计(一)
  12. python后台——aiohttp入门
  13. EndpointAddress——不只是一个Uri[上篇]
  14. Windows搭建Sosoapi
  15. C/C++ 二维数组传参方法总结
  16. 极寒天气肆虐美国中西部地区
  17. Specular Highlights(镜面光)
  18. 解决百度推送not_same_site的问题
  19. 25-javaweb接入支付宝支付接口
  20. c语言法定节日日历程序,一个完整的日历程序(含有农历)

热门文章

  1. Miracast概述(一)
  2. 青莲晚报(第三十期)| 物联网安全多知道
  3. win10linux子系统root权限,电脑win10系统如何将linux子系统wsl切换到root权限
  4. 浅谈架构师之逻辑架构和物理架构
  5. 使用DanmakuFlameMaster实现弹幕效果
  6. Field II 超声相控阵成像系列1——复合平面波成像(更正)
  7. Kvm 平台自定义网络的方式
  8. 图书出版流程管理用什么管理软件?
  9. 科大奥瑞物理实验——迈克尔逊干涉仪实验
  10. HuaPu在学:机器学习——sklearn【随机森林】