RabbitMQ基础(简单易懂)
RabbitMQ高级篇请看:
RabbitMQ高级篇-CSDN博客
目录
什么是RabbitMQ?
MQ 的核心概念
1. RabbitMQ 的核心组件
2. Exchange 的类型
3. 数据流向说明
如何安装RabbitQueue?
WorkQueue(工作队列):
Fanout交换机 :广播
Direct交换机
Direct 交换机
生产者代码
消费者代码
Topic交换机
SpringAMQP
编辑
1. maven依赖:
2. 配置服务端信息
简单示例
注解式声明队列和交换机
编辑
消息转换器
总结如何在IDEA当中使用RabbitMQ
什么是RabbitMQ?
它基于AMQP协议(Advanced Message Queuing Protocol),一种为应用构建消息队列的标准协议。过程中,它提供了一些重要模块:为消息发送的Producer(生产者),分发消息的Exchange(交换器),写入消息的Queue(队列),和读取消息的Consumer(消费者)。

MQ 的核心概念
1. 异步处理
问题:系统需要执行一些耗时操作(如发送邮件、生成报告),如果这些操作在主线程执行,会影响用户体验或导致系统响应变慢。
MQ 的解决方式:
- 生产者将任务消息放入队列,不需要等待任务完成。
- 消费者在后台异步处理任务。
示例:
- 用户下单后,系统需要发送订单确认邮件。如果没有 MQ,用户可能需要等待邮件发送完成后才能收到订单确认。
- 使用 MQ 后,生产者(订单服务)将“发送邮件”任务放入队列,消费者(邮件服务)异步处理。
2. 系统解耦
问题:系统服务之间高度耦合,一个服务的变化会导致多个服务需要修改,降低开发效率和系统灵活性。
MQ 的解决方式:
- 服务之间通过消息队列通信,而不是直接调用。
- 生产者只需要发送消息到 MQ,消费者负责处理消息,二者互不影响。
示例:
- 用户下单后,订单服务需要通知库存服务扣减库存、物流服务生成物流单。如果没有 MQ,订单服务需同步调用这些服务的接口,导致用户必须等待所有操作完成(线性操作),响应时间较长,且系统耦合度高。
- 使用 MQ 后,订单服务将消息发送到消息队列,并立即返回“下单成功”的响应。库存服务和物流服务异步订阅消息进行处理,各服务独立运行,彼此解耦。这样既提升了用户体验,也增强了系统的扩展性和稳定性。
3. 削峰填谷
问题:在高并发场景下,大量请求瞬间涌入,可能导致服务过载或崩溃。
MQ 的解决方式:
- 将高并发的请求存入队列,消费者按自己的能力逐步处理。
- 队列可以作为缓冲区,平衡生产者和消费者之间的处理速度。
示例:
- 秒杀活动中,用户请求大量涌入库存系统。没有 MQ,库存服务可能因并发过高而宕机。
- 使用 MQ 后,所有秒杀请求进入队列,库存服务按顺序逐一处理。
好处:
- 防止系统崩溃,保障服务稳定性。
4. 数据可靠性
问题:数据传输过程中,可能因为网络故障、系统宕机等原因导致消息丢失。
MQ 的解决方式:
- MQ 提供消息持久化功能,确保即使系统故障,消息也不会丢失。
- 支持消息重试机制,确保消息至少被处理一次。
示例:
- 支付系统发送“支付成功”消息给订单系统。如果没有 MQ,网络抖动可能导致消息丢失,订单状态无法更新。
- 使用 MQ 后,消息持久化到磁盘,消费者故障恢复后可继续消费消息。

