Netty二、Netty编解码

1. 编解码技术

1.1 netty自身提供的编解码器

  1. StringDecoder StringEncoder 字符串解码编码器
  2. ObjectDecoder ObjectEncoder 对象解码编码器
  1. 底层都基于 JAVA 序列化,从 JDK 1.1 版本就提供,只需实现 java.io.Serializable并生成序列ID即可。
  2. JAVA序列化的目的,网络传输及持久化。
  3. Java序列化从JDK 1.1版本就己经提供,它不需要添加额外的类库,只需实现 java.io.Serializable并生成序列ID即可,但是在远程服务调用(RPC)时,很少宜接使用Java序列化进行消息的编解码和传输, 这又是什么原因呢?
  1. 无法跨语言,编码后其他语言无法正常解码
  2. 编码后的码流太大
  3. 性能差

1.2 业界主流的编解码框架

  1. MessagePack 编解码

MessagePack是一个高效的二进制序列化框架,它像JSON 一样支持不同语言间的数 据交换,但是它的性能更快,序列化之后的码流也更小。

  • 编解码高效,性能高;

  • 序列化之后的码流小;

  • 支持跨语言。

  1. Google Protobuf 编解码

Google的Protobuf在业界非常流行,很多商业项目选择Protobuf作为编解码框架。

  • 在谷歌内部长期使用,产品成熟度髙:

  • 跨语言、支持多种语言,包括C++、Java和Python:

  • 编码后的消息更小,更加冇利于存储和传输:

  • 编解码的性能非常高:

  • 支持不同协议版本的前向兼容:

  • 支持定义可选和必选字段。

  1. JBoss Marshalling 编解码

JBoss Marshalling是一个Java对象序列化包,对JDK默认的序列化框架进行了优化, 但又保持跟java.io.Serializablc接口的兼容,同时増加了 -些可调的参数和附加的特性, 这些参数和特性可通过工厂类进行配置。

2. Google Protobuf 编解码

在这里插入图片描述

客户端产生业务数据,经过 ProtobufEncoder 编码器编码,客户端接受后通过 ProtobufDecoder 解码。

2.1 编写.proto文件

//版本
syntax = "proto3";
// 生成的外部类型名称
option java_outer_classname = "StudentPOJO";
// protobuf 使用 message 管理数据
message Student{
   
     // 会在 StudentPOJO 外部类生成内部类, 真正发送的 pojo 对象
    // 1 标识属性序号,不代表值
    int32 id = 1;
    string name = 2;
}
// https://developers.google.com/protocol-buffers/docs/proto  文档

google protobuf 会根据此文件生成对应的 java类,此内部类对相应 message 定义的内容。

StudentPOJO 需要通过 protoc.exe 生成,protoc.exe --java_out=. Student.proto

public final class StudentPOJO {
   
   
    private StudentPOJO() {
   
   
    }

    public static void registerAllExtensions(
            com.google.protobuf.ExtensionRegistryLite registry) {
   
   
    }

    public static void registerAllExtensions(
            com.google.protobuf.ExtensionRegistry registry) {
   
   
        registerAllExtensions(
                (com.google.protobuf.ExtensionRegistryLite) registry);
    }

    public interface StudentOrBuilder extends
            // @@protoc_insertion_point(interface_extends:Student)
            com.google.protobuf.MessageOrBuilder {
   
   

        /**
         * <pre>
         * 1 标识属性序号,不代表值
         * </pre>
         *
         * <code>int32 id = 1;</code>
         */
        int getId();

        /**
         * <code>string name = 2;</code>
         */
        java.lang.String getName();

        /**
         * <code>string name = 2;</code>
         */
        com.google.protobuf.ByteString
        getNameBytes();
    }

		public static final class Student extends com.google.protobuf.GeneratedMessageV3 implements StudentOrBuilder {
   
   
    	private static final 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值