RabbitMQ系列之交换机的使用

 🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《RabbitMQ系列之交换机的使用》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁

目录

前言

一、交换机的简介

1. 什么是交换机

2. 交换机的作用

3. 交换机的应用场景

 4. 图解说明

 5.交换机属性

二、 交换机类型讲解

1. 直连交换机(Direct exchange)

1.1 基本概述

1.2 特点

1.3 缺点

2. 主题交换机(Topic exchange)

2.1 基本概述

 2.2 特点

 2.3 应用场景

3. 扇形交换机(Fanout exchange)

3.1 基本概述

 3.2 特点

 3.3 应用场景

4.  首部交换机(Headers exchange)

4.1 基本概述

4.2 特点

4.3 应用场景

5. 默认交换机 

5.1 基本概述

6. 死信交换机 

6.1 基本概述

6.2 图解说明 

6.3 案例图解

​编辑

三 、实战演示

1. 直连交换机

生产者

1.1 创建直连交换机

1.2 绑定队列及交换机的关系

1.3 编写对应的请求方法

消费者

 ReceiverQ1.java

ReceiverQ2.java

测试效果

2. 主题交换机

生产者

2.1 创建主题交换机

2.2  绑定队列及交换机的关系

2.3 编写对应的请求方法

测试

进入Q1 

进入Q2

 ​编辑

进入Q1、Q2

3.  扇形交换机

3.1 创建主题交换机

3.2  绑定队列及交换机的关系

3.3 编写对应的请求方法

 测试

总结


 

前言

        在上一期的RabbitMQ系列的博客分享中我们对其MQ的概念及使用的场景有了一个初步的认识以及了解,并介绍了几种常见的实现的方式,有RabbitMQ、ActiveMQ、 Amazon Simple Queue Service (SQS)等等。本期博客基于上期博客的代码基础进行讲解RabbitMQ中的交换机的使用。

一、交换机的简介

1. 什么是交换机

        在RabbitMQ中,交换机是一个核心概念,它决定了消息在RabbitMQ中的路由策略,也即决定了消息最终到达哪个队列。交换机是用来发送消息的AMQP实体,它拿到一个消息之后将它路由给一个或多个队列。交换机根据其类型和绑定的规则来决定使用哪种路由算法。

2. 交换机的作用

         交换机在RabbitMQ中扮演着重要的角色,它的作用是:生产者发送消息不会像传统方式直接将消息投递到队列中,而是先将消息投递到交换机中,再由交换机转发到具体的队列,队列再将消息以推送或者拉取方式给消费者进行消费。这样可以根据具体的路由策略将消息分发到不同的队列中。(交换机的功能可以通俗地理解为“邮局”,负责传递信息,它通过对信息进行重新生成,并经过内部处理后转发至指定端口,具备自动寻址能力和交换作用。)

        交换机具有以下作用:

  1. 连接设备:交换机负责连接网络设备和终端设备,如交换机、路由器、防火墙、无线AP、计算机、服务器、摄像头、网络打印机等,实现所有设备之间的通信。
  2. 构建局域网络:交换机可以构建局域网络,通过与其他网络设备的互联,如无线接入点、路由器、网络防火墙等,实现局域网与局域网的互联以及局域网与Internet的互联。
  3. 扩展网络范围:交换机可以最大限度地扩展网络的范围,提供不同的网络技术来改善传输的距离,特别是对于传输距离非常远的网络来说非常有用。
  4. 实现端口之间的密切联系:以太网交换机可以让端口之间直接产生密切联系,特别是对于网络需求特别大的企业来说,可以同时提供多个端口,满足多数人的网络需要。

3. 交换机的应用场景

         这里就以RabbitMQ的交换机为例说一说交换机的一些应用场景有哪些,如下所示。

RabbitMQ的交换机一般的应用场景
应用场景说明
异步处理如果改为了MQ方式,就可以进行异步处理,且短信涉及到的网络情况时间还长,与第三方交互也会有些情况,改用MQ异步处理,就可以支持更多的并发,也可以根据业务的量进行随时扩容。
发布订阅模式发布订阅是作为生产者产生的一个消息,他的消费者都可以收到此条消息。在这种模式下,交换机可以将收到的消息发给多套副本队列,消费者如果订阅了这个队列的话,就可以收到生产者的消息了。这种模式中,所有消费者拿到的消息是完全相同的。

 4. 图解说明

        在RabbitMQ中,生产者发送消息不会直接价格消息投递给队列中,而是先将消息投递给交换机中,在由交换机转发到具体的队列,队列再将消息以推送或者拉去的方式给消费者进行消费。

        其中包含两个关键组件:

