这篇文章主要讲解了“Go中的gRPC怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go中的gRPC怎么用”吧!grpcgolang-grpc 包提供了 gRPC 相关的代码库,通过这个库我们可以创建 gRPC 服务或客户端,首先需要安装他。协议插件要玩 gRPC,自然离不开 proto 文件,需要安装两个包,用于支持 protobuf 文件的处理。注:GOPATH/bin
下有个protoc-gen-go.exe
文件,然而这个只是 protoc 的插件,他本身不是 protoc 工具。。。Protocol BuffersProtocol Buffers 是一个与编程语言无关、与平台无关的可拓展机制,用于序列化结构数据,是一种数据交换格式,gRPC 使用 protoc 作为协议处理工具。学习 Go 的 gRPC 时,有个坑,很多文章里面都没有说到要安装这个,执行命令提示不存在 protoc 命令。解压后,复制里面的binprotoc.exe
文件,复制到GOPATHbin
命令,跟protoc-gen-go.exe
放一起。测试以上都妥当后,我们在一个新的目录,创建一个 test.proto 文件,其内容示例如下如下:注:protoc-3.15.6-win64includegoogleprotobuf
目录也有很多示例。然后在 proto 所在目录,执行命令将 proto 转换为相应的编程语言文件。会发现在当前目录输出了test.pb.go
文件。创建一个免费云主机域名 go 程序,把 test.pb.go 复制放到在 main.go 目录,在 main.go 引入 grpc:在test.pb.go
中,生成了两个个Tester
的接口,我们来看一下这两个接口的定义:要实现 proto 中的服务,则需要我们实现TesterServer
接口,要编写 客户端,则需要实现TesterClient
。这里我们先实现 Server。接着我们创建 gRPC 服务。创建一个新的 go 项目,把 test.pb.go 复制放到 main.go 同级目录,main.go 的代码:由于创建的时候,test.pb.go 使用的包名是 main,所以在编译时,需要把多个 go 文件一起编译:然后分别启动 server 和 client,在 client 每按下一次回车键,便发送一次 gRPC 消息。到这里,我们学习了一个完整的 gRPC 从创建协议到创建服务和客户端的过程,下面将接着学习一些相关的知识,了解一些细节。proto.Marshal
可以对请求的参数进行序列化,如:而proto.Unmarshal
则可以反序列化。我们还可以自定义如何序列化反序列化消息,代码示例:Protobuf buffer 是一种数据格式,而 Protobuf 是 gRPC 协议,这里需要区分一下。protobuf buffer 是 Google 用于序列化结构话数据的开源机制,要定义一个 protobuf buffer,需要使用 message 定义。开源看到,每个字段都有一个 数字,= 1
这个不是赋值,而是编号。一个 message 中,每个字段都有唯一的编号,这些数字用于标识二进制格式的字段(数据传输时会被压缩等),当编号范围是 1-15 时,存储编号需要一个字节,也就是说 message 中的字段尽量不超过 15 个,1-15 编号用来定义频繁出现的消息元素。当然,也可以使用16-2047
之间的数字作为编号,此时存储编号需要两个字节。详细的说可以参考官方文档:https://developers.google.com/protocol-buffers/docs/overview字段类型就不详细列表了,读者可以参考官方文档,这里列一下常用的数据类型:double、float、int32、int64、bool、string、bytes、枚举。由于 gRPC 需要考虑兼容 C 语言、C#、Java、Go 语言等,所以 gRPC 中的类型不等同于编程语言中的相关类型。这些类型都是 gRPC 中定义的,并且如果要转换为编程语言中的类型,需要一些转换机制,而这有时会十分麻烦。每个字段都可以指定一个规则,在定义字段类型的开头使用规则标识。有以下三种规则:required
:格式正确的消息必须恰好具有此字段之一,即必填字段。optional
:格式正确的消息可以包含零个或一个此字段(但不能超过一个,即值是可选的。repeated
:在格式正确的消息中,此字段可以重复任意次(包括零次),重复值的顺序将保留,表示该字段可以包含0~N个元素。由于历史原因,repeated
标量数字类型的字段编码效率不高。新代码应使用特殊选项[packed=true]
来获得更有效的编码。例如:在可选字段中 optional 中,我们可以为其设置一个默认值,当传递消息时如果没有填写此字段,则使用其默认值:接下来将介绍 gRPC 的协议格式(protobuf),下面是官方文档的一个示例:syntax 指明协议的版本;package 指明该 .proto 的名称;import 关键字可以在当前 .proto 中引入其它 .proto 文件,gRPC 基本数据类型中不包含时间格式,可以引入timestamp.proto
。不同编程语言引入包/库的方式是不同的,C++ 和 C# 都是使用命名空间区分代码位置;Java 以目录、公共类严格区别包名;go 则是以一个 .go 文件任意设置 package 名称。前面提到了 protoc,可以将协议文件转为为具体的代码。为了兼容各种编程语言,我们协议设置_package
,这样可以支持生成不同语言代码时设置包/库名称。例如 :protobuf 中除了可以定义 message,也可以定义流式接口。gRPC使您可以定义四种服务方法:一元 RPC,客户端向服务器发送单个请求并获得单个响应,就像普通的函数调用一样。前面我们提到的都是一元 gRPC。服务器流式RPC,客户端在其中向服务器发送请求,并获取流以读取回一系列消息。客户端从返回的流中读取,直到没有更多消息为止。gRPC保证在单个RPC调用中对消息进行排序。客户端 -> 服务端 -> 返回流 -> 客户端 -> 接收流客户端流式RPC,客户端在其中编写消息序列,然后再次使用提供的流将其发送到服务器。客户端写完消息后,它将等待服务器读取消息并返回其响应。gRPC再次保证了在单个RPC调用中的消息顺序。客户端 -> 发送流 -> 服务端 -> 接收流 ->双向流式RPC,双方都使用读写流发送一系列消息。这两个流独立运行,因此客户端和服务器可以按照自己喜欢的顺序进行读写:例如,服务器可以在写响应之前等待接收所有客户端消息,或者可以先读取消息再写入消息,或读写的其他组合。每个流中的消息顺序都会保留。前面我们用 protoc 来编译 .proto 文件为 go 语言,为了支持编译为 go,需要安装protoc-gen-go
插件,C# 可以安装protoc-gen-zsharp
插件。需要注意的是,转换 .proto 为编程语言,不一定要安装 protoc。例如 C# 只需要把 .proto 文件放到项目中,通过包管理器安装一个库,就会自动转换为相应的代码。回归正题,聊一下 protoc 编译 .proto 文件的命令。protoc 常用的参数如下:最简单的编译命令:--{xxx}_out
指令是必须的,因为要输出具体的编程语言代码。这个输出文件的路径是执行命令的路径,如果我们不在 .proto 文件目录下执行命令,则输出的代码便不是相同位置了。为了解决这个问题,我们可以使用:这样在别的地方执行命令,生成的代码会跟 .proto 文件放在相同的位置。感谢各位的阅读,以上就是“Go中的gRPC怎么用”的内容了,经过本文的学习后,相信大家对Go中的gRPC怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!
本文小编为大家详细介绍“Mybatis无主键的关联数据去重问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis无主键的关联数据去重问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。使用Mybatis的a…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。