【消息队列开发】 设计网络通信协议

简介: 【消息队列开发】 设计网络通信协议

🍃前言

本次开发任务

  • 设计网络通信协议

用于客户端和服务器之间的通信

🎍明确需求

我们先来看一下我们最初的客户端与服务器的交互模型

我们可以看到,生产者和消费者都是客户端,都需要通过网络和Broker Server 进行通信。

此处我们使用 TCP 协议,来作为通信的底层协议。同时在这个基础上自定义应用层协议,完成客户端对服务器这边功能的远程调用。

要调用的功能有:

  • 创建 channel
  • 关闭 channel
  • 创建 exchange
  • 删除 exchange
  • 创建 queue
  • 删除 queue
  • 创建 binding
  • 删除 binding
  • 发送 message
  • 订阅 message
  • 发送 ack
  • 返回 message (服务器 -> 客户端)

🍀设计应用层协议

我们这里使⽤⼆进制的方式设定协议

请求与相应报文格式如下:

  • 请求
  • 响应

其中 type 表⽰请求响应不同的功能,取值如下:

  • 0x1 创建 channel
  • 0x2 关闭 channel
  • 0x3 创建 exchange
  • 0x4 销毁 exchange
  • 0x5 创建 queue
  • 0x6 销毁 queue
  • 0x7 创建 binding
  • 0x8 销毁 binding
  • 0x9 发送 message
  • 0xa 订阅 message
  • 0xb 返回 ack
  • 0xc 服务器给客⼾端推送的消息。(被订阅的消息)响应独有的。

其中 payload 部分, 会根据不同的 type, 存在不同的格式。

对于请求来说, payload 表示这次方法调用的各种参数信息

对于响应来说, payload 表示这次方法调用的返回值

🎄定义 Request / Response

Request 类实现如下:

ublic class Request {
  private int type;
  private int length;
  private byte[] payload;
  // 省略 getter setter
}

Response 类实现如下:

public class Response {
  private int type;
  private int length;
  private byte[] payload;
  // 省略 getter setter
}

关于 payload里面的数据,我们另外用别的类进行表示。

🌴定义参数父类与返回值父类

构造⼀个类表示方法的参数,作为 Request 的 payload

不同的方法中,参数形态各异,但是有些信息是通用的,使用⼀个⽗类表示出来。具体每个⽅法的参数再通过继承的方式体现.

参数父类实现如下:

public class BaseArguments implements Serializable {
  // 表⽰⼀次请求/响应的唯⼀ id. ⽤来把响应和请求对上.
  protected String rid;
  protected String channelId;
  // 省略 getter setter
}

此处的 rid 和 channelId 都是基于 UUID 来生成的, rid 用来标识⼀个请求-响应。这⼀点在请求响应比较多的时候非常重要.

返回值父类和参数同理,也需要构造⼀个类表示返回值,作为Response 的 payload

代码实现如下:

public class BaseReturns implements Serializable {
  // 表⽰⼀次请求/响应的唯⼀ id. ⽤来把响应和请求对上.
  protected String rid;
  protected String channelId;
  protected boolean ok;
  // 省略 getter setter
}

🌲定义其他参数类

针对每个 VirtualHost 提供的⽅法, 都需要有⼀个类表示对应的参数

比如创建交换机代码如下:

public class ExchangeDeclareArguments extends BaseArguments implements Serializa
  private String exchangeName;
  private ExchangeType exchangeType;
  private boolean durable;
  private boolean autoDelete;
  private Map<String, Object> arguments;
}

⼀个创建交换机的请求,形如:

  • 可以把 ExchangeDeclareArguments 转成 byte[],就得到了下列图片的结构.
  • 按照 length 长度读取出 payload, 就可以把读到的⼆进制数据转换成ExchangeDeclareArguments 对象.

后续相关方法也是如此,这里就进行书写了

不一样的一个方法就是 订阅消息的方法,在这里面我们有一个参数为我们的回调函数。