路由键:生产者将消息发送给交换机的时候,会指定RoutingKey指定路由的规则。

绑定键:通过绑定键将交换机与队列关联起来,这样RabbitMQ就知道如何正确地将消息路由到队列。

 5.交换机属性

交换机属性说明
属性说明
Type 交换机类型(direct、topic、fanout、headers)
Durability是否需要持久化,如果持久化,则RabbitMQ重启后,交换机还存在。
Auto Delete当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange
Internal当前Exchange是否用于RabbitMQ内部使用,默认false
Argument扩展参数,用于扩展AMQP协议定制化使用

二、 交换机类型讲解

1. 直连交换机(Direct exchange)

1.1 基本概述

        直连交换机的路由算法非常简单:将消息推送到binding key与该消息的routing key相同的队列。

 图解

        像上图所示,我们直连交换机的绑定了两个队列。第一个队列绑定了orange,第二个队列绑定了两个绑定键:black和green。在这种场景下,一个消息在发布消息时指定了orange将只能被队列Q1接收, 在发布消息时指定了black和green将只能被队列Q2接收, 其他消息将丢失。

        同一个绑定键可以绑定到不同的队列上去,可以增加一个交换机X与队列Q2的绑定键,在这种情况下,直连交换机和广播交换机有着相同的行为,将消息推送到所有的匹配队列上。(如下图)

1.2 特点

直连交换机是交换机的一种类型,它的特点主要包括以下几点

直连交换机的特点
特点说明
公平调度当接收端订阅者有多个时,直连交换机能够轮询公平地分发消息给每个订阅者。
消息的发后既忘特性直连交换机中,接收者不知道消息的来源,如果想要指定消息的发送者,需要在发送内容中包含相关信息。
消息确认直连交换机要求接收者在接收到消息后使用特定的方法(如channel.basicAck())进行手动确认。如果接收者未进行确认,消息的状态将从“Ready”变为“Unacked”,直到确认或断开连接后才会改变状态。
消息拒绝在未确认之前,接收者可以选择拒绝接收消息,例如通过断开与交换机的连接或使用特定的方法拒绝消息。
内部交换矩阵和高带宽直连交换机具有高带宽的内部交换矩阵和背部总线,可以迅速而直接地将数据包传输到目标节点,避免了不必要的网络资源浪费,提高了效率。
独立网段和固定带宽在同一个时间段内,直连交换机可以将数据传输到多个节点之间,每个节点都可以作为独立网段而独自享有固定的部分带宽,避免了与其他设备的竞争。
工作于数据链路层直连交换机主要工作在OSI模型的物理层和数据链路层,不依赖于三层地址和路由信息。
绑定多个Routing Key如果希望一条消息发送到多个队列,直连交换机需要绑定大量的Routing Key。

1.3 缺点

直连交换机的缺点主要包括以下几点:

  1. 安全性差:使用一个交换机会使不同网段的设备处于同一广播域内,容易受到攻击和干扰。
  2. 扩展性有限:直连交换机的网络规模和节点数量有限,无法满足大规模网络的需求。
  3. 维护和管理困难:由于直连交换机需要手动配置和管理,对于大规模的网络来说,管理和维护成本较高。
  4. 带宽和资源利用率低:直连交换机无法实现动态带宽分配和负载均衡,容易造成资源浪费和带宽瓶颈。
  5. 无法支持大规模并发连接:直连交换机的并发连接数有限,无法满足大规模并发的需求。

2. 主题交换机(Topic exchange)

2.1 基本概述

         主题交换机(Topic Exchange)是一种消息队列的交换机类型,它通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。主题交换机经常用来实现各种发布/订阅模式及其变种,通常用来实现消息的多播路由。

 

实例模拟
发送消息绑定的routing key接受消息的队列 queue
quick.orange.rabbitQ1,Q2
lazy.orange.elephantQ1,Q2
quick.orange.foxQ1
lazy.brown.foxQ2
lazy.pink.rabbitQ2
quick.brown.fox没有队列接收

 2.2 特点

主题交换机的特点是:

