前后端数据交互利器--Protobuf
Protobuf 介绍
Protocol Buffers(又名 protobuf)是 Google 的语言中立、平台中立、可扩展的结构化数据序列化机制。
https://github.com/protocolbuffers/protobuf
简而言之,Protobuf 是 Google 开源的一款用于处理前后端数据交互格式的工具。通常来讲前后端使用的编程语言是不同的,使用 Protobuf无需多虑,前后端只管约定通信协议,之后就可以使用 pb 工具生成代码。
ProtoBuf 使用实战
下载Protobuf
直接上Github 下载最新发行版,注意选择自己电脑的平台。
笔者使用的环境是 Ubuntu 20.10,也就是linux,下面是下载链接
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protoc-3.17.3-linux-x86_64.zip
安装Protobuf
首先执行上条命令下载Protobuf,新建一个文件夹作为解压目录
mkdir protoc
unzip protoc-3.17.3-linux-x86_64.zip -d ./protoc
配置环境变量
这里的路径需要根据自身情况进行修改
vim ~/.bashrc
export PATH="$PATH:/[替换成protoc所处的路径]/protoc/bin"
source ~./bashrc
使用Protobuf
这里使用Golang 进行演示
- 使用golang还需要额外安装一些插件,这里贴出插件链接,也可以直接使用下面命令进行下载
插件链接: https://github.com/grpc-ecosystem/grpc-gateway
一键式安装:go get\
github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway \
github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 \
google.golang.org/protobuf/cmd/protoc-gen-go \
google.golang.org/grpc/cmd/protoc-gen-go-grpc
这时候检查你的go/bin 目录下就会多出以上几个程序
如果不知道自己go/bin 路径,可以通过 go env 查看
$ go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN="/xxx/go/bin"
定义消息的格式
- syntax 指定proto 版本
- package 指定包名
- proto 生成的路径
- 其余可以查看下面代码进行参考
创建 proto 文件hello.proto 文件内容如下:
syntax = "proto3";
package hello;
option go_package = "hello/proto/gen/go;hello";
message ProtoInfo {
string version = 1;
}
enum ProtoEnum {
HELLO_ONE = 0;
HELLO_TWO = 1;
}
message Hello {
string first = 1;
string second = 2;
int64 number_int64 = 3;
ProtoInfo proto_info = 4;//复合类型
repeated int32 array_int32 = 5;//数组
ProtoEnum proto_enum = 6;
}
生成pb 文件
protoc -I=. --go_out=paths=source_relative:gen/go hello.proto
- -I 指定当前路径,--go_out 指定pb 文件的生成路径,具体可以参考:https://developers.google.com/protocol-buffers/docs/reference/go-generated
protobuf demo
执行生成命令后会生成pb 文件,接下来看一下在项目中如何使用吧
package main
import (
"encoding/json"
"fmt"
hello "hello/proto/gen/go"
"google.golang.org/protobuf/proto"
)
func main() {
helloProto := hello.Hello{
First: "first",
Second: "second",
NumberInt64: 111,
ProtoInfo: &hello.ProtoInfo{
Version: "3",
},
ArrayInt32: []int32{1, 2, 3, 4, 5, 6},
ProtoEnum: hello.ProtoEnum_HELLO_TWO,
}
fmt.Printf("hello:%+v\n", &helloProto)
//转成二进制流
b, err := proto.Marshal(&helloProto)
if err != nil {
panic(err)
}
fmt.Printf("%X\n", b)
//从二进制流转成结构体
var hello2 hello.Hello
err = proto.Unmarshal(b, &hello2)
if err != nil {
panic(err)
}
fmt.Printf("hello2:%+v\n", &hello2)
//转成json
jsonByte, err := json.Marshal(&hello2)
if err != nil {
panic(err)
}
fmt.Printf("string(jsonByte):%+v\n", string(jsonByte))
}
可以看到生成的pb 文件不仅支持二进制传输,同时也支持json 格式
运行demo得到如下结果:
hello:first:"first" second:"second" number_int64:111 proto_info:{version:"3"} array_int32:1 array_int32:2 array_int32:3 array_int32:4 array_int32:5 array_int32:6 proto_enum:HELLO_TWO
0A05666972737412067365636F6E64186F22030A01332A060102030405063001
hello2:first:"first" second:"second" number_int64:111 proto_info:{version:"3"} array_int32:1 array_int32:2 array_int32:3 array_int32:4 array_int32:5 array_int32:6 proto_enum:HELLO_TWO
string(jsonByte):{"first":"first","second":"second","number_int64":111,"proto_info":{"version":"3"},"array_int32":[1,2,3,4,5,6],"proto_enum":1}
前后端数据交互利器--Protobuf的更多相关文章
- 两种方法实现asp.net方案的前后端数据交互(aspx文件、html+ashx+ajax)
一个HTML页面只能显示HTML代码信息,不能与数据库进行数据的交互.asp.net方案提供了网页与数据库交互的方法,这里举出两种:①aspx文件 ②ashx文件+ajax技术 一.创建数据库 这里以 ...
- vue-resource的使用,前后端数据交互
vue-resource的使用,前后端数据交互 1:导入vue与vue-resource的js js下载: https://pan.baidu.com/s/1fs5QaNwcl2AMEyp_kUg ...
- 前后端数据交互处理基于原生JS模板引擎开发
json数据错误处理,把json文件数据复制到----> https://www.bejson.com/ 在线解析json 这样能直观的了解到是否是json数据写错,在控制台打断点,那里错误打那 ...
- 对GraphQL-BFF:微服务背景下的前后端数据交互方案的研究-------引用
随着多终端.多平台.多业务形态.多技术选型等各方面的发展,前后端的数据交互,日益复杂. 同一份数据,可能以多种不同的形态和结构,在多种场景下被消费. 在理想情况下,这些复杂性可以全部由后端承担.前端只 ...
- web前后端数据交互
前后端数据交互是每一名web程序员必须熟悉的过程,前后端的数据交互重点在于前端是如何获取后端返回的数据,毕竟后端一般情况下只需要将数据封装到一个jsonMap,然后return就完了.下面通过一个li ...
- 前后端数据交互(八)——请求方法 GET 和 POST 区别
WEB 开发同学一看 get 和 post 请求方法的区别,第一感觉都是 So easy! 学习ajax.fetch.axios时,发送网络请求携带参数时,都需要分别处理get和post的参数.所以我 ...
- SpringMVC前后端数据交互总结
控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...
- Spring MVC前后端数据交互总结
控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...
- 前后端数据交互(二)——原生 ajax 请求详解
一.ajax介绍 ajax 是前后端交互的重要手段或桥梁.它不是一个技术,是一组技术的组合. ajax :a:异步:j:js:a:和:x:服务端的数据. ajax的组成: 异步的 js 事件 其他 j ...
随机推荐
- Activity侧滑返回的实现原理
简介 使用侧滑Activity返回很常见,例如微信就用到了.那么它是怎么实现的呢.本文带你剖析一下实现原理.我在github上找了一个star有2.6k的开源,我们分析他是怎么实现的 //star 2 ...
- ECMAScript 2021 正式确认
ECMAScript 2021 主要包含内容: ECMAScript 2021 于2021年6月22日获得 ECMA International 的批准.ECMAScript 是标准化的 JavaSc ...
- Docker 镜像针对不同语言的精简策略
导航: 这里分为几个部分. 相关转载云原生:米开朗基杨 1.Docker减小镜像体积 2.Docker镜像针对不同语言的精简策略 对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积 ...
- 从零开始学前端,React框架背后的核心机制和原理JSX
什么是React React是起源于Facebook的一个前端框架,用于构建用户界面的JavaScript库,Facebook用来探索一种更加高效优雅的Javascript MVC框架来架设Insta ...
- 48、django工程(model)
48.1.数据库配置: 1.django默认支持sqlite,mysql, oracle,postgresql数据库: (1)sqlite: django默认使用sqlite的数据库,默认自带sqli ...
- 30、css介绍
30.1.css概述: css是Cascading Style Sheet的简称,中文称为层叠样式表,是用来控制网页数据表现的,可以 使网页的表现与数据内容分离: 30.2.css的四种引入方式: 1 ...
- flyway实现java 自动升级SQL脚本
flyway实现java 自动升级SQL脚本 为什么要用Flyway 在日常开发中,我们经常会遇到下面的问题: 自己写的SQL忘了在所有环境执行: 别人写的SQL我们不能确定是否都在所有环境执行过了: ...
- noi 162 post office dp
大致题意: 有v个村庄,每个村庄有各自的位置,且每个位置互不相同.现在要在村庄上设立P个邮局,使每个村庄到最近的邮局的距离之和最小. 分析: 定义状态d[i][j]表示前i个村庄,在这i个村庄中设立j ...
- JAVA并发(8)-ThreadPoolExecutor的讲解
很久前(2020-10-23),就有想法学习线程池并输出博客,但是写着写着感觉看不懂了,就不了了之了.现在重拾起,重新写一下(学习一下). 线程池的优点也是老生常谈的东西了 减少线程创建的开销(任务数 ...
- Redis:Java链接redis单节点千万级别数据 写入,读取 性能测试
本文是对Redis 单节点,针对不同的数据类型,做插入行测试. 数据总条数为:10058624 环境说明: Redis 未做任何优化, 单节点 (服务器上, 内存64G) ...