IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> gRPC-Go入门教程 -> 正文阅读

[网络协议]gRPC-Go入门教程

protobuf简介

Protocol Buffers(protobuf):与编程语言无关,与程序运行平台无关的数据序列化协议以及接口定义语言(IDL: interface definition language)。

要使用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

  • 安装Protobuf编译器protoc: 用于编译.proto 文件

  • 安装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 greeting
     ?rpc SayHello (HelloRequest) returns (HelloReply) {}
     ?// send another greeting
     ?rpc 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语言里的使用技巧和原理

开源地址

文章和示例代码开源地址在GitHub: https://github.com/jincheng9/go-tutorial

公众号:coding进阶

个人网站:Jincheng9's blog

知乎:无忌 - 知乎

References

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:27:45  更:2022-01-03 16:28:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/5 9:30:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码