主题交换机的特点
特点说明
模糊匹配主题交换机支持模糊匹配,可以使用星号(*)和井号(#)作为通配符进行匹配。其中,* 可以代替一个单词,# 可以代替任意个单词。
队列绑定主题交换机通过队列绑定来实现消息的路由,可以将一个或多个队列绑定到交换机上,并根据匹配规则将消息路由到相应的队列中。
多播路由主题交换机可以实现消息的多播路由,即将一条消息发送给多个队列,满足发布/订阅模式的需求。

 2.3 应用场景

主题交换机的应用场景包括:

  1. 发布/订阅模式:主题交换机适用于实现发布/订阅模式及其变种,例如在新闻网站、博客平台等场景中,发布者发布一条消息后,订阅者可以接收到该消息。
  2. 消息分发:主题交换机可以将一条消息同时发送给多个队列,实现消息的分发和多播路由,适用于需要将消息同时发送给多个消费者的场景,例如日志收集、监控系统等。
  3. 异步处理:主题交换机可以将消息异步地发送给消费者处理,提高系统的并发性能和吞吐量,适用于需要进行大量异步处理的场景,例如在线游戏、社交网络等。

         需要注意的是,主题交换机在不同的消息队列系统中可能具有不同的实现方式和特点。在实际应用中,需要根据具体的需求和场景选择适合的消息队列系统和主题交换机类型。

3. 扇形交换机(Fanout exchange)

3.1 基本概述

        扇形交换机是最基本的交换机类型,它的作用是广播消息。扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要思考,所以扇形交换机处理消息的速度也是所有交换机类型里面最快的。

 3.2 特点

扇形交换机具有以下特点:

  1. 广播消息:扇形交换机能够将接收到的消息广播给所有绑定在其上的队列。
  2. 速度快:由于广播不需要“思考”,所以扇形交换机处理消息的速度非常快,是所有交换机类型中速度最快的。

 3.3 应用场景

扇形交换机通常用于以下应用场景:

  1. 大规模多用户在线(MMO)游戏:这种场景中,可能需要对排行榜更新等全局事件进行大规模广播,使用扇形交换机可以将消息广播给所有消费者,确保所有用户都能收到相同的消息。
  2. 体育新闻网站:体育新闻网站需要近乎实时地将比分更新分发给移动客户端。使用扇形交换机可以将比分更新广播给所有订阅的移动客户端,确保所有用户都能接收到最新的比分信息。
  3. 分发系统:在分发系统,如群聊中,扇形交换机被用来分发消息给参与群聊的用户。

4.  首部交换机(Headers exchange)

4.1 基本概述

        首部交换机是一种特殊的交换机类型,它不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。在绑定队列和交换器时,可以制定一组键值对。当发送消息到交换器时,RabbitMQ会获取到该消息的headers(也是一个键值对的形式),并对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对。如果完全匹配,则消息会路由到该队列,否则不会路由到该队列。

4.2 特点

首部交换机的特点主要包括以下几点:

  1. 基于headers属性匹配:首部交换机根据发送的消息内容中的headers属性进行匹配,而不是依赖于路由键的匹配规则。
  2. 性能较差:由于需要对比消息的headers属性与队列和交换器绑定时指定的键值对,因此首部交换机的性能会比较差,且不实用。
  3. 无法看到实际应用:在实际应用中,很少看到首部交换机的存在。

4.3 应用场景

         首部交换机的应用场景较少,主要是用于某些特殊场景,例如企业网络、商务大厦网络、酒店宽带网络等。在这些场景中,可能需要实现数据的传输和交换,并且需要支持带宽控制、流量管理、VLAN等功能。但是,由于首部交换机的性能较差,且不实用,因此在实际应用中并不常见。

5. 默认交换机 

5.1 基本概述

        默认交换机(default exchange)实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换机(direct exchange)。它有一个特殊的属性使得它对于简单应用特别有用处,那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。

        举个例子,当你声明了一个名为"search-indexing-online"的队列,AMQP代理会自动将其绑定到默认交换机上,绑定(binding)的路由键名称也是为"search-indexing-online"。换句话说,默认交换机看起来貌似能够直接将消息投递给队列,尽管技术上并没有做相关的操作。

6. 死信交换机 

6.1 基本概述

        死信交换机是一种特殊的交换机,用于接收和路由成为死信的消息。当消息成为死信后,会被发送到死信交换机,并通过该交换机的路由规则,将消息路由到指定的死信队列中进行处理。

当队列中的消息满足以下情况之一时,可以成为死信:

  1. 消费者使用basic.reject或basic.nack声明消费失败,并且消息的requeue参数设置成了false。
  2. 消息是一个过期消息,超时无人消费。
  3. 要投递的队列消息满了,最新进来的消息变成死信。

        如果这个包含死信的队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到交换机中,而这个交换机就被称为死信交换机(Dead Letter Exchange)。

        死信交换机可以用于收集所有消费者处理失败的消息(死信),交由人工处理,进一步提高消息队列的可靠性

6.2 图解说明 

6.3 案例图解

三 、实战演示

        我们先创建两个队列用于我们实现对应的效果演示。

  @Bean
//                声明第一个队列  。
        public Queue queue01(){
            return new Queue("queue01");
        }
        @Bean
//        声明第二个队列
        public Queue queue02(){
        return new Queue("queue02");
    }

1. 直连交换机

生产者

1.1 创建直连交换机
//    创建直连交换机
    @Bean
//    创建交换机
    public DirectExchange directExchange(){
    return new DirectExchange("exchange01");
    }

1.2 绑定队列及交换机的关系
  @Bean
//    绑定队列和交换机
    public Binding binding01(){
    return BindingBuilder
            .bind(queue01())
            .to(directExchange())
            .with("yx");
    }

    @Bean
//    绑定队列和交换机
    public Binding binding02(){
        return BindingBuilder
                .bind(queue02())
                .to(directExchange())
                .with("zxy");
    }

1.3 编写对应的请求方法

        我们在controller类中编写对应的请求方法

 @RequestMapping("/send3")
    public String send3() {
//    向交换机发送消息
        amqpTemplate.convertAndSend("directExchange","yx","木易");
        return "木易";
    }

    @RequestMapping("/send4")
    public String send4() {
//    向交换机发送消息
        amqpTemplate.convertAndSend("directExchange","zxy","馨月");
        return "木易";
    }

消费者

        我们在消费者这边编写独有的代码进行接受生成者发送的请求信息。

 ReceiverQ1.java
package com.yx.consumer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue01") //接收的队列
public class ReceiverQ1 {
@RabbitHandler
public void process(String msg) {
log.warn("queue01接收到:" + msg);
}
}
ReceiverQ2.java
package com.yx.consumer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue02") //接收的队列
public class ReceiverQ2 {
@RabbitHandler
public void process(String msg) {
log.warn("queue02接收到:" + msg);
}
}

测试效果

        我们在测试之前要先说名,我们应该先启动我们的生产者并且访问我们的请求方法使其RabbitMQ管理器生成对应的队列或者前往官网管理器手动添加对应的队列,否则我们启动消费者或者启动消费者,消费者的服务端控制台回报错。

        因此我们先启动生成者访问对应的接口方法生成对应的队列。 

        我们启动消费者服务进行接受信息 

2. 主题交换机

// 规则 :

// *.*.yx->Q1

// *.*.zxy->Q2

// mq.# --Q1,Q2

生产者

2.1 创建主题交换机
//  创建主题交换机
    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("topicExchange");
    }

