【Rust光年纪】深度解读:Rust语言中各类消息队列客户端库详细对比

选择最佳 Rust 消息队列客户端库:全面对比与分析

前言

随着现代应用程序的复杂性不断增加,消息队列成为构建可靠、高性能系统的重要组件。本文将介绍一些用于Rust语言的消息队列客户端库,包括AMQP、Apache Kafka、NSQ、Apache Pulsar和RocketMQ,探讨它们的核心功能、使用场景、安装配置以及API概览。

欢迎订阅专栏:Rust光年纪

文章目录

  • 选择最佳 Rust 消息队列客户端库:全面对比与分析
    • 前言
    • 1. lapin:一个AMQP的客户端库
      • 1.1 简介
        • 1.1.1 核心功能
        • 1.1.2 使用场景
      • 1.2 安装与配置
        • 1.2.1 安装方法
        • 1.2.2 基本设置
      • 1.3 API 概览
        • 1.3.1 连接管理
        • 1.3.2 消息传递
    • 2. kafka-rust:一个Apache Kafka的客户端库
      • 2.1 简介
        • 2.1.1 核心功能
        • 2.1.2 使用场景
      • 2.2 安装与配置
        • 2.2.1 安装指导
        • 2.2.2 基本配置
      • 2.3 API 概览
        • 2.3.1 生产者和消费者
        • 2.3.2 Topic管理
    • 3. rdkafka:一个用于Rust语言的Apache Kafka客户端
      • 3.1 简介
        • 3.1.1 核心功能
        • 3.1.2 使用场景
      • 3.2 安装与配置
        • 3.2.1 安装指南
        • 3.2.2 基本配置
      • 3.3 API 概览
        • 3.3.1 消费者组管理
        • 3.3.2 高级特性实现
    • 4. nsq-rs:一个用于Rust语言的NSQ消息队列客户端
      • 4.1 简介
        • 4.1.1 核心功能
        • 4.1.2 使用场景
      • 4.2 安装与配置
        • 4.2.1 安装指南
        • 4.2.2 基本配置
      • 4.3 API 概览
        • 4.3.1 生产者与消费者
        • 4.3.2 主题与通道管理
    • 5. pulsar-rs:一个用于Rust语言的Apache Pulsar客户端
      • 5.1 简介
        • 5.1.1 核心功能
        • 5.1.2 使用场景
      • 5.2 安装与配置
        • 5.2.1 安装指南
        • 5.2.2 基本配置
      • 5.3 API 概览
        • 5.3.1 Producer与Consumer
        • 5.3.2 Topic管理
    • 6. rocketmq-rust:一个用于Rust语言的RocketMQ客户端
      • 6.1 简介
        • 6.1.1 核心功能
        • 6.1.2 使用场景
      • 6.2 安装与配置
        • 6.2.1 安装指南
        • 6.2.2 基本配置
      • 6.3 API 概览
        • 6.3.1 发布与订阅
        • 6.3.2 队列管理
    • 总结

1. lapin:一个AMQP的客户端库

lapin是一个用于AMQP(高级消息队列协议)的Rust语言客户端库,它提供了连接管理、消息传递等功能,可以帮助用户轻松地与AMQP消息队列进行交互。

1.1 简介

lapin库提供了以下核心功能:

1.1.1 核心功能
  • 连接管理:lapin允许用户轻松地建立和管理与AMQP服务器的连接。
  • 消息传递:用户可以使用lapin库发送和接收AMQP消息,实现消息队列的功能。
1.1.2 使用场景

lapin适用于需要在Rust应用程序中与AMQP消息队列进行交互的场景,例如分布式系统、微服务架构等。

1.2 安装与配置

1.2.1 安装方法

您可以通过在Cargo.toml文件中添加lapin库的依赖来安装lapin。具体步骤如下:

[dependencies]
lapin = "1.5"
tokio = { version = "1", features = ["full"] }

更多关于lapin库的安装信息,请参考 lapin官方文档

