基于RabbitMQ的模拟消息队列之六——网络通信设计

这篇具有很好参考价值的文章主要介绍了基于RabbitMQ的模拟消息队列之六——网络通信设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

自定义基于TCP的应用层通信协议。实现客户端对服务器的远程调用
编写服务器及客户端代码

基于TCP的自定义应用层协议

一、请求

1.请求格式

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式
type:哪个方法
length:payload的长度
payload:调用的方法的参数

2.创建Request类

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

二、响应

1.响应格式

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

type:哪个方法
length:payload的长度
payload:调用的方法的结果

2.创建Response类

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

三、客户端-服务器交互

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

四、type

  • 0X1 创建channel
  • 0X2 销毁channel
  • 0X3 创建交换机 exchangeDeclare
  • 0X4 删除交换机 exchangeDelete
  • 0X5 创建队列 queueDeclare
  • 0X6 删除队列 queueDelete
  • 0X7 创建绑定 queueBind
  • 0X8 删除绑定 queueUnbind
  • 0X9 发布消息 basicPublish
  • 0Xa 订阅消息 basicConsume
  • 0xb 确认消息 basicAck
  • 0xc 服务器给客户端推送消息(响应独有)

五、请求payload

1.BasicAruguments(方法公共参数)

  • rid(一次请求/响应)
  • channelId(一次逻辑上的连接)

2.每个方法的参数

需要继承BasicArguments

ExchangeDelareArguments

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

ExchangeDeleteArguments

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

QueueDeclareArguments

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

QueueDeleteArguments

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

QueueBindArguments

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

QueueUnbindArguments

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

BasicPublishArguments

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

BasicConsumeArguments

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

BasicAckArguments

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

以ExchangeDeclare方法为例,具体的请求格式如下:
基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

六、响应payload

1.BasicReturns(返回结果公共参数)

  • rid (一次请求/响应)
  • channelId (一次逻辑上的连接)
  • ok (方法运行结果)

以exchangeDeclare为例,具体的响应格式:
基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式
其他的方法返回的响应payload都是BasicReturns序列化后的结果,除了0xc,是响应独有的。

2.SubscribeReturns

服务器通过Consumer接口实现推送消息给客户端(队列收到消息的时候会调用回调方法)

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式
响应具体格式:
基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

编写服务器代码

一、创建BrokerServer

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

二、初始化ServerSocket

给Serversocket初始化,监听一个端口
基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

三、开启服务器

  • 接受客户端的连接请求
  • 线程池处理连接

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

四、停止服务器(便于测试)

  • runnable设置成false
  • 抛弃线程池的所有任务
  • 关闭ServerSocket服务器连接

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

五、处理连接

  • 读取请求并解析
  • 根据请求计算响应
  • 将响应返回给客户端
  • 关闭客户端连接
  • 清除断开连接的socket的会话信息(channelId-socket)

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

1.读取请求并解析

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

2.根据请求计算响应

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

3.将响应返回给客户端

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

4.清除有关断开连接的socket对应的会话信息

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

编写客户端代码

一、ConnectionFactory 连接工厂

  • 服务器地址
  • 创建connecion对象

创建Connection对象

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

二、Connection 一次TCP连接

  • socket对象 socket=new socket(host,port)
  • 多个channel 对象 (创建channel对象)
  • 写入请求
  • 读取响应
  • 处理响应

1.Connection 属性

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

2.初始化

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

3.写入请求

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

4.读取响应

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

5.创建channel

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

6.处理响应

此处在构造方法中,补充创建一个扫描线程,当连接未断开时,不停的扫描(读取)服务器返回的响应。处理响应。
如果是SubScirbleReturns,使用线程池执行消费者的回调。
如果是BasicReturns,将响应的basicReturns放入对应channel的basicReturnsMap中。

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式
基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

7.关闭连接

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

三、Channel 逻辑上的连接

  • 对应API,实现客户端对服务器的远程调用

1.属性

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

2.API(远程调用服务器的)

  • 构造请求
  • 写入请求
  • 阻塞等待服务器的响应结果

生成rid:
基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

创建channel

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

销毁channel

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

创建交换机

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

删除交换机

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

创建队列

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

删除队列

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

创建绑定

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

删除绑定

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

发布消息

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

订阅消息

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

确认消息

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

3.实现阻塞等待服务器的响应

waitResult

根据rid,在basicReturnsMap集合中找;如果找到了,就返回,找不到阻塞等待。
基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

putResult

将rid-basicReturns 放入basicReturnsMap集合中
基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

编写Demo

实现消息队列生产者-消费者模型。

1.生产者客户端

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

2.消费者客户端

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

测试

1. 启动服务器

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式
基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

2.启动生产者

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式

3.启动消费者