2.2  绑定队列及交换机的关系
//    绑定主题交换机  queue01
    @Bean
    public Binding binding03(){
    return BindingBuilder
            .bind(queue01())
            .to(topicExchange())
            .with("*.*.yx");
    }

//    绑定主题交换机  queue02
    @Bean
    public Binding binding04(){
        return BindingBuilder
                .bind(queue01())
                .to(topicExchange())
                .with("*.*.zxy");
    }

//    绑定主题交换机 queue01和queue02
    @Bean
    public Binding binding05(){
        return BindingBuilder
                .bind(queue01())
                .to(topicExchange())
                .with("mq.#");
    }
    @Bean
    public Binding binding06(){
        return BindingBuilder
                .bind(queue02())
                .to(topicExchange())
                .with("mq.#");
    }

2.3 编写对应的请求方法

        我们在controller类中编写对应的请求方法,我们使用参数的大大提高我们的测试灵活度

 @RequestMapping("/send5")
    public String send5(String rex) {
//    向交换机发送消息
        amqpTemplate.convertAndSend("topicExchange",rex,"木易与馨月");
        return "木易与馨月";
    }

         我们消费者因为在测试直连交换机是已经配置好了队列,因此不用重复设置直接测试。

测试

         我们重新启动我们的生产者不用重新启动消费者,我们测试对应的接口方法。

进入Q1 

 

进入Q2
 