1.2.2 基本设置

在使用lapin之前,您需要为AMQP连接进行基本设置,包括指定AMQP服务器的地址、认证信息等。具体设置可以参考lapin官方文档中的示例代码。

1.3 API 概览

lapin库提供了丰富的API,以下是一些主要的API功能。

1.3.1 连接管理

用户可以使用lapin库轻松地建立和管理与AMQP服务器的连接。以下是一个简单的连接示例:

use lapin::Connection;
use lapin::ConnectionProperties;#[tokio::main]
async fn main() {let addr = "amqp://127.0.0.1:5672/%2f";let conn = Connection::connect(addr, ConnectionProperties::default()).await.unwrap();
}

更多关于lapin库连接管理的信息,请参考 lapin官方文档

1.3.2 消息传递

lapin库可以帮助用户发送和接收AMQP消息,实现消息传递的功能。以下是一个简单的消息传递示例:

use lapin::BasicProperties;
use lapin::options::BasicPublishOptions;
use lapin::types::FieldTable;let channel = conn.create_channel().await?;
let payload = b"Hello from lapin!";
let confirm = channel.basic_publish("exchange_name","routing_key",payload.to_vec(),BasicPublishOptions::default(),BasicProperties::default(),FieldTable::default()
).await?;
confirm.await?;

更多关于lapin库消息传递的信息,请参考 lapin官方文档

以上是lapin库的一些基本功能介绍和示例代码,希望能够帮助您快速上手使用lapin库进行AMQP消息队列的操作。

2. kafka-rust:一个Apache Kafka的客户端库

2.1 简介

kafka-rust是一个Apache Kafka的客户端库,用于Rust语言。它提供了与Kafka集成的功能,使得在Rust程序中可以方便地使用Kafka进行消息传输和管理。

2.1.1 核心功能
  • 生产者和消费者API
  • Topic管理
  • 消息传输和处理
2.1.2 使用场景

kafka-rust适用于需要在Rust应用程序中使用Apache Kafka作为消息队列或事件流平台的场景。例如,在大规模数据处理、实时日志记录、事件驱动架构等方面有广泛的应用。

2.2 安装与配置

2.2.1 安装指导

你可以通过Cargo添加kafka-rust作为项目的依赖:

[dependencies]
kafka-rust = "0.22.0"

更多安装和更新信息,请参考 kafka-rust官方文档

2.2.2 基本配置

在使用kafka-rust之前,需要确保正确配置Kafka集群的连接信息,包括broker地址、topic等。

use kafka_rust::{Error, ClientConfig, Producer, message::ToBytes};
use std::time::Duration;fn main() {let broker = "localhost:9092";let topic = "test";let producer: &Producer = match Producer::from_hosts(vec!(broker.to_string())).with_ack_timeout(Duration::from_secs(5)).create() {Err(e) => panic!("Failed to create producer: {}", e),Ok(p) => p};// 发送消息let data = "Hello, Kafka!";let res = producer.send(&data.to_bytes().unwrap(), None, Some(&topic));match res {Ok(partition) => println!("Sent successfully to partition {}", partition),Err((kafka_error, _message)) => eprintln!("Error sending message: {}", kafka_error),}
}

2.3 API 概览

2.3.1 生产者和消费者

kafka-rust提供了生产者和消费者API用于发送和接收消息。下面是一个简单的生产者示例:

// 创建生产者
let producer: &Producer = match Producer::from_hosts(vec!("localhost:9092".to_string())).create() {Err(e) => panic!("Failed to create producer: {}", e),Ok(p) => p
};// 发送消息
let data = "Hello, Kafka!";
let res = producer.send(&data.to_bytes().unwrap(), None, Some("test"));
match res {Ok(partition) => println!("Sent successfully to partition {}", partition),Err((kafka_error, _message)) => eprintln!("Error sending message: {}", kafka_error),
}

消费者的使用方式类似,可以订阅topic并拉取消息进行处理。详情请参考 kafka-rust官方文档

