1.写在前面
实时数仓开发中,利用Canal伪装slave获取MySQL的增量数据,获取后的数据由Kafka生产者接收,交由Flink实时流计算。传输数据量较大时,会占用内存及带宽,所以考虑将数据序列化和反序列化操作,这里介绍的是protocal buffers
2.介绍
Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化,常用于RPC 系统和持续数据存储系统。
其类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差,类似的还有json、Java的Serializable等。
很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
3.安装说明
1)本文采用eclipse编写Java代码
2)protocal语法proto3
4.安装及测试
1)新建一个程序,能跑就行,我新建一个springboot程序
2)proto文件内容准备
//语法
syntax = "proto3";
//等下这个文件编译成Java后的包地址,这个包路径要提前创建,不建议与proto文件放一起
option java_package = "com.example.demo.protoCom";
message Person {
// ID
int32 id = 1;
// 姓名
string name = 2;
// email
string email = 3;
// 朋友
string friends = 4;
}
3)安装protocol插件
插件的作用:把定义好的proto文件提交给protoc.exe程序编译
eclipse中help----eclipse market place
搜索protocol,看到下图中的插件,点击安装,安装提示重启eclipse即可
4)添加jar包依赖
这里的语法用的是proto3,版本选择3.21.12,
jar包同protoc.exe的版本一定要一致,不然会报错
如果是proto2的话,在写proto文件的时候语法不同,这里2.5.0也是可以的
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.21.12</version>
</dependency>
5)配置protocal插件
eclipse中点击window----preference 查找protocol buffer
图中的protoc.exe是编译程序,下载后放电脑中任意地址,这里给路径连接即可
本教程3.21.12版本的protoc.exe地址:https://download.csdn.net/download/u010763324/87408397
官方下载地址:Releases · protocolbuffers/protobuf · GitHub
下图中Java输出地址,不用写package的地址,因为package地址在proto文件中已写,
即Java output Directory + Java package = 生成Java文件的地址
白话文:安装一个protobuf-dt 2.2.1插件,将编写的proto文件发送给已经下载好的protoc.exe文件编译,编译后产生的Java文件要设置放置路径
6)测试方法类
package com.example.demo.controller;
import java.io.IOException;
import com.example.demo.protoCom.PersonMsg;
public class CanalDemo {
public void canal() throws IOException{
//实例化protobuf的对象
PersonMsg.Person.Builder builder = PersonMsg.Person.newBuilder();
//给user对象进行赋值
builder.setId(1); //用户id
builder.setName("张三");//用户名
builder.setEmail("1234566@dd");//邮箱
//获取User对象的属性
PersonMsg.Person userBuilder = builder.build();
System.out.println(userBuilder.getId());
System.out.println(userBuilder.getName());
System.out.println(userBuilder.getEmail());
}
}
这次开发没写注解,运行测试方法类需要在主程序实例化运行即可