进入Q1、Q2

3.  扇形交换机

3.1 创建主题交换机

//        创建fanout交换机
    @Bean
    public FanoutExchange fanoutExchange(){
    return new FanoutExchange("fanoutExchange");
    }

3.2  绑定队列及交换机的关系
//   绑定队列与交换机的关系
    @Bean
    public Binding binding07(){
        return BindingBuilder
                .bind(queue01())
                .to(fanoutExchange());
    }
    @Bean
    public Binding binding08(){
        return BindingBuilder
                .bind(queue02())
                .to(fanoutExchange());
    }

3.3 编写对应的请求方法

        我们在controller类中写对应的w请求方法。

 @RequestMapping("/send6")
    public String send6() {
//    向交换机发送消息
        amqpTemplate.convertAndSend("fanoutExchange","","木易Love馨月");
        return "木易Love馨月";
    }

 测试

        我们重新启动我们的生产者,在我们的网页上去访问对应的接口方法。

总结

         我们今天的这期的博客分享中我们学习到了一些有关交换机的类型及其他们的基础使用,不同的交换机类型各自有着不同的特点及优点对应的应用场景也不同,我们在项目根据自身的需求情况采用对应的类型进行使用从此到达效果。我们下期博客主讲如何使用我们的死信交换机。


🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路 !🎁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大白话解析LevelDB 3: SST Compaction

SST Compaction SST Compaction 什么是Compact SST什么时候触发Compact SST 第一处 读取 Key 的时候第二处 使用迭代器遍历数据库时第三处 写入 Key 时第四处 刚打开数据库时 如何进行Compact SST 计算Compaction范围进行Compaction 创建一个迭代器用于读取Compaction范围内的…

【linux】Debian挂起和休眠

一、挂起和休眠 在Debian桌面系统中,挂起和休眠是两种不同的状态,它们之间有一些区别。 挂起(Suspend)是将当前系统的状态保存到RAM(内存)中,然后关闭所有硬件设备,除了RAM之外。在…

(2)(2.4) CRSF/ELRS Telemetry

文章目录 前言 1 ArduPilot 参数编辑器 前言 !Note ELRS(ExpressLRS)遥控系统使用穿越火线协议,连接方式类似。不过,它不像穿越火线那样提供双向遥测。 TBS CRSF 接收机与 ArduPilot 的接口中包含遥测和遥控信息。…

输入单词需要的最少按键次数 I

题目链接 输入单词需要的最少按键次数 I 题目描述 注意点 1 < word.length < 26word 仅由小写英文字母组成word 中的所有字母互不相同 解答思路 因为word 中的所有字母互不相同&#xff0c;可以以任意8个字符为一组&#xff0c;第一组每个字符需要按键一次&#xff…

服务器的异步通信——RabbitMQ

目录 一、同步通信 VS 异步通信 二、MQ——消息队列 RabbitMQ RabbitMQ安装 RabbitMQ的整体架构 常见消息模型 基本消息队列&#xff08;BasicQueue&#xff09; 工作消息队列&#xff08;WorkQueue&#xff09; 发布、订阅&#xff08;Publish、Subscribe&#xff0…

C#,生成图片的指定尺寸缩略图的源代码

编程的时候经常用到图像的缩略图。 本文发布一个用于生成指定尺寸的缩略图的简单方法。 1 文本格式 private void button1_Click(object sender, EventArgs e) { CreateThumbnail("demo.jpg", "demo_thumb.jpg", 128, 128); } private void CreateTh…

基于QEMU的vexpress-a9的初始化代码运行(一)

这个part是想详细走读一下用qemu运行kernel的最初始代码&#xff0c;也就是使用qemu运行kernel代码的详细逻辑&#xff0c;从qemu加载根目录下vmlinux镜像的逻辑&#xff0c;也就是运行arch/arm/kernel/head.S的整个过程&#xff0c;直到跳转到start_kernel&#xff0c;使用的k…

IT大侦“碳”:Concept Luna向循环设计持续演进

今天聊点轻松的话题。上个月&#xff0c;小编用来吃饭的家伙开始闹罢工&#xff0c;笔记本的触控和键盘突然没了反应&#xff0c;电脑虽然还能打开&#xff0c;但嗡嗡直叫的风扇让我意识到这件事并不简单。 你问我为什么电脑会出问题&#xff1f;好吧&#xff0c;那我得先搞清楚…

领势 跨越|美创科技数据安全管理平台2023年度回顾

