Arzie100 发表于 2022-4-25 12:52

从零开始实现一套简单RPC协议(一):protobuff安装及使用 ...

前言

这学期计网的期末大作业要我们自己实现一套RPC协议,还要体现工作量......所以我寻思着,要不写几篇文章记录一下?嗯,就这么定了。
今天操作系统写的我头昏眼花,检查了四小时的bug最后发现其实一开始就是对的,我整个人裂开......哎,还是先来看看计网的大作业吧。
安装

首先声明本人打算用java来实现RPC协议,因此接下来的安装过程针对的是IDEA的,其他IDE的安装过程应该是类似的。
1.下载protobuf编译器
下载地址:protoc-3.20.1-win64.zip
下载解压成功后,需要将bin文件夹路径添加到环境变量中,如下图所示。

http://pic1.zhimg.com/v2-4a05b940ac5760031c26dcdeb5daefc8_r.jpg

2.下载protobuf解释器
下载地址:protobuf-java-3.20.1.zip

3.在IDEA中安装插件
需要安装这两个插件,菜单栏->File->settings->plugins,然后直接输入插件名install就可以



4.配置Maven
新建maven项目,在pmo.xml中添加如下依赖项
<dependencies>
      <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.20.1</version>
      </dependency>
      <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java-util</artifactId>
            <version>3.20.1</version>
      </dependency>
</dependencies>
5.配置GenProtobuf
菜单栏->Tools->Configure GenProtobuf,配置地址

http://pic1.zhimg.com/v2-25ee8c61a25d6184b770c2803af943fc_r.jpg
使用

1.编写一个简单的proto文件
syntax = "proto3";
option java_package="learnProto";
option java_outer_classname="MyTest";

message Data {
int32 id = 1;
optional string name = 2;
optional string email = 3;
}
2.编译proto
右键,选择“quick gen protobuf rules”,进行编译

http://pic4.zhimg.com/v2-789c75f5346714d395cf5d0fe3f0e3ab_r.jpg
编译成功,MyTest即是test.proto生成的java类

http://pic1.zhimg.com/v2-5ff4ed3a79a1af9c4c56656e7d0d7844_r.jpg
3.测试
编写代码测试一下生成的java文件其序列化和反序列化功能,如果可以正常运行并解析正确,说明操作无误。
package learnProto;

import com.google.protobuf.InvalidProtocolBufferException;
import learnProto.MyTest.*;
import java.util.Arrays;

public class test {
    public static void main(String[] args) {
      convertProto(123);
    }

    public static void convertProto(int value) {
      //1.通过build创建消息构造器
      MyTest.Data.Builder dataBuilder = MyTest.Data.newBuilder();
      //2.设置字段值
      dataBuilder.setId(value);
      //3.通过消息构造器构造消息对象
      MyTest.Data data = dataBuilder.build();
      //4.序列化
      byte[] bytes = data.toByteArray();
      System.out.println(value+"序列化后的数据:" + Arrays.toString(bytes)+",字节个数:"+bytes.length);
      //5.反序列化
      try {
            MyTest.Data parseFrom = MyTest.Data.parseFrom(bytes);
            System.out.println("还原后的数据="+parseFrom.getId());
      } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
      }
    }
}运行结果:
123序列化后的数据:,字节个数:2
还原后的数据=123
到此为止protobuff就算装好啦。
参考文献

gRPC 官方文档中文版_V1.0 (oschina.net)
【Protobuf专题】(一)基于IDEA实现Proto一站式编辑及编译 - 知乎 (zhihu.com)
Overview|Protocol Buffers|Google Developers
页: [1]
查看完整版本: 从零开始实现一套简单RPC协议(一):protobuff安装及使用 ...