模拟实现消息队列项目(系列6) -- 网络通信协议的设计

news2024/12/23 22:34:01

目录

前言

1. 明确需求

2. 设计应用层协议

2. 定义Request 和 Response

3. 定义参数的父类

4. 定义其他参数类

4.1 创建交换机

4.2 删除交换机

4.3 创建队列

4.4 删除队列

4.5 创建绑定

4.6 删除绑定

4.7 发布消息

4.8 订阅消息

4.9 推送消息

结语


前言

        上一章节,我们完成了虚拟主机的封装,同时实现了API供服务器进行调用.那么从这一章节,我们就要将消息队列进行添加网络通信了,毕竟消息队列的目的就是实现消息的转发,网络通信是必须要实现的.在开始之前,我们思考一个问题,我们之前的博客系统,我们采用的是http的通信协议实现前后端的通信的,但是我们之前传输的是文本文件,这里我们的Message是二进制文件,所以我们要使用一个支持二进制传输的应用层协议,这里我们不打算使用市面的应用层协议.我们自己定义一个应用层协议.然后使用TCP协议作为通信底层的协议.本项目全部代码已上传Gitee,链接放在文章末尾,欢迎大家访问!


1. 明确需求

 

 生产者和消费者都是客户端,都需要通过网络和BrokerServer进行通信.需要调用服务器的功能如下:

2. 设计应用层协议

2. 定义Request 和 Response

表示网络通信的请求和响应对象.

@Getter
@Setter
public class Request {
    private int type;
    private int length;
    private byte[] payload;
}
@Getter
@Setter
public class Response {
    private int type;
    private int length;
    private byte[] payload;
}

3. 定义参数的父类

对于请求的参数我们放在payload里面,但是每种请求的参数都是不一样的,但是会有公共的参数属性:

  • 1. rid:此次请求的唯一ID,用来对应请求和响应 (使用UUID随机成成唯一的ID)
  • 2. ChannelID : 表示此次通信的ChannelID
@Setter
@Getter
public class BasicArguments implements Serializable {
    // 表⽰⼀次请求/响应的唯⼀ id. ⽤来把响应和请求对上.
    protected String rid;
    // 此次通信的channel的身份标识
    protected String channelId;
}

对于响应也是一样,定义一个父类,不同的响应返回不同的值,继承父类的公共属性

  • 1. rid:此次请求的唯一ID,用来对应请求和响应 (使用UUID随机成成唯一的ID)
  • 2. ChannelID : 表示此次通信的ChannelID
  • 3. ok:表示响应是否成功
@Getter
@Setter
public class BasicReturns implements Serializable {
    // 表⽰⼀次请求/响应的唯⼀ id. ⽤来把响应和请求对上.
    protected String rid;
    protected String channelId;
    protected boolean ok;
}

4. 定义其他参数类

4.1 创建交换机

下面以创建交换机为例:

我们针对以上参数设计属性 

@Getter
@Setter
public class ExchangeDeclareArguments extends BasicArguments implements Serializable {
    private String exchangeName;
    private ExchangeType exchangeType;
    private boolean durable;
    private boolean autoDelete;
    private Map<String, Object> arguments;
}

最后构造出来的请求如下:

 后续的请求也是这样只不过是payload的内容和Type的类型以及length发生改变,但是结构不会变.

下面给出对应不同请求的参数类.

4.2 删除交换机

@Setter
@Getter
public class ExchangeDeleteArguments extends BasicArguments implements Serializable {

    private String exchangeName;
}

4.3 创建队列

@Getter
@Setter
public class QueueDeclareArguments extends BasicArguments implements Serializable {
    private String queueName;
    private boolean durable;
    private boolean exclusive;
    private boolean autoDelete;
    private Map<String, Object> arguments;
}

4.4 删除队列

@Setter
@Getter
public class QueueDeleteArguments extends BasicArguments implements Serializable {
    private String queueName;
}

4.5 创建绑定

@Getter
@Setter
public class QueueBindArguments extends BasicArguments implements Serializable {
    private String queueName;
    private String exchangeName;
    private String bindingKey;
}

4.6 删除绑定

@Getter
@Setter
public class QueueUnbindArguments extends BasicArguments implements Serializable {
    private String queueName;
    private String exchangeName;
}

4.7 发布消息