领势 跨越 数据安全管理平台的2023 以数字化安全平台为基础的数据安全体系是未来安全建设的重要方向。 研究咨询机构IDC指出&#xff1a;未来&#xff0c;数据安全基础设施管理平台将逐步发展成为各组织数据安全建设的基础设施。 Gartner《中国数据安全治理解析》预测&…

141:vue+leaflet 利用高德逆地理编码,点击地图标记marker,popup地址信息

第141个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中利用高德逆地理编码,点击地图标记marker,popup地址信息 。主要利用高德地图的api将坐标转化为地址,然后在点击的位置,弹出弹窗,在里面显示出地址信息。 直接复制下面的 vue+leaflet源代码,操作2分钟…

cad二次开发autolisp(二)

目录 一、选择集1.1 选择集的创建1.2 选择集的编辑1.3 操作选择集 二、命令行设置对话框2.1 设置图层2.2 加载线型2.3 设置字体样式2.4 设置标注样式&#xff08;了解即可&#xff09; 三、符号表3.1 简介3.2 符号表查找3.2 符号表删改增 一、选择集 定义&#xff1a;批量选择…

【数据结构与算法】4.自主实现单链表的增删查改

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

在SpringBoot中基于CanvasLabel的地震基础信息展示实践

目录 前言 一、数据库设计 1、数据库设计 2、sql脚本 3、数据记录 二、SpringBoot后台设计与实现 1、Mapper访问层及实体定义 2、Service层实现 3、控制层实现 三、地震信息展示 1、展示数据接入 2、最终效果 总结 前言 在上一篇博客中&#xff0c;对于在Leafle…

直播录屏工具哪家强?让你的直播更精彩!

随着网络技术的不断发展&#xff0c;直播行业逐渐兴起。无论是游戏直播、教育直播还是娱乐直播&#xff0c;人们都希望能够记录这些精彩瞬间。因此&#xff0c;一款好用的直播录屏工具显得尤为重要。本文将详细介绍两款流行的直播录屏工具&#xff0c;通过这些工具&#xff0c;…

亚马逊、eBay、TikTok等平台的综合运营实用工具分享!

亚马逊、eBay等电商平台为卖家提供了广阔的销售机会&#xff0c;但同时也带来了运营管理的挑战。为了提高运营效率和销售业绩&#xff0c;卖家需要借助一些实用工具。本文将介绍一些在亚马逊、eBay等平台上综合运营中非常有用的工具&#xff0c;帮助卖家更高效地管理店铺&#…

flutter底层架构初探

本文出处&#xff1a;​​​​​​​​​​​​​Flutter 中文开发者网站 架构 embedder嵌入层 提供程序入口&#xff08;其他原生应用也采用此方式&#xff09;&#xff0c;程序由此和底层操作系统协调&#xff08;surface渲染、辅助功能和输入服务&#xff0c;管理事件循环…

HTTP3/QUIC 性能测试与配套组件

背景 最近一年很多关于QUIC的文章层出&#xff0c;但是发现一个问题&#xff0c;这些文章都是在介绍QUIC或HTTP3是怎样的一个东西&#xff0c;以及它的优点和机制&#xff0c;将它夸的近乎上天了。然而有心的人估计会亲手做一些测试&#xff0c;就会发现这个被捧上天的东西性能…

如何预防服务器IP被劫持,危害有什么?

服务器IP被劫持是一种严重的网络安全问题&#xff0c;攻击者通过篡改服务器的IP地址&#xff0c;将网络流量重定向到恶意服务器或网站&#xff0c;导致用户无法正常访问目标服务器&#xff0c;并可能面临数据泄露、恶意软件感染等安全风险。了解服务器IP被劫持的危害和预防措施…

探案录 | 细说与人大金仓有关的“神秘数字”

近日&#xff0c;福尔摩斯•K发现&#xff0c;涉及医疗数字化的相关新闻都被人撕毁了&#xff0c;只留下日期和一串神秘数字&#xff1a;301、700、3000、3700……这背后隐瞒了什么呢&#xff1f;快跟着大侦探去揭开真相吧。 News&#xff1a;11月16日 全国首例&#xff0c;301…

上位机图像处理和嵌入式模块部署(自定义算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们在使用opencv的时候&#xff0c;虽然大部分算法都不需要我们自己重头开始编写&#xff0c;但是总有一些关于我们自己产品的know-how&#xff0…