2.3.2 Topic管理

kafka-rust也提供了对Kafka Topic的管理功能,包括创建、删除、查找等操作。以下是一个简单的Topic创建示例:

use kafka_rust::client::KafkaClient;
use kafka_rust::error::Error as KafkaError;fn main() -> Result<(), KafkaError> {let broker = "localhost:9092";let client = KafkaClient::new(vec!(broker.to_string()), None);// 创建Topicclient.create_topic("test", 1, -1)
}

更多关于Topic管理的操作,请参考 kafka-rust官方文档

以上是kafka-rust库的简要介绍和基本使用示例,希望对

3. rdkafka:一个用于Rust语言的Apache Kafka客户端

3.1 简介

rdkafka是一个用于Rust语言的Apache Kafka客户端,它提供了强大的功能和灵活的配置选项,使得在Rust应用中使用Kafka成为可能。

3.1.1 核心功能
  • 生产者API:允许Rust应用将消息发送到Kafka集群。
  • 消费者API:允许Rust应用从Kafka集群中拉取消息进行处理。
  • 主题和分区管理:支持在Rust应用中创建、删除和管理Kafka主题和分区。
  • 高级特性实现:支持Kafka的高级特性,如事务、自定义分区器等。
3.1.2 使用场景

rdkafka适用于需要在Rust应用中与Apache Kafka集成的场景。例如,在大规模数据处理、事件驱动架构和日志收集系统中,rdkafka可以作为可靠的消息队列解决方案。

3.2 安装与配置

3.2.1 安装指南

通过Cargo来安装rdkafka,首先需要在Cargo.toml文件中添加rdkafka的依赖:

[dependencies]
rdkafka = "0.25"

然后使用Cargo进行构建即可安装rdkafka。

更多安装详情请参考:rdkafka安装指南

3.2.2 基本配置

在使用rdkafka之前,需要进行基本的配置设置,包括Kafka服务器地址、主题名称等。以下是一个基本的配置示例:

use rdkafka::config::ClientConfig;fn main() {let mut config = ClientConfig::new();config.set("bootstrap.servers", "localhost:9092");config.set("group.id", "my-consumer-group");// 其他配置设置...let producer: FutureProducer = config.create().expect("Producer creation error");
}

3.3 API 概览

3.3.1 消费者组管理

rdkafka提供了丰富的消费者组管理API,例如创建消费者组、订阅主题、拉取消息等操作。以下是一个简单的消费者组示例:

use rdkafka::consumer::{Consumer, StreamConsumer};
use rdkafka::config::ClientConfig;fn main() {let consumer: StreamConsumer = ClientConfig::new().set("group.id", "my-group").set("bootstrap.servers", "localhost:9092").create().expect("Consumer creation failed");consumer.subscribe(&["my-topic"]).expect("Can't subscribe to specified topic");for message in consumer.start() {match message {Ok(msg) => {// 处理消息},Err(e) => {// 处理错误},}}
}
3.3.2 高级特性实现

除了基本的生产者和消费者功能外,rdkafka还支持Kafka的一些高级特性实现。例如,下面是一个使用事务的高级特性示例:

use rdkafka::producer::{FutureProducer, FutureRecord};
use rdkafka::config::ClientConfig;fn main() {let producer: FutureProducer = ClientConfig::new().set("bootstrap.servers", "localhost:9092").create().expect("Producer creation error");let record = FutureRecord::to("my-topic").payload("message payload").key("message_key").headers(vec![("header_key", "header_value")]);let delivery_status = producer.send(record, 10000);
}

以上是对rdkafka在Rust语言中的基本介绍、安装配置方法和API概览。希望这些内容能够帮助你快速上手使用

4. nsq-rs:一个用于Rust语言的NSQ消息队列客户端

4.1 简介

4.1.1 核心功能

nsq-rs 是一个专为 Rust 语言设计的 NSQ(一个实时分布式消息传递平台)消息队列客户端。它提供了简单易用的 API,允许用户轻松地与 NSQ 进行交互。

4.1.2 使用场景

nsq-rs 可以被广泛地应用在需要实时消息传递的场景中,例如实时日志处理、事件通知等。

4.2 安装与配置

4.2.1 安装指南

要使用 nsq-rs,首先需要将其添加到项目的 dependencies 中。可以通过 Cargo.toml 文件进行添加:

[dependencies]
nsq = "0.7"

然后在代码中引入 nsq crate:

extern crate nsq;
4.2.2 基本配置

在使用 nsq-rs 之前,需要确保 NSQ 服务器已经正确安装并运行,并且了解 NSQ 的基本配置信息,例如服务器地址、端口等。

4.3 API 概览

4.3.1 生产者与消费者

nsq-rs 提供了生产者和消费者两个主要的 API 接口。下面是一个简单的示例,演示如何使用 nsq-rs 创建一个生产者,并发送消息到指定的主题:

use nsq::producer::{Producer, Config};fn main() {let mut producer = Producer::new(Config::new().set("nsqd_tcp_address", "127.0.0.1:4150")).unwrap();producer.pub_message("test_topic", "Hello from nsq-rs").unwrap();
}
4.3.2 主题与通道管理

通过 nsq-rs,用户可以方便地创建、订阅、取消订阅主题和通道。以下是一个示例,展示了如何使用 nsq-rs 订阅特定主题和通道,并处理接收到的消息:

use nsq::consumer::{Consumer, Config};
use nsq::Handler;struct MyHandler;impl Handler for MyHandler {fn handle_message(&mut self, msg: &nsq::Message) -> nsq::Result<()> {println!("Received message: {}", std::str::from_utf8(msg.body()).unwrap());Ok(())}
}fn main() {let config = Config::new().set("nsqd_tcp_addresses", vec!["127.0.0.1:4150"]);let mut consumer = Consumer::new("test_topic", "test_channel", Box::new(MyHandler), config).unwrap();consumer.run().unwrap();
}

请参考 nsq-rs GitHub 页面 获取更多详细信息和完整的文档。

5. pulsar-rs:一个用于Rust语言的Apache Pulsar客户端

5.1 简介

pulsar-rs是一个专为Rust语言设计的Apache Pulsar客户端,它提供了与Pulsar消息队列进行交互的功能,使得在Rust项目中使用Pulsar变得更加便捷。

5.1.1 核心功能
  • 连接Pulsar集群
  • 创建生产者(Producer)并发送消息
  • 创建消费者(Consumer)并接收消息
  • 管理Pulsar主题(Topic)
5.1.2 使用场景

pulsar-rs适用于需要在Rust项目中使用Pulsar消息队列的开发者,无论是在构建实时数据处理系统还是异步通信系统中,都能发挥其作用。

5.2 安装与配置

5.2.1 安装指南

要在Rust项目中使用pulsar-rs客户端,可以在Cargo.toml文件中添加以下依赖:

[dependencies]
pulsar = "0.5.0"

然后在代码中引入pulsar库即可开始使用。

5.2.2 基本配置

pulsar-rs的基本配置包括Pulsar集群的地址、端口等信息,具体可以参考官方文档进行配置。

5.3 API 概览

5.3.1 Producer与Consumer

以下是一个简单示例,演示如何通过pulsar-rs创建生产者并发送消息:

use pulsar::producer::Producer;#[tokio::main]
async fn main() -> Result<(), pulsar::Error> {let addr = "pulsar://127.0.0.1:6650";let topic = "my-topic";let producer: Producer = Producer::builder(addr, topic).build().await?;producer.send("Hello, Pulsar!").await?;Ok(())
}

上述代码首先创建了一个Pulsar生产者,并指定了Pulsar集群的地址和主题名称,然后通过send方法向指定主题发送消息。更多关于Producer的API细节可以在 pulsar-rs官方文档 中找到。

同样地,创建消费者并接收消息的操作也类似,读者可参考官方文档进行详细了解。

5.3.2 Topic管理

pulsar-rs 提供了一组用于管理Pulsar主题的API,包括创建主题、订阅主题、删除主题等操作。以下是一个简单示例,演示如何在Rust中使用pulsar-rs创建一个主题:

use pulsar::topic::Topic;#[tokio::main]
async fn main() -> Result<(), pulsar::Error> {let addr = "pulsar://127.0.0.1:6650";let topic_name = "new-topic";let topic = Topic::new(addr, topic_name);topic.create().await?; // 创建新主题Ok(())
}

上述代码中,创建了一个名为"new-topic"的Pulsar主题。更多关于Topic管理的API细节可以在 pulsar-rs官方文档 中找到。

通过本文简要介绍,读者可以初步了解pulsar-rs客户端的基本使用方式及其API。在实际应用中,可以根据官方文档进一步探索不同功能的详细使用方法。

6. rocketmq-rust:一个用于Rust语言的RocketMQ客户端

6.1 简介

rocketmq-rust是专为Rust语言设计的RocketMQ客户端,旨在提供高性能、低延迟的消息队列解决方案。它支持RocketMQ中的核心功能,并适用于各种使用场景。

6.1.1 核心功能
  • 发布与订阅:支持发布和订阅消息的功能,可以灵活地进行消息的发送和接收。
  • 队列管理:提供了对队列的管理功能,包括创建队列、删除队列等操作。
6.1.2 使用场景

rocketmq-rust适用于需要在Rust语言中使用消息队列的各种场景,例如分布式系统间的通讯、异步任务处理等。

6.2 安装与配置

6.2.1 安装指南

你可以通过Cargo来安装rocketmq-rust,只需在你的Cargo.toml文件中添加以下依赖即可:

[dependencies]
rocketmq-rust = "0.1.0"

更多安装细节可以查看rocketmq-rust官方文档。

6.2.2 基本配置

在开始使用rocketmq-rust之前,你需要配置RocketMQ的相关信息,如NameServer的地址、Producer和Consumer的GroupID等。你可以通过以下代码示例来配置:

use rocketmq_rust::producer::{Producer, DefaultProducer, SendResult};
use rocketmq_rust::config::producer_config::{ProducerConfig,DefaultProducerOption};
use rocketmq_rust::message::Message;fn main() {let producer = DefaultProducer::new(ProducerConfig{group_id: String::from("test_group"),name_server_addr: String::from("127.0.0.1:9876"),..DefaultProducerOption::default()});producer.start();// 其他逻辑
}

6.3 API 概览

6.3.1 发布与订阅

rocketmq-rust提供了便捷的API来发布和订阅消息。以下是一个简单的发布消息的示例:

use rocketmq_rust::producer::{Producer, DefaultProducer, SendResult};
use rocketmq_rust::config::producer_config::{ProducerConfig,DefaultProducerOption};
use rocketmq_rust::message::Message;fn main() {let producer = DefaultProducer::new(ProducerConfig{group_id: String::from("test_group"),name_server_addr: String::from("127.0.0.1:9876"),..DefaultProducerOption::default()});producer.start();let msg = Message::new("test_topic", "test_tags", "Hello, RocketMQ");match producer.send(&msg) {Ok(send_result) => println!("SendResult: {:?}", send_result),Err(e) => eprintln!("Error: {:?}", e),}
}
6.3.2 队列管理

除了消息的发布与订阅,rocketmq-rust还提供了对队列的管理功能。你可以通过以下代码示例来创建一个队列:

use rocketmq_rust::admin::{Admin, DefaultAdminExt};fn main() {let admin = DefaultAdminExt::with_namespace("test_namespace");admin.start();let queue = admin.create_queue("test_topic", "queue_name", 4);println!("Queue created: {:?}", queue);
}

以上就是rocketmq-rust的简要介绍以及一些基本的使用方法示例。如果需要更多详细信息,可以参考rocketmq-rust官方文档。

总结

通过本文的阅读,读者可以对几种用于Rust语言的消息队列客户端库有一个清晰的认识。无论是轻量级的NSQ,还是功能强大的Kafka,亦或是快速、可扩展并且具备持久性的Pulsar,Rust语言均有相应的客户端库。这些库都提供了丰富的特性和灵活的API,为开发者构建高效可靠的消息传递系统提供了良好的基础。

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

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

相关文章

开发新系统时,数据库字符集怎么选择对中文的支持最好?

在新开发的系统时,如果你希望确保中文按拼音顺序正确排序,同时支持更多的特殊字符与符号,下面是对 utf8mb4_zh_cn_ci、utf8mb4_unicode_ci 和 utf8mb4_unicode_520_ci 这几种字符集和校对规则的分析以及推荐方案: 校对规则分析 utf8mb4_zh_cn_ci: 特点:这是专为简体中文…

goalng http client的MaxIdleConnsPerHost,MaxIdleConns,MaxConnsPerHost参数设置总结

MaxIdleConnsPerHost&#xff1a;优先设置这个&#xff0c;决定了对于单个Host需要维持的连接池大小。该值的合理确定&#xff0c;应该根据性能测试的结果调整。MaxIdleConns&#xff1a;客户端连接单个Host&#xff0c;不少于MaxIdleConnsPerHost大小&#xff0c;不然影响MaxI…

数据压缩(2)——变长编码

【定长编码】 变长和定长是很基本的概念&#xff0c;不光是在数据压缩&#xff0c;在其他很多地方都可以见到&#xff0c;这里就不多说了。 前文说过&#xff0c;在数据压缩时&#xff0c;我们需要用某些字符A替换或修改某些字符B&#xff0c;字符A占用的存储空间更小一些。 …

【力扣】划分为k个相等的子集

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 给定一个整数数组 …

超越基础:Visual Basic在科学计算与数据分析的革新应用

标题&#xff1a;超越基础&#xff1a;Visual Basic在科学计算与数据分析的革新应用 Visual Basic&#xff08;VB&#xff09;&#xff0c;最初以其易于学习和使用而闻名&#xff0c;常被视为入门级编程语言。然而&#xff0c;VB的潜力远不止于简单的应用程序开发。在科学计算…

WHAT - 综合书单推荐

拥有一个成功的人生&#xff0c;书籍确实是一个重要的知识来源。可以将书籍分为几个主要类别&#xff0c;每个类别对应不同的知识领域和成长方向。以下是一些建议的分类及每类书籍推荐&#xff1a; 1. 个人发展与心理学 《如何赢得朋友与影响他人》 - 戴尔卡耐基《思考&#…

【qt】锁

线程安全问题. 多线程程序太复杂了. 加锁 把多个线程要访问的公共资源&#xff0c;通过锁保护起来.>把并发执行变成串行执行. Linux mutex 互斥量. C11引入std::mutex Qt 同样也提供了对应的锁&#xff0c;来针对系统提供的锁进行封装.QMutex 多个线程进行加锁的对象&…

example-apisix-1 清空日志之后启动异常处理

异常信息 2024/08/27 11:34:33 [emerg] 1#1: bind() to unix:/usr/local/apisix/conf/config_listen.sock failed (98: Address already in use) nginx: [emerg] bind() to unix:/usr/local/apisix/conf/config_listen.sock failed (98: Address already in use) 2024/08/27 1…

【生日视频制作】室内告白表白祝福布置霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】

室内告白表白祝福布置霓虹灯生日视频制作教程AE模板改字生成器 怎么如何做的【生日视频制作】室内告白表白祝福布置霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

【Go - 每日一小问: 对未初始化的的 chan 进行读写,会怎么样?为什么?】

对未初始化的 chan 进行读写会有不同的行为&#xff1a; 1. 对未初始化的 chan 进行读取 读取操作&#xff1a; 对未初始化的 chan 进行读取操作会导致永久阻塞&#xff08;deadlock&#xff09;&#xff0c;因为没有任何 goroutine 可以向这个 chan 发送数据。读取操作会一直…

Signac R|如何合并多个 Seurat 对象 (1)

引言 在本文中演示了如何合并包含单细胞染色质数据的多个 Seurat 对象。为了进行演示&#xff0c;将使用 10x Genomics 提供的四个 scATAC-seq PBMC 数据集&#xff1a; 500-cell PBMC 1k-cell PBMC 5k-cell PBMC 10k-cell PBMC 实战 在整合多个单细胞染色质数据集的过程中&…

SAP与生产制造MPM系统集成案例

一、需求介绍 某公司为保证企业内部生产管理系统的多项基础数据的同步更新&#xff0c;确保各模块间信息的一致性和准确性&#xff0c;对后续的生产计划和物料管理打下基础&#xff0c;该公司将MPM系统和SAP系统经过SAP PO中间件集成平台进行了集成。MPM全称为Manufacturing…

超实用的8个无版权、免费、高清图片素材网站整理

不管是设计、文章配图&#xff0c;还是视频制作&#xff0c;图片都至关重要。但是图片版权一直都是困扰很多设计、自媒体以及企业的大问题。现在&#xff0c;因为图片侵权被告的案例已经是司空见惯了&#xff0c;有的公众号甚至因为图片版权问题遭受致命打击。 1. Pexels Pexe…

Spring Boot 全局异常@ControllerAdvice和@RestControllerAdvice的区别

在Spring Boot中&#xff0c;ControllerAdvice和RestControllerAdvice都可以用于实现全局异常处理&#xff0c;但它们在处理方式和返回值类型上略有不同。至于为什么在某些情况下可能更偏向于使用RestControllerAdvice而不是ControllerAdvice&#xff0c;这主要取决于你的应用类…

前后端传参@RequestParam使用上的一个小坑

RequestParam(value "art") String art 默认情况下&#xff0c;value "art"表示前端传入参数的名字叫art&#xff0c;如果前端不传的话会报错 RequestParam(value "art" required false) String art 当equired false 时表示前端可以不传这个…

Spring框架:开发者的得力伙伴,魅力何在?

目录 一. Spring介绍 二. Spring搭建 三. Spring Bean管理 ▐ 管理方式 ▐ 依赖注入 四. Spring数据访问层管理 五. Spring集成MyBatis 海漫浩浩,我亦苦作舟!大家一起学习,一起进步! 一. Spring介绍 Spring是什么? Spring 是一个轻量级的, IOC 和 AOP 的一站式 J…

2024年最新Java面试宝典系列-Collections集合篇1

Java中的集合类有哪些&#xff1f;它们的特点是什么 List&#xff1a;有序集合&#xff0c;允许重复元素&#xff0c;实现类如ArrayList、LinkedList。Set&#xff1a;无序集合&#xff0c;不允许重复元素&#xff0c;实现类如HashSet、TreeSet。Map&#xff1a;键值对集合&am…

阿里云服务器 篇七:服务器热备份/定时备份

文章目录 系列文章bypy其他备选项目安装bypy使用bypy命令帮助绑定百度账号查看网盘空间大小和账号信息显示在百度网盘中的根目录在百度网盘中创建备份目录百度网盘中的其他文件操作命令从本地目录同步到百度网盘中在云服务器设置定时同步创建云端备份目录为sudo命令做准备创建同…

如何使用ssm实现基于java web的计算机office课程平台设计与实现+vue

TOC ssm277基于java web的计算机office课程平台设计与实现vue 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利…

博弈论(Nim游戏的扩展)

公平组合游戏ICG 若一个游戏满足: 1.由两名玩家交替行动; 2.在游戏进程的任意时刻&#xff0c;可以执行的合法行动与轮到哪名玩家无关; 3.不能行动的玩家判负; 则称该游戏为一个公平组合游戏。 NIM博弈属于公平组合游戏&#xff0c;但城建的棋类游戏&#xff0c;比如围棋&…