go语言proto go语言properties

gRPC服务开发和接口测试初探「Go」之前写过了Grpc服务开发和接口测试初探【Java】,中间耽搁了一些时间 , Go版本的gRPC测试开发实践才有时间学习使用 。其中也是由于自己Go语言不够熟悉导致的 。之前有段时间想暂时放弃Go语言的学习 , 导致了Go的生疏,原因是从Groovy到Java性能 。
回归正题 , Go语言版本的gRPC实践相对Java来说是比较简单的 , 但是总体的工具链是比较复杂的,可能是因为Go生态目前相比Java还是比较匮乏吧 。下面我先简述一下大致的步骤:
以上步骤亲自操作可能会遇到一些小问题,我本人搜到的教程什么的也是乱七八糟 , 踩了一些坑 。我没有整理出一个亲自实践之后的可行的教程 , 原因有二:
Go语言的gRPC的proto 编写跟Java大致一致 , 只有一个报名的参数不太一样 。下面是我的 Hello.proto 内容:
这里主要go_package 网上搜到的配置方式有些不一样,我没有全都尝试,大家在搜索的资料时候 , 尽量先看看 syntax 这个参数的值,以及文章教程写作的时间,如果距离现在太久了,我建议直接关掉 。搜索引擎有过滤功能,可以过滤掉过时的教程 。
这里Go语言gRPC的一点优势,就是在一个项目中即可实现 , Java需要先弄一个SDK这样 。Go语言的gRPC的代码可以通过生成代码命令中的参数实现指定路径 。我是放在了和proto 文件的同级目录 。
服务端代码也是比较格式化的内容,如下:
其中pb.RegisterHelloServiceServer(s, Ser{}) 如果报错 , 请检查自己安装的工具 protoc-gen-go 或者 protoc-gen-gofast 版本,一般提取报错 message 搜索也能得到解决办法 。
下面是客户端的代码,由于学艺不精,其中大部分参数的含义目前我也不是很清楚 , 特别是基于stream 的请求响应的方式使用 。后面我先把Java的学完,再回过头来看Go的,按照这个顺序学习和分享 。
服务端输出:
忘记打日志了 。没有输出
客户端输出:
Go语言的gRPC测试开发实践已经完事儿,大概率上我不会在工作中使用Go作为主力gRPC测试语言,后面测试实践内容还是会以Java为主 。
golang protobuf unknown字段透传云端在线架构有上游A-中间模块B-下游C三个模块,都是proto格式数据传输交互 。流量方向为从A-B-C,当A模块需要给proto增加某个字段,这个字段中间模块B并不关系 , 只需要透传给下游模块C来使用 。
那么A和C模块都升级proto的情况下,作为透传模块的B能不能不升级proto文件呢?答案是肯定的,这就要说到proto3的unknown字段支持了(proto2和大于proto 3.5版本的支持)
A模块和c模块的proto:
b模块的proto:
从两份proto文件可以看到,A模块和C模块相比较B模块的proto,就是header里面多了一个messageid字段 。
先将proto 生成go class文件,然后
分别依次启动C,B,A服务:
从C打印出来的数据可以看到成功拿到了mssageid,这个key在B模块的proto中是没有定义的 。
从b模块打印出来的信息可以看到:
经过A模块marshal传输过来的数据,在B模块unmarshal后,message这个不认识的字段的信息(unknown field)被编码成了pb_id:val这样的数据给暂存下来,这样的数据经过marshal后会保留,传给下游C模块经unmarshal后,会根据pb_id找到key为messageid 。至此,C模块成功的拿到了messageid 。
protobuf3基础语法 ProtoBuf (Google Protocol Buffer)是由google公司用于数据交换的序列结构化数据格式,具有跨平台、跨语言、可扩展特性,同类型有常用的XML及JSON,但具有更小的传输体积、更高的编码、解码能力 , 特别适合于数据存储、网络数据传输等对存储体积、实时性要求高的领域,目前已经发展到protoc3 版本 。

推荐阅读