golang protobuf unknown字段透传

Python016

golang protobuf unknown字段透传,第1张

云端在线架构有上游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。

Protobuf对于Golang通过插件进行支持,因些需要安装protoc的执行环境,下面我们来一步步看下,如何搭建一个编译环境。

1. 安装protoc

2. 下载并安装protobuf-Go插件

从github上下载插件,并解压(https://github.com/golang/protobuf),得到以下的目录

[plain] view plain copy

drwxr-xr-x 6 root root 4096 Jun 16 15:45 .

drwxr-xr-x 3 root root 4096 Jun 16 15:48 ..

-rw-r--r-- 1 root root 173 Jun 15 06:31 AUTHORS

-rw-r--r-- 1 root root 170 Jun 15 06:31 CONTRIBUTORS

drwxr-xr-x 3 root root 4096 Jun 15 06:31 jsonpb

-rw-r--r-- 1 root root 1583 Jun 15 06:31 LICENSE

-rw-r--r-- 1 root root 2080 Jun 15 06:31 Makefile

-rw-r--r-- 1 root root 1955 Jun 15 06:31 Make.protobuf

drwxr-xr-x 4 root root 4096 Jun 15 06:31 proto

drwxr-xr-x 7 root root 4096 Jun 16 15:42 protoc-gen-go

drwxr-xr-x 8 root root 4096 Jun 15 06:31 ptypes

-rw-r--r-- 1 root root 7149 Jun 15 06:31 README.md

这时,执行make install,多半是不会成功的,一般会报找不到对应的文件,原因在于go源文件中指定的目录位置是这样的

type Info struct{

Age int32 `xorm:" INT(8)"`

}

字段超多可以从数据库用xorm reverse出来结构,

或者直接querystring 得到map[string]string,想怎么处理都行。

另外,没太明白你要问什么。