基于RabbitMQ的模拟消息队列之六——网络通信设计,rabbitmq,网络,分布式文章来源地址https://www.toymoban.com/news/detail-705035.html

到了这里,关于基于RabbitMQ的模拟消息队列之六——网络通信设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于RabbitMQ的模拟消息队列之二---创建项目及核心类

    创建一个SpringBoot项目,环境:JDK8,添加依赖:Spring Web、MyBatis FrameWork(最主要) 2.核心类 在mqserver包中添加一个包,名字为core,表示核心类。 Exchange ExchangeType MSGQueue (为了区分Queue) Binding Message BasicProperties

    2024年02月11日
    浏览(47)
  • 消息队列之六脉神剑:RabbitMQ、Kafka、ActiveMQ 、Redis、 ZeroMQ、Apache Pulsar对比和如何使用

    消息队列(Message Queue)是一种异步通信机制,它将消息发送者和接收者解耦,从而提高了应用程序的性能、可扩展性和可靠性。在分布式系统中,消息队列经常被用于处理高并发、异步处理、应用解耦等场景。 本篇回答将分析比较常见的六种消息队列:RabbitMQ、Kafka、Active

    2024年02月14日
    浏览(46)
  • 项目实战 — 消息队列(8){网络通信设计①}

    目录 一、自定义应用层协议 🍅 1、格式定义 🍅 2、准备工作 🎄定义请求和响应   🎄 定义BasicArguments 🎄 定义BasicReturns 🍅 2、创建参数类         🎄 交换机         🎄 队列         🎄 绑定         🎄发布消息         🎄 订阅消息         🎄确认应答

    2024年02月13日
    浏览(41)
  • 模拟实现消息队列(以 RabbitMQ 为蓝本)

    核心概念1 生产者(Producer):生产者负责生成数据并将其放入缓冲区(队列)中。生产者可以是一个线程或多个线程,它们可以并行地生成数据。当缓冲区(队列)已满时,生产者需要等待,直到有空间可用。 消费者(Consumer):消费者负责从缓冲区(队列)中取出数据并进行处

    2024年02月13日
    浏览(69)
  • 手写消息队列(基于RabbitMQ)

    提到消息队列是否唤醒了你脑海深处的记忆?回看前面的这篇文章:《Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)》,其中我们在介绍阻塞队列时说过,阻塞队列最大的用途就是实现 生产者消费者模型 。 我们知道对于生产者消费者模型来说,它具有两个十分

    2024年02月05日
    浏览(44)
  • SpringCloud-实现基于RabbitMQ的消息队列

    消息队列是现代分布式系统中常用的通信机制,用于在不同的服务之间传递消息。在Spring Cloud框架中,我们可以利用RabbitMQ实现强大而可靠的消息队列系统。本篇博客将详细介绍如何在Spring Cloud项目中集成RabbitMQ,并创建一个简单的消息队列。 这里是一个简单的RabbitMQ消息队列

    2024年03月11日
    浏览(57)
  • RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型

    目录 一、SpringAMQP 1.1、概念 1.2、前置知识(实现案例前必看!) 1.2.1、创建队列 1.2.2、创建交换机 1.2.3、创建绑定 1.2.4、@RabbitListener 注解 a)情况一:queue 存在 b)情况二:queue 不存在  1.2.5、为什么更建议使用 @Bean 注解创建,而不是 @RabbitListener 注解创建? 1.3、案例实现

    2024年04月12日
    浏览(50)
  • 基于golang多消息队列中间件的封装nsq,rabbitmq,kafka

    场景 在创建个人的公共方法库中有这样一个需求,就是不同的项目会用到不同的消息队列中间件,我的思路把所有的消息队列中间件进行封装一个消息队列接口(MQer)有两个方法一个生产一个消费,那么在实例化对象的时候根据配置文件指定当前项目使用的那个消息队列中

    2024年02月14日
    浏览(64)
  • RabbitMQ实现延迟消息,RabbitMQ使用死信队列实现延迟消息,RabbitMQ延时队列插件

    假设有一个业务场景:超过30分钟未付款的订单自动关闭,这个功能应该怎么实现? RabbitMQ使用死信队列,可以实现消息的延迟接收。 队列有一个消息过期属性。就像丰巢超过24小时就收费一样,通过设置这个属性,超过了指定事件的消息将会被丢弃。 这个属性交:x-message

    2024年02月13日
    浏览(79)
  • RabbitMq消息模型-队列消息

    基本模型(SimpleQueue)、工作模型(WorkQueue) 队列消息特点: 消息不会丢失 并且 有先进先出的顺序。 消息接收是有顺序的,不是随机的,仅有一个消费者能拿到数据,而且不同消费者拿不到同一份数据。 基本模型: SimpleQueue 在上图的模型中,有以下几个概念: P:为生产

    2024年02月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包