那么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,想怎么处理都行。
另外,没太明白你要问什么。