这个回调函数, 是不能通过网络传输的。站在 broker server 这边, 针对消息的处理回调, 其实是统一的。(把消息返回给客户端)

客户端这边收到消息之后, 再在客户端自己这边执行一个用户自定义的回调就行了。此时, 客户端也就不需要把自身的回调告诉给服务器了.

因此这个类就不需要 consumer 成员了

🌳定义其他返回类

这个返回类是因为,我们需要执行回调函数将消息发送给客户端(订阅方)、

代码执行如下:

public class SubScribeReturns extends BasicReturns implements Serializable {
    private String consumerTag;
    private BasicProperties basicProperties;
    private byte[] body
    //省略get与set
}

⭕总结

关于《【消息队列开发】 设计网络通信协议》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

相关文章
|
7月前
|
数据采集 算法 数据挖掘
模块化控制协议(MCP)在网络中增强智能体执行效率的研究
随着Web3技术的迅速发展,去中心化应用和智能体在各种领域的应用逐渐增多。MCP(Modularized Control Protocol,模块化控制协议)作为一种增强智能体执行能力的关键技术,为Web3场景中的智能体提供了更强的灵活性和可扩展性。本文将探讨如何利用MCP技术提升智能体在Web3场景中的执行能力,并通过实例代码展示其实现路径。
588 22
|
4月前
|
监控 负载均衡 安全
WebSocket网络编程深度实践:从协议原理到生产级应用
蒋星熠Jaxonic,技术宇宙中的星际旅人,以代码为舟、算法为帆,探索实时通信的无限可能。本文深入解析WebSocket协议原理、工程实践与架构设计,涵盖握手机制、心跳保活、集群部署、安全防护等核心内容,结合代码示例与架构图,助你构建稳定高效的实时应用,在二进制星河中谱写极客诗篇。
WebSocket网络编程深度实践:从协议原理到生产级应用
|
5月前
|
运维 架构师 安全
二层协议透明传输:让跨域二层协议“无感穿越”多服务商网络
简介:本文详解二层协议透明传输技术,适用于企业网工、运营商及架构师,解决LLDP/LACP/BPDU跨运营商传输难题,实现端到端协议透传,提升网络韧性与运维效率。
|
8月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
427 61
|
5月前
Vite使用svg-企业级开发(支持本地svg和网络svg渲染)
本教程介绍如何在Vite项目中集成SVG图标插件。首先安装`vite-plugin-svg-icons`,配置插件指向SVG图标目录,并注册全局组件。接着创建SVG图标组件,支持内部图标与外部图片展示。通过简单配置,即可在页面中灵活使用各类SVG图标,提升开发效率。
269 0
|
8月前
|
开发者
鸿蒙仓颉语言开发教程:网络请求和数据解析
本文介绍了在仓颉开发语言中实现网络请求的方法,以购物应用的分类列表为例,详细讲解了从权限配置、发起请求到数据解析的全过程。通过示例代码,帮助开发者快速掌握如何在网络请求中处理数据并展示到页面上,减少开发中的摸索成本。
鸿蒙仓颉语言开发教程:网络请求和数据解析
|
9月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
249 18
|
8月前
|
监控 安全 网络协议
恶意软件无处逃!国内版“Manus”AiPy开发Windows沙箱工具,进程行为+网络传输层级监控! 头像 豪气的
NImplant.exe 是一款后渗透测试工具,可实现远程管理与持久化控制。其优点包括无文件技术、加密通信和插件扩展,但也存在被检测风险及配置复杂等问题。为深入分析其行为,我们基于 aipy 开发了 Windows 沙箱工具,针对桌面上的 NImplant.exe 进行多维度分析,涵盖进程行为、网络连接(如 TCP 请求、目标 IP/域名)、文件控制等,并生成传输层监控报告与沙箱截图。结果显示,aipy 工具响应迅速,报告清晰易读,满足分析需求。
|
10月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
290 22
|
11月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
404 12