@Getter
@Setter
public class BasicPublishArguments extends BasicArguments implements Serializable {
    private String exchangeName;
    private String routingKey;
    private BasicProperties basicProperties;
    private byte[] body;
}

4.8 订阅消息

这里需要特别说明一下:这个类对应的订阅消息的方法的参数还有一个回调函数,回调函数不能通过网络进行传输的,站在消息队列服务器这边,用户执行这个回调函数是统一的行为.不在乎行为的具体内容.

@Getter
@Setter
public class BasicConsumeArguments extends BasicArguments implements Serializable {
        private String consumeTag;
        private String queueName;
        private boolean autoAck;
        // 这个类对应的订阅消息的方法的参数还有一个回调函数
        // 回调函数不能通过网络进行传输的

        // 站在消息队列服务器这边,用户执行这个回调函数是统一的行为.不在乎行为的具体内容
}

4.9 推送消息

这个不是参数,是返回值.是服务器给消费者推送的订阅消息.当消费者订阅了队列,消息队列就会从这个队列中取出消息推送给消费者.


结语

        以上我们自己实现了应用层的协议,为BrokerServer与客户端通信奠定了基础.

        下一章节正式进入BrokerServer的封装,请大家持续关注.

        完整的项目代码已上传Gitee,欢迎大家访问.👇👇👇

模拟实现消息队列icon-default.png?t=N6B9https://gitee.com/yao-fa/advanced-java-ee/tree/master/My-mq

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现栈和队列

文章目录 1.栈 1.1 栈的概念及结构 1.2 栈的实现 实现栈的标识索引 数组实现栈 栈的结构定义 栈空间数据的初始化和销毁 入栈和出栈 获取栈顶元素、计算栈空间元素个数、判空 2.队列 2.1 队列的概念及结构 2.2 链表的实现 实现链表的标识索引 链表实现队列 定…

JavaScript基础 第一天

本套笔记是通过学习B站Pink老师JavaScript核心进阶 前端必学总结的学习笔记&#xff0c;希望自己之后在使用的过程中能够将所学知识融会贯通 学习目标 1. 理解变量是存储数据的容器 2.理解什么是数据并知道数据的类型 3.知道JavaScript数据类型转换的特征 学习目录 1.Jav…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

JVM垃圾回收篇-垃圾回收算法与五种引用

JVM垃圾回收篇-垃圾回收算法与五种引用 引用计数法 引用计数&#xff08;英语&#xff1a;reference counting&#xff0c;RC&#xff09;是计算机编程语言中的一种内存管理技术&#xff0c;是指将资源&#xff08;可以是对象、内存或磁盘空间等等&#xff09;的被引用次数保…

mac安装open3d时候出现错误

在测试open3d是否正常顺利安装时&#xff0c;出现了如下错误&#xff1a; python -c "import open3d as o3d; print(o3d.__version__)" Traceback (most recent call last):File "<string>", line 1, in <module>File "/Users/huangzhe/…

【产品设计】消息通知系统设计

消息通知可以将内容实时送达用户手机页面&#xff0c;但是泛滥的消息通知会引起用户的反感&#xff0c;也违背了这个设计的初衷。 消息通知可以及时地将状态、内容的更新触达到用户&#xff0c;用户则可以根据收到的消息做后续判断。但是如果没有及时将重要消息触达到用户或者滥…

Java基础入门篇——数据类型(六)

目录 一、基本数据类型 1.1整型类型变量 1.2浮点型 1.3字符型 1.4布尔型 二、引用数据类型 Java是一个强类型语言&#xff0c;Java中的数据必须明确数据类型。数据类型的作用就是约束变量存储数据的形式。例如&#xff0c;定义为int类型存储整数&#xff0c;定义为double…

【分布式流控组件 Sentinel 快速入门】——图文详解操作流程

&#x1f4a7; 分布式流控组件 S e n t i n e l 快速入门 \color{#FF1493}{分布式流控组件 Sentinel 快速入门} 分布式流控组件Sentinel快速入门&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#…

ThreadPoolExecutor线程池详解

ThreadPoolExecutor线程池详解 1. 背景 项目最近的迭代中使用到了ThreadPoolExecutor线程池&#xff0c;之前都只是知道怎么用&#xff0c;没有了解过线程池的底层原理&#xff0c;项目刚上线&#xff0c;有时间整理一下线程池的用法&#xff0c;学习一下线程池的底层实现与工…

