首页 > 其他分享 >【BlossomRPC】如何自定义一个RPC协议?

【BlossomRPC】如何自定义一个RPC协议?

时间:2024-03-30 22:01:36浏览次数:17  
标签:AlgorithmTypeEnum code 自定义 BlossomRPC RPC private byte 序列化 public

文章目录

RPC项目

配置中心项目

网关项目

如何设计一个RPC协议?

在上面的需求描述中我们知道,RPC非常重要的一环,就是自己制定符合自己需求的通信协议,这里,我简单的列出了我的协议。

public class RpcHeader implements Serializable {
    //public static final long serialVersionUID = 200201141215L;
    //当前RPC服务版本号(借鉴Dubbo)
    private byte versionId;

    //使用的序列化/压缩算法
    private byte algorithmType;

    //请求类型
    private byte reqType;

    //请求ID
    private long reqId;

    //消息内容长度
    private int length;

}
//RPC DTO对象
//是项目最终使用的数据传输对象
@Data
public class RpcDto<T> implements Serializable {
    //请求头
    private RpcHeader header;

    //数据
    private T data;
}

协议的实现比较简单,但是,那些设计的非常良好的开源框架,也会在协议上下很多功夫,来尽可能保证使用的协议传输快,性能好,空间浪费少。
这里我简单的列出一个对协议的优化方式。
比如我们知道,对于algorithmType这个字段,使用byte类型能最多提供8bit,也就是最多256种不同方式。
那么,其实单纯的使用一个byte,我们就能同时表示出要使用的序列化算法和压缩等算法,也就是用位运算这种方法,能够充分的解决空间的浪费问题同时位运算性能也很高。
具体设计方式如下:

package blossom.project.rpc.common.enums;

/**
 * @author: ZhangBlossom
 * @date: 2023/12/16 16:55
 * @contact: QQ:4602197553
 * @contact: WX:qczjhczs0114
 * @blog: https://blog.csdn.net/Zhangsama1
 * @github: https://github.com/ZhangBlossom
 * AlgorithmTypeEnum类
 * 一个字节8个bit 0000 | 0000
 * 2^4 = 16 也就是高低位分别可以对应16种数据
 * 1:可以高位用于存放压缩算法
 * 2:低位存储序列化算法
 * 3:使用位运算进行高低位计算即可得到具体的算法类型
 */
public enum AlgorithmTypeEnum {

    // 压缩算法枚举定义
    NO_COMPRESSION((byte)0x00), // 无压缩(默认操作,这样子就算不选也无所谓了)
    GZIP((byte)0x10),           // GZIP压缩
    // ... 其他压缩算法

    // 序列化算法枚举定义
    PROTOBUF((byte)0x01),       // Protobuf序列化
    ARVO((byte)0x02),           // Avro序列化
    JSON((byte)0x03),           // JSON序列化
    JAVA((byte)0x04);           // Java原生序列化

    private byte code;

    AlgorithmTypeEnum(byte code) {
        this.code = code;
    }

    public byte getCode() {
        return this.code;
    }

    // 结合压缩算法和序列化算法的code
    public static byte combine(AlgorithmTypeEnum compression, AlgorithmTypeEnum serialization) {
        return (byte) (compression.code | serialization.code);
    }

    // 分离组合code为压缩和序列化算法的code
    public static AlgorithmTypeEnum[] split(byte combinedCode) {
        byte compressionCode = (byte) (combinedCode & 0xF0); // 获取高4位
        byte serializationCode = (byte) (combinedCode & 0x0F); // 获取低4位

        return new AlgorithmTypeEnum[]{
                findByCode(compressionCode), // 压缩算法
                findByCode(serializationCode) // 序列化算法
        };
    }

    // 根据code查找对应的枚举值
    private static AlgorithmTypeEnum findByCode(byte code) {
        for (AlgorithmTypeEnum type : AlgorithmTypeEnum.values()) {
            if (type.code == code) {
                return type;
            }
        }
        //没有找到对应的枚举类型就报错
        throw new RuntimeException("No enumeration type was found");
    }
}

