• IDEA_2019.1版本中Protobuf的使用


    一、Protobuf是什么

    Protobuf 是 Google 发布的开源项目,全称 Google Protocol(/'prəʊtəkɒl/,协议,草案) Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC[远程过程调用 remote procedure call ] 数据交换格式 。目前很多公司 http+json ==> tcp+protobuf
    参考文档 : https://developers.google.com/protocol-buffers/docs/proto 语言指南

    二、为什么要使用Protobuf

    1、Netty 本身的编码解码机制存在的问题

    1.1 Netty 自身提供的 codec(编/解码器)

    Netty 提供的编码器

    StringEncoder,对字符串数据进行编码
    ObjectEncoder,对 Java 对象进行编码
    ...

    Netty 提供的解码器

    StringDecoder, 对字符串数据进行解码
    ObjectDecoder,对 Java 对象进行解码
    ...

    1.2 Netty 自身的 codec存在的问题

    Netty 本身自带的 ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,底层使用的仍是 Java 序列化技术 , 而Java 序列化技术本身效率就不高,存在如下问题:

    1.无法跨语言
    2.序列化后的体积太大,是二进制编码的 5 倍多。
    3.序列化性能太低

    4.Protobuf 是以 message (信息)的方式来管理数据的.

    5.支持跨平台、跨语言,即[客户端和服务器端可以是不同的语言编写的] (支持目前绝大多数语言,例如 C++、C#、Java、python 等)

    6.高性能,高可靠性
    7.使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述。说明,在idea 中编写 .proto 文件时,会自动提示是否下载 .ptotot 编写插件. 可以让语法高亮。

    8.然后通过 protoc.exe 编译器根据.proto 自动生成.java 文件

    2、protobuf 工作示意图

    三、IDEA安装Protobuf

    一、.proto文件语法高亮显示需要安装Protobuf Support插件:

    网上的教程:

    Intellij IDEA中使用Protobuf的正确姿势

    依次点击Intellij中的“File”>"Settings>"Plugins"==>"Browse repositories",输入Protobuf,点击install:

    而我的idea是2019.1版本,Plugins下面没有Browse repositories这个选项,选择磁盘安装:

    先进入官方地址下载插件:protobuf插件

    将插件下载到桌面(不用解压),打开idea,依次点击:

    “File”>"Settings>"Plugins">"设置按钮">"install Plugin from Disk"==>找到刚刚下载的文件并且选中,之后会出现protobuf Support插件,选择重启Idea(Restart IDE),然后之前写的XXX.proto文件就会变颜色。

    四、maven的方式集成插件

    在pom文件中引入依赖:

    <properties>
       <java.version>1.8</java.version>
           <protobuf.version>3.7.0</protobuf.version>
           <grpc.version>1.9.1</grpc.version>
    </properties>
    
    <dependencies>
    <!--protobuf3-->
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>3.7.0</version>
            </dependency>
            <!--grpc-->
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-netty</artifactId>
                <version>${grpc.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-protobuf</artifactId>
                <version>${grpc.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-stub</artifactId>
                <version>${grpc.version}</version>
                <scope>provided</scope>
            </dependency>
    </dependencies>
    
  • 相关阅读:
    Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】
    Codeforces1101F Trucks and Cities 【滑动窗口】【区间DP】
    HDU4651 Partition 【多项式求逆】
    BZOJ2554 color 【概率DP】【期望DP】
    codeforces1101D GCD Counting 【树形DP】
    codechef EBAIT Election Bait【欧几里得算法】
    BZOJ2434 [NOI2011] 阿狸的打字机 【树链剖分】【线段树】【fail树】【AC自动机】
    codeforces1093G Multidimensional Queries 【线段树】
    BZOJ3277 串 【后缀数组】【二分答案】【主席树】
    AHOI2013 差异 【后缀数组】
  • 原文地址:https://www.cnblogs.com/Courage129/p/14266738.html
Copyright © 2020-2023  润新知