Stable Diffusion - Style Editor 和 Easy Prompt Selector 提示词插件配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132122450 Stable Diffusion 的 Prompt 的功能&#xff0c;可以用文字来描述想要生成的图像&#xff0c;根据输入来创造出逼真的图像。Prompt 支持…

Mysql面试题(查询重复数据删除重复数据)

Create table A (id int) 注意&#xff1a;id列非自增&#xff0c;由代码产生并输入&#xff0c;但代码可能产生重复id 1.业务定义中&#xff0c;id列不允许重复&#xff0c;用什么方式保证重复的id不会被输入表中&#xff1f; 2.若已经发生数据重复&#xff0c;请写出SQL语…

【C++进阶之路】继承与多态的概念考察

文章目录 一、问答题二、概念题三、答案与解析问答题概念题 一、问答题 什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;什么是菱形虚拟继承&#xff1f;如何解决数据冗余和二义性的。继承和组合的区别&#xff1f;什么时候用继承&#xff1f;什么时候用组合&…

9:00开始面试,9:08就出来了,这问题问的实在是····

外包工作3年&#xff0c;今年裸辞跳槽&#xff0c;很幸运的是找到了下家&#xff0c;不过 自从加入到这家公司&#xff0c;每天不是在加班就是在加班的路上&#xff0c;薪资倒是给的不少&#xff0c;所以我也就忍了。没想到6月一纸通知&#xff0c;所有人都不许加班&#xff0…

网络防御(9)

.一、SSL工作过程是什么&#xff1f; SSL位于应用层和传输层之间&#xff0c;它能够为基于TCP等可靠连接的应用层协议提供安全性保证。SSL协议本身分为两层&#xff1a; 上层为SSL握手协议&#xff08;SSL handshake protocol&#xff09;、SSLpassword变化协议&#xff08;S…

【locust】使用locust + boomer实现对接口的压测

目录 背景 环境安装 脚本编写 master slave节点&#xff08;golang/boomer&#xff09; 问题 资料获取方法 背景 很早之前&#xff0c;考虑单机执行能力&#xff0c;使用locust做过公司短信网关的压测工作&#xff0c;后来发现了一个golang版本的locust&#xff0c;性能…

HTML

HTML 1. 块级标签 标题&#xff1a; <h1>一级标题</h1> div: <div>这是一个div标签</div> p&#xff1a; <p>这是一个p标签&#xff0c;段落标签</p> <!DOCTYPE html> <html lang"en"> <head><meta charse…

使用 ESP32 Arduino 和机器学习实现WIFI室内定位

在这个 Arduino 机器学习项目中,我们将使用附近的 WiFi 接入点来定位我们所在的位置。为了使该项目正常运行,您需要一块配备 WiFi 的板,例如 ESP8266、ESP32 或 MKR WiFI 1010。 什么是室内定位? 我们都习惯了 GPS 定位,我们的设备将使用卫星来跟踪我们在地球上的位置。GP…

SOLIDWORKS Simulation的功能到底有多强大

说到知己知彼&#xff0c;这是一个老生常谈的问题&#xff0c;对于SOLIDWORKS Simulation来说&#xff0c;很多朋友经常问我&#xff0c;我要算一个某某问题&#xff0c;SOLIDWORKS Simulation能算么&#xff1f;其实&#xff0c;这个就是一个典型的不了解SOLIDWORKS Simulatio…

虚拟世界探索:科技之下的未来可能性

随着科技的飞速发展&#xff0c;人们对于虚拟世界的憧憬和探索也日益加深。虚拟世界&#xff0c;那是一个超越现实的概念&#xff0c;一个充满想象力和创造力的领域。然而&#xff0c;虚拟世界究竟有可能实现吗&#xff1f;这是一个引人深思的问题。 虚拟世界&#xff0c;首先让…

多格式兼容,PDM系统与BOM系统格式转换

在现代制造业的产品开发过程中&#xff0c;PDM系统&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;和BOM系统&#xff08;Bill of Materials&#xff0c;物料清单管理&#xff09;是不可或缺的重要工具。PDM系统负责管理产品的图文档、规格参数等信息…