重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
对Go的支持我们可以从 Porto官网 着手。
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了新蔡免费建站欢迎大家使用!
跟Swift中的定义有2点不同:
运行后,在工程目录的logger文件夹下生成了LogInfo.pb.go文件。
我们上一节,实现了保存上传的文件,现在需要修改一下main.go
启动服务器
结果显示如下:
使用Postman测试一下,输入结果如下:
确认为:输出的结果与输入的结构相匹配。
由于Swifti没有类似于Javascript的FormData数据,所以在按传统方式上传文件时有尴尬,需要手动拼接数据。调用该方法即可上传数据。
到现在,我们完成了在客户端使用ProtoBuf,上传到服务端,服务端保存并解析的整过流程。从应用中可以看出,ProtoBuf的使用实际上还是基于一种约定,与CSV格式相差不大,缺点也一样明显:修饰以适应数据结构变化的成本比较大。
对于以类CSV格式保存的日志,常用一种折衷的方法,将数据结构保存在文件头,就像我们用CSV格式导出数据表一样,我们可以导出表列名。应用于单文件保存多条日志数据时,这是一种较好的方法。
好,就到这里。我是姜友华,下一次,再见。
云端在线架构有上游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上下载插件,并解压(),得到以下的目录
[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源文件中指定的目录位置是这样的