然,在协议上还有很多功夫可以去琢磨,我就不细扣了。

标签:AlgorithmTypeEnum,code,自定义,BlossomRPC,RPC,private,byte,序列化,public
From: https://blog.csdn.net/Zhangsama1/article/details/137184316

相关文章

  • 【BlossomRPC】手把手教你写一个RPC协议
    文章目录新的开始什么是RPC?设计一个RPC需要些什么?新的开始经常会遇到一些项目,看着看着就发现看不懂文档了,也就是会出现一些跳过讲解的文章,使得自己很难了解某种中间件的开发全貌,所以想着自己先设计一个比较简易的RPC框架,在实现所有功能的前提下,向公司内部的技术分享......
  • Nginx 配置,自定义日志格式 log_format
    文章目录前沿配置Nginx重点解析前沿nginx记录日志,太方便。这里提供一种小技巧。配置Nginxserver{listen8080;server_namelocalhost;location/proxy/server{default_typetext/html;return200"success";}......
  • NET Core使用Grpc通信(一):一元请求
    gRPC是一个现代的开源高性能远程过程调用(RPC)框架,它可以高效地连接数据中心内和跨数据中心的服务,支持负载平衡、跟踪、运行状况检查和身份验证。gRPC通过使用ProtocolBuffers作为数据传输格式,实现了在不同平台上的通信,并支持双向流和流式传输。RPC是远程过程调用的缩写,实现......
  • 【记录】使用python图形库自定义位置组件的技术
    目录使用的技术展示一下这个效果结语使用的技术使用自定义位置的技术可以通过place方法来实现。这里是如何使用这种技术的一般步骤:创建一个Label或Button等组件,并设置相关属性(例如文本、图像、背景色等)。使用place方法设置组件的位置,通过指定x和y参数来调整组件在窗口......
  • C语言---自定义类型:结构体
    文章目录前言1.结构体类型的声明2.结构体变量的创建和初始化2.1.创建结构体变量2.2.结构体变量的初始化2.3.嵌套结构体变量2.4.结构体的自引用3.结构成员访问操作符3.1.结构体成员的直接访问3.2.结构体成员的间接访问4.结构体内存对齐4.1对齐规则4.2为什么存在内......
  • gRPC入门学习之旅(四)
    gRPC入门学习之旅(一)gRPC入门学习之旅(二)gRPC入门学习之旅(三)实现定义的服务9.在“解决方案资源管理器”中,使用鼠标左键选中“Services”文件夹,然后在菜单栏上,依次选择“添加-->新建项”。10.在“添加新项”对话框中,选择“ASP.NETCore-->代码”节点,然后选择“类”项。......
  • yii2 Gii使用和自定义模板
    yii2Gii使用和自定义模板配置开启giiconfig/web.php添加代码if(YII_ENV_DEV){$config['bootstrap'][]='gii';$config['modules']['gii']=['class'=>'yii\gii\Module',];}入口脚本web......
  • gRPC框架
    读了songguojun大佬的一篇文章gRPC框架详解,总结一下关于gRPC的知识点RPC是什么RPC是远程调用,是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议,简单的理解就是一个节点请求另一个节点提供的服务。RPC只是一套协议,基于这套协议规范来实现的框架称为RPC框架......
  • VOL框架 GetPageData 前端加入自定义查询条件的处理方法
    VOL框架GetPageData前端加入自定义查询条件的处理方法前端加入两个自定义条件:开始日期,结束日期publicoverridePageGridData<ST_QueryFeeReceiveable>GetPageData(PageDataOptionsoptions){QuerySql=$@"SELECTFeeReceivableID,R.FeeI......
  • C语言中的自定义类型
    在C语言中有三种常见的自定义类型:结构体,联合体,枚举。1.1 结构体1.1.1结构体的声明structtag{  member-list;//成员清单}variable-list; //变量清单例如:我们创建一个结构体的变量,来描述一个学生。structStudent{charname[20];intage;cha......