1. RabbitMQ 的核心组件
Virtual Host(虚拟主机)
定义:RabbitMQ 中的逻辑隔离单位,类似于一个独立的命名空间。
作用:
- 用于实现不同用户或系统之间的隔离。
- 每个 Virtual Host 下可以有独立的 Exchange(交换机)、Queue(队列)和绑定关系。
- 一个 RabbitMQ 服务器可以有多个 Virtual Host。
应用场景:
- 多租户系统(例如,不同的业务模块可以使用不同的 Virtual Host)。
Publisher(消息发送者)
- 定义:负责向 RabbitMQ 发送消息的生产者应用程序。
- 功能:
- 将消息发送到 Exchange(交换机),而不是直接发送到 Queue。
- 注意:
- Publisher 和 Exchange 通过绑定关系决定消息的路由。
Consumer(消息消费者)
定义:负责从 Queue(队列)中接收消息并处理的应用程序。
功能:
- 消费者直接从队列中读取消息。
- 每个消息只会被一个消费者处理(点对点模式)。
Queue(队列)
定义:存储消息的缓冲区,用于临时保存消息。
功能:
- 消息最终会路由到队列,并由消费者从队列中消费。
- 队列可以绑定到多个 Exchange,并可根据路由规则接收不同的消息。
特点:
- 持久化:队列可以配置为持久化(即使 RabbitMQ 服务重启,消息也不会丢失)。
- 排队顺序:消息按照 FIFO(先进先出)的顺序进行消费。
Exchange(交换机)
定义:负责根据路由规则分发消息的组件。
功能:
- 接收 Publisher 发送的消息,并根据路由规则决定将消息发送到哪个 Queue。
- 不直接存储消息,消息总是路由到队列中。
2. Exchange 的类型
根据不同的消息路由方式,Exchange 有以下几种类型:
Direct(直连交换机):
- 根据完全匹配的路由键(Routing Key)将消息发送到指定的队列。
- 适用场景:精准匹配,例如订单状态更新。
Fanout(广播交换机):
- 将消息广播到所有绑定的队列,而不考虑路由键。
- 适用场景:日志广播、通知推送。
Topic(交换机):
- 根据通配符匹配路由键,将消息路由到符合条件的队列。
- 适用场景:动态路由,例如按照“日志级别.模块名”匹配日志消息。
3. 数据流向说明
Publisher -> Exchange:
- 消息发送者(Publisher)将消息发送到 RabbitMQ 的 Exchange(交换机)。
- 发送时需要指定 Routing Key,用于路由消息。
Exchange -> Queue:
- Exchange 根据绑定关系和路由规则,将消息分发到一个或多个队列(Queue)。
- 如果没有匹配的队列,消息可能会被丢弃或进入死信队列(DLQ,Dead Letter Queue)。
Queue -> Consumer:
- 消费者(Consumer)从队列中拉取消息并进行处理。
- 消费者可以是多个,每个消息只能被一个消费者消费(在同一队列中)。
如何安装RabbitQueue?
day06-MQ基础 - 飞书云文档 (feishu.cn)
查看以上文档的第二部分即可
WorkQueue(工作队列):

工作队列的核心理念
-
任务分发:
- 消息(任务)由一个生产者(Producer)发送到队列。
- 多个消费者(Consumer)从同一个队列中取出消息并处理。
-
负载均衡:
- 消息会按照一定规则分发给消费者,通常每个消费者会处理相同数量的任务(轮询机制)。
- 不同消费者可以根据其处理能力自行调整消费速率。可以通过配置的
prefetch来设置
-
解耦和异步:
- 生产者和消费者无需直接交互。生产者将任务发送到队列即可,消费者独立从队列中获取任务并处理。
Fanout交换机 :广播
通过 Fanout Exchange 可以实现消息的广播分发,将消息发送给所有绑定的队列。结合 Spring 提供的 RabbitTemplate 工具,可以方便地向交换机发送消息,极大简化了开发流程。这种模式非常适用于日志收集、通知广播等场景。
发送消息到交换机的 API 示例
@Test
public void testFanoutExchange() {// 定义交换机的名称String exchangeName = "itcast.fanout";// 定义消息内容String message = "Hello, everyone!";// 发送消息到指定交换机// 参数解释:// - exchangeName:交换机名称// - routingKey:路由键(在 Fanout 交换机中会被忽略)// - message:发送的消息内容rabbitTemplate.convertAndSend(exchangeName, "", message);
}

Direct交换机
Direct 交换机会根据消息携带的 RoutingKey,将消息发送到与交换机绑定且 RoutingKey 完全匹配的队列。

| 特性 | 精确匹配分发消息 | 广播到所有绑定的队列 |
|---|---|---|
| RoutingKey 是否重要 | 必须匹配 | 不考虑,直接广播 |
| 绑定关系 | 每个队列可以绑定不同的 RoutingKey | 所有绑定的队列都会接收消息 |
| 适用场景 | 精确路由,如订单状态更新 | 广播通知,如日志、系统更新 |
Direct 交换机
场景:订单服务需要将不同类型的订单路由到对应的队列(如普通订单和优先订单)。
绑定关系:
- 队列
normal_orders绑定RoutingKey = normal。 - 队列
priority_orders绑定RoutingKey = priority。
消息发送:
- 消息
RoutingKey = normal,会被路由到normal_orders队列。 - 消息
RoutingKey = priority,会被路由到priority_orders队列。
生产者代码
生产者将消息发送到 Direct 交换机,并指定不同的 RoutingKey。
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;@Service
public class SimpleProducer {private final RabbitTemplate rabbitTemplate;public SimpleProducer(RabbitTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}public void sendMessage(String message) {// 直接发送消息到交换机rabbitTemplate.convertAndSend("simple_exchange", "simple_routing_key", message);System.out.println("Sent message: " + message);}
}
消费者代码
定义两个消费者,分别监听普通队列和优先队列。
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;@Service
public class SimpleConsumer {// 监听队列,直接声明队列名称@RabbitListener(queues = "simple_queue")public void receiveMessage(String message) {System.out.println("Received message: " + message);}
}
Topic交换机
opic Exchange 是 RabbitMQ 的一种交换机类型,它根据消息的路由键(RoutingKey)和绑定键(BindingKey)的模式匹配规则,将消息路由到一个或多个队列。它是 Direct Exchange 的增强版,支持模糊匹配和通配符。

具体匹配示例:
|
SpringAMQP
Spring AMQP 是 Spring 提供的一个用于与 AMQP(Advanced Message Queuing Protocol,高级消息队列协议) 通信的模块化框架。它为基于 Spring 的应用程序集成 AMQP 消息中间件(例如 RabbitMQ)提供了便捷的方法,简化了消息的发送、接收和处理。
1. maven依赖:
<!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
2. 配置服务端信息
spring:rabbitmq:host: 192.168.88.130 # 你的虚拟机IPport: 5672 # 端口virtual-host: /hmall # 虚拟主机username: hmall # 用户名password: 123 # 密码listener:simple:prefetch: 1 # 控制消费者预取的消息数量,处理完一条再处理,如果希望RabbitMQ轮询访问可以不设置这个

什么是 prefetch?
prefetch(预取数量) 是 RabbitMQ 的一个设置,用于控制消息消费者(Consumer)每次从队列中预取消息的数量。
它定义了在消费者确认(ACK)之前,RabbitMQ 可以向消费者发送的未确认消息的最大数量。
场景:
假如 prefetch 设置为 1,RabbitMQ 会向消费者一次发送 1 条消息,只有这条消息被确认后,才会发送下一条消息。
如果设置为一个较大的数字(例如 10),RabbitMQ 会一次性发送多条消息,消费者可以并行处理这些消息。
为什么需要设置 prefetch?
在多个消费者监听同一个队列的场景下,prefetch 设置为 1,可以确保消息在消费者之间更均匀地分布。
防止某些消费者处理速度慢但仍然接收大量消息,导致处理延迟。
简单示例
发送消息
@Autowired
private RabbitTemplate rabbitTemplate;public void sendMessage(String message) {rabbitTemplate.convertAndSend("exchange_name", "routing_key", message);
}
接收消息
@RabbitListener(queues = "queue_name")
public void receiveMessage(String message) {System.out.println("Received: " + message);
}
注解式声明队列和交换机
@RabbitListener:
用于监听队列,当队列接收到消息时,触发对应方法处理消息。
@QueueBinding:
声明队列与交换机的绑定关系。
- 包含:
@Queue:声明队列名称和属性。
- @Exchange:声明交换机名称、类型和属性。
- key:指定绑定时使用的路由键。
@RabbitListener(bindings = @QueueBinding(value =@Queue(name="direct.queue1",durable = "true"),exchange = @Exchange(name="hmall.direct",type = ExchangeTypes.DIRECT),key = {"red","blue"}))public void listenDirectQueue(String message) throws InterruptedException {System.err.println("消费者1.....................接收到消息"+ message+","+ LocalTime.now());}
消息转换器
在 RabbitMQ 中,消息默认是以字节数组的形式在队列中传输的。如果我们希望以更方便的方式传递和处理对象(如 JSON、XML 或 Java 对象),就需要使用 消息转换器(Message Converter) 来完成消息的序列化与反序列化。
消息转换器主要负责:
- 序列化:将 Java 对象转换为消息格式(如 JSON、XML 或字节数组)发送到 RabbitMQ。
- 反序列化:将从 RabbitMQ 接收到的消息转换为 Java 对象,供消费者处理。
| 转换器 | 功能 |
|---|---|
| SimpleMessageConverter | 默认的消息转换器,支持简单类型(如 String、byte[] 和 Serializable 对象)。 |
| Jackson2JsonMessageConverter | 使用 Jackson 将 Java 对象转换为 JSON 格式,或将 JSON 消息转换为 Java 对象。 |
| Jaxb2MarshallerMessageConverter | 使用 JAXB 将 Java 对象转换为 XML 格式,或将 XML 消息转换为 Java 对象。 |
| ContentTypeDelegatingMessageConverter | 根据消息的 content_type 动态选择合适的消息转换器。 |

导入依赖:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
记得要给生产者和消费者都需要设置消息转换器。
@Beanpublic MessageConverter messageCoverter(){return new Jackson2JsonMessageConverter();}
- JSON 格式:需要配置
Jackson2JsonMessageConverter。 - XML 格式:需要配置
Jaxb2MarshallerMessageConverter。 - 字符串/字节数组:不需要额外配置,默认的
SimpleMessageConverter即可。
总结如何在IDEA当中使用RabbitMQ
开始之前请确定RabbitMQ正在运行哦!!
引入依赖
<!--AMQP依赖,包含RabbitMQ-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置消息转换器Config
@Configuration
@ConditionalOnClass(RabbitTemplate.class) //该注解表示,只有在当前的类路径(classpath)中存在 RabbitTemplate 类时,注解标注的配置类或 Bean 才会生效。
public class MqConfig {/*** 序列化存储JSON字符串* @return*/@Beanpublic MessageConverter messageCoverter(){Jackson2JsonMessageConverter jjmc = new Jackson2JsonMessageConverter();
// jjmc.setCreateMessageIds(true);// 设置消息转换器在创建消息时是否附加唯一的消息 ID。//true 表示会生成消息 ID,便于跟踪和调试消息。return jjmc;}
}
配置yaml
spring:rabbitmq:host: 192.168.150.101 # 你的虚拟机IPport: 5672 # 端口virtual-host: /hmall # 虚拟主机username: hmall # 用户名password: 123 # 密码
之后就可以再需要MQ的地方注入MQ并且实现消费者和生产者的代码了
相关文章:
RabbitMQ基础(简单易懂)
RabbitMQ高级篇请看: RabbitMQ高级篇-CSDN博客 目录 什么是RabbitMQ? MQ 的核心概念 1. RabbitMQ 的核心组件 2. Exchange 的类型 3. 数据流向说明 如何安装RabbitQueue? WorkQueue(工作队列): Fa…...
DNS解析域名简记
域名通常是由: 权威域名.顶级域名.根域名组成的。 从左往右,级别依次升高,这和外国人从小范围到大范围的说话习惯相关。(我们自己是更习惯先说大范围再说小范围,如XX省XX市XX区XX路) DNS解析域名时,会先查…...
【2024年华为OD机试】(B卷,100分)- 求最小步数 (Java JS PythonC/C++)
一、问题描述 题目描述 求从坐标零点到坐标点 n 的最小步数,一次只能沿横坐标轴向左或向右移动 2 或 3。 注意:途径的坐标点可以为负数。 输入描述 坐标点 n 输出描述 输出从坐标零点移动到坐标点 n 的最小步数。 备注 1 < n < 10^9 用例…...
<C++> XlsxWriter写EXCEL
XlsxWriter XlsxWriter是一个用于创建和写入Excel 2007及以上版本(.xlsx文件格式)的C库。以下是对XlsxWriter的详细介绍: 主要功能 文本、数字和公式写入:可以向多个工作表中写入文本、数字和公式。格式设置:支持丰…...
接上一主题,实现QtByteArray任意进制字符串转为十进制数
函数: /// <summary>/// n进制字符串转为十进制数,snDefine的长度最小为二进制数。/// 例子:/// _pn(_Math::strNToInt(_t("1010"), _t("01")));/// _pn(_Math::strNToInt(_t("-1010"), _t("0123…...
CNN-GRU-MATT加入贝叶斯超参数优化,多输入单输出回归模型
CNN-GRU-MATT加入贝叶斯超参数优化,多输入单输出回归模型 目录 CNN-GRU-MATT加入贝叶斯超参数优化,多输入单输出回归模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现贝叶斯优化CNN-GRU融合多头注意力机制多变量回归预测ÿ…...
Java 如何传参xml调用接口获取数据
传参和返参的效果图如下: 传参: 返参: 代码实现: 1、最外层类 /*** 外层DATA类*/ XmlRootElement(name "DATA") public class PointsXmlData {private int rltFlag;private int failType;private String failMemo;p…...
uniapp 之 uni-forms校验提示【提交的字段[‘xxx‘]在数据库中并不存在】解决方案
目录 场景问题代码结果问题剖析解决方案 场景 uni-forms官方组件地址 使用uniapp官方提供的组件,某个表单需求,单位性质字段如果是高校,那么工作单位则是高校的下拉选择格式,单位性质如果是其他的类型,工作单位则是手动…...
excel VBA 基础教程
这里写目录标题 快捷键选择所有有内容的地方 调试VBA录制宏,打开VBA开发工具录制宏,相当于excel自动写代码(两个表格内容完全一致才可以) 查看宏代码保持含有宏程序的文件xlsm后缀(注意很容易有病毒)宏文件安全设置 使…...
基于异步IO的io_uring
基于异步IO的io_uring 1. io_uring的实现原理 io_uring使用了一种异步IO机制,它通过一对环形缓冲区(ring buffer)实现用户态于内核态之间的高效通信,用户只需将IO请求放入提交队列,当内核完成IO请求时,会将结果放入完成队列&…...
【江协STM32】10-2/3 MPU6050简介、软件I2C读写MPU6050
1. MPU6050简介 MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景3轴加速度计(Accelerometerÿ…...
仓颉笔记——写一个简易的web服务并用浏览器打开
创建一个web服务端,同时创建一个客户端去读取这个服务端。 也满足浏览器打开web的需求。 直接上代码。 import net.http.* import std.time.* import std.sync.* import std.log.LogLevel// 1. 构建 Server 实例 let server ServerBuilder().addr("127.0.0.1&…...
DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决
01 问题复现 在DolphinScheduler中有如下一个Shell任务: current_timestamp() { date "%Y-%m-%d %H:%M:%S" }TIMESTAMP$(current_timestamp) echo $TIMESTAMP sleep 60 在DolphinScheduler将工作流执行策略设置为并行: 定时周期调度设置…...
ecmascript 标准+ 严格模式与常规模式 + flat-flatMap 应用
文章目录 ecmascript 历程严格模式与常规模式下的区别及注意事项严格模式下的属性删除Array.prototype.flat()和Array.prototype.flatMap() 实例应用 ecmascript 历程 变量声明要求 常规模式: 在常规模式下,使用var关键字声明变量时会出现变量提升现象。…...
基于ILI9341液晶屏+STM32U5单片的显示试验
试验要求: 1、通过串口,下发两个命令 STR和PIC; 2、STR模式: (1)串口输入什么,屏幕上显示什么 (2)如果屏幕满,自动下滚 (3)输入回车&a…...
最短路径算法
关注:算法思路,时间复杂度,适用情况(单源/多源,负边权/负边权回路) 复习弗雷德算法--基于动态规划--多源--负边权--时间复杂度O(v^3) int的最大值是0x7fffffff #include <iostream> using namesp…...
如何用 ESP32-CAM 做一个实时视频流服务器
文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用?GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…...
Centos7 解决Maven scope=system依赖jar包没有打包到启动jar包中的问题(OpenCV-4.10)
最近项目中遇到问题,OpenCV的Jar包在程序打包后,找不到相关的类,比如MAT,这个时候怀疑OpenCV_4.10的Jar没有和应用程序一起打包,后面排查到确实是没有打包进去,特此记录,便于日后查阅。 <!-- 加载lib目录下的opencv包 --> <dependency><groupId>org…...
iOS实际开发中使用Alamofire实现多文件上传(以个人相册为例)
引言 在移动应用中,图片上传是一个常见的功能,尤其是在个人中心或社交平台场景中,用户经常需要上传图片到服务器,用以展示个人风采或记录美好瞬间。然而,实现多图片上传的过程中,如何设计高效的上传逻辑并…...
如何将分割的mask转为为分割标签
将分割的mask转换为分割标签通常涉及将每个像素的类别标识(在mask中以不同的灰度值或颜色表示)转换为整数标签。这些标签通常用于机器学习或深度学习模型的训练、验证和测试阶段。 使用方式,控制台或者命令行使用以下命令: pyth…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...


