当前位置: 首页 > news >正文

关于SpringBoot集成Kafka

关于Kafka

Apache Kafka 是一个分布式流处理平台,广泛用于构建实时数据管道和流应用。它能够处理大量的数据流,具有高吞吐量、可持久化存储、容错性和扩展性等特性。

Kafka一般用作实时数据流处理、消息队列、事件架构驱动等

Kafka的整体架构

  • ZooKeeper:

位于架构的顶部,负责管理和协调 Kafka 集群的各种元数据,包括集群配置、主题信息、分区领导者的选举等。

  • Producers (生产者):

Kafka体系中的主要角色之一,它们负责产生消息并将其发送到 Kafka 集群中的相应主题。

  • Brokers (代理/服务器):节点,也就是具体的Kafka实例,集群的组成单元,多个 Broker 组成一个集群。每个 Broker 存储着一部分主题的分区数据。
    • Topics (主题):主题是消息的类别,生产者将消息发布到特定的主题。一个Brokers包含多个topic。
      • Partitions (分区):每个主题可以划分为一个或多个分区,分区是物理上存储消息的地方。一个主题可以有多个分区
        • Leaders and Followers (领导者和跟随者):对于每个分区,有一个 Leader 负责接受所有生产和消费请求,而 Follower 则复制 Leader (图中红色部分)的数据。
        • Segments (段): 分区内部又细分为多个 Segment,每个 Segment 包括一个 .log 文件和其他相关文件,用于消息数据持久化。 
  • Consumers (消费者):

Kafka体系中的另一个主要角色,它们订阅主题并从 Kafka 集群中拉取消息。消费者可以组织成消费者组,同一组内的消费者共享消息。

Kafka的工作流程

  • 消息发布

生产者创建消息并将它们发送到指定的主题。生产者可以选择将消息发送到特定的分区,或者让 Kafka 根据某种策略(如轮询、哈希等)自动选择分区。

  • 消息存储

当消息到达Broker时,它会被追加到指定分区的日志文件末尾。每个分区都是一个独立的日志文件,按照偏移量(Offset)进行索引,确保消息的顺序性。

  • 消息消费

消费者订阅感兴趣的主题,并从指定的分区读取消息。消费者通过维护一个偏移量来跟踪已经处理的消息,确保不会重复消费。

  • 故障恢复

如果Broker发生故障,Kafka会从其他副本中选举一个新的Leader分区来继续提供服务,确保系统的高可用性。 

SpringBoot集成Kafka

引入依赖

在SpringBoot框架下,可以直接通过引入Kafka依

    <!-- Spring Kafka Starter --><dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>

yaml配置详解

关于SpringBoot中使用Kafka的配置结构如下:

spring:kafka:bootstrap-servers: localhost:9092  # Kafka整体配置:服务器地址,可以是多个以逗号分隔consumer: #作为消费者的具体配置group-id: my-group # 消费者的组ID,属于同一组的消费者会互相竞争消费消息# …… 消费者其他的配置producer: #作为生产者的具体配置value-serializer: org.apache.kafka.common.serialization.StringSerializer # 值的序列化器#……其他控制生产者的配置

各类参数配置说明:

归属配置项说明默认值作用
全局bootstrap-servers指定Kafka集群的地址,可以是多个地址,用逗号分隔-生产者和消费者通过这些地址与Kafka集群建立连接
消费者consumer.group-id指定消费者的组ID-属于同一组的消费者会互相竞争消费消息,确保每个消息只被组内的一个消费者消费
consumer.auto-offset-reset当没有初始偏移量可用或当前偏移量不再存在时,自动重置偏移量的策略latest决定了在消费者组没有已知偏移量时,从哪里开始读取消息
consumer.key-deserializer指定键的反序列化器org.apache.kafka.common.serialization.ByteArrayDeserializer将从Kafka接收到的字节数据转换为Java对象
consumer.value-deserializer指定值的反序列化器org.apache.kafka.common.serialization.ByteArrayDeserializer将从Kafka接收到的字节数据转换为Java对象
consumer.enable-auto-commit是否启用自动提交偏移量true如果启用,消费者会定期自动提交偏移量,否则需要手动提交
consumer.auto-commit-interval自动提交偏移量的时间间隔(毫秒)5000(5秒)控制自动提交的频率
consumer.max-poll-records单次轮询返回的最大记录数500控制每次轮询从Kafka获取的消息数量
consumer.fetch-min-bytes消费者从Kafka获取数据的最小字节数1如果小于该值,Kafka不会立即返回数据,而是等待更多数据积累
consumer.fetch-max-wait消费者从Kafka获取数据的最大等待时间(毫秒)500控制消费者在没有足够数据时的等待时间
consumer.session-timeout消费者会话超时时间(毫秒)10000(10秒)控制消费者在未发送心跳的情况下,Kafka认为其失效的时间
生产者producer.key-serializer指定键的序列化器org.apache.kafka.common.serialization.ByteArraySerializer将Java对象转换为字节数据,以便发送到Kafka
producer.value-serializer指定值的序列化器org.apache.kafka.common.serialization.ByteArraySerializer将Java对象转换为字节数据,以便发送到Kafka
producer.acks生产者发送消息时的确认模式1控制消息发送的可靠性
producer.retries生产者发送消息失败时的重试次数0控制消息发送失败时的重试机制
producer.batch-size生产者批量发送消息的大小(字节)16384(16KB)控制消息的批量发送,提高性能
producer.linger-ms生产者在发送消息前等待的时间(毫秒),以便收集更多的消息进行批量发送0控制消息的批量发送,提高性能

示例配置

spring:kafka:# 指定Kafka集群的地址,可以是多个地址,用逗号分隔# 生产者和消费者通过这些地址与Kafka集群建立连接bootstrap-servers: localhost:9092consumer:# 指定消费者的组ID# 属于同一组的消费者会互相竞争消费消息,确保每个消息只被组内的一个消费者消费group-id: my-group# 当没有初始偏移量可用或当前偏移量不再存在时,自动重置偏移量的策略# 可选值: earliest, latest, none# earliest: 自动重置为最早的偏移量# latest: 自动重置为最新的偏移量# none: 如果没有找到消费者组的偏移量,则抛出异常auto-offset-reset: earliest# 指定键的反序列化器# 将从Kafka接收到的字节数据转换为Java对象key-deserializer: org.apache.kafka.common.serialization.StringDeserializer# 指定值的反序列化器# 将从Kafka接收到的字节数据转换为Java对象value-deserializer: org.apache.kafka.common.serialization.StringDeserializer# 是否启用自动提交偏移量# 如果启用,消费者会定期自动提交偏移量,否则需要手动提交enable-auto-commit: true# 自动提交偏移量的时间间隔(毫秒)# 控制自动提交的频率auto-commit-interval: 5000# 单次轮询返回的最大记录数# 控制每次轮询从Kafka获取的消息数量max-poll-records: 100# 消费者从Kafka获取数据的最小字节数# 如果小于该值,Kafka不会立即返回数据,而是等待更多数据积累fetch-min-bytes: 1# 消费者从Kafka获取数据的最大等待时间(毫秒)# 控制消费者在没有足够数据时的等待时间fetch-max-wait: 500# 消费者会话超时时间(毫秒)# 控制消费者在未发送心跳的情况下,Kafka认为其失效的时间session-timeout: 10000producer:# 指定键的序列化器# 将Java对象转换为字节数据,以便发送到Kafkakey-serializer: org.apache.kafka.common.serialization.StringSerializer# 指定值的序列化器# 将Java对象转换为字节数据,以便发送到Kafkavalue-serializer: org.apache.kafka.common.serialization.StringSerializer# 生产者发送消息时的确认模式# 可选值: 0, 1, all# 0: 不等待任何确认# 1: 等待leader节点确认# all: 等待所有副本节点确认acks: all# 生产者发送消息失败时的重试次数# 控制消息发送失败时的重试机制retries: 3# 生产者批量发送消息的大小(字节)# 控制消息的批量发送,提高性能batch-size: 16384# 生产者在发送消息前等待的时间(毫秒),以便收集更多的消息进行批量发送# 控制消息的批量发送,提高性能linger-ms: 1

关于消费者的 auto-commit属性:

enable-auto-commit 是Kafka消费者的一个重要配置属性,它决定了消费者是否自动提交偏移量。

如果设置为true,即自动提交:

  • 消费者会定期自动提交偏移量。
  • 提交的频率由 auto-commit-interval 配置项决定,默认为5秒。
  • 消费者在每次轮询后会检查是否需要提交偏移量,如果达到提交间隔时间,则提交当前偏移量。

设置为true的优势主要在于简化开发,如果消费者崩溃,重新启动后可以从上次提交的偏移量继续消费,避免重复消费大量消息。劣势则是自动提交的频率在处理大数据量是会有性能风险。

如果设置为false,即手动提交:

  • 消费者不会自动提交偏移量。
  • 开发者需要手动调用方法来提交偏移量(具体提交方法在下文)
  • 可以在消息处理完成后立即提交偏移量,也可以批量提交。

设置为false的优势在于更为精准的控制,能有效提升性能,开发者可以完全控制何时提交偏移量,确保消息处理的可靠性和一致性。可以根据业务需求选择同步提交或异步提交,具有更强的灵活性。劣势则是如果忘记提交偏移量,可能会导致消息重复消费或丢失。

消费与生成的使用

进行消息监听与消费

消息的监听主要是通过@KafkaListener注解来完成,以下是一个例子:

@Service
public class KafkaConsumer {@Autowiredprivate DataService dataService;@KafkaListener(topics = "my-topic", groupId = "my-group")public void listen(String message) {//如果你的方法参数是一个 String 类型,那么默认情况下,这个参数会被解析为消息的值(Value)log.info("Received Message: {}" , message);dataService.OpData(message); }//如果你想同时获取消息的键(Key)和值(Value),可以使用 ConsumerRecord 对象。ConsumerRecord 包含了消息的所有信息,包括键、值、分区、偏移量等。@KafkaListener(topics = "my-topic")public void listen(ConsumerRecord<String, String> record) {log.info("Received Message Key: " + record.key());log.info("Received Message Value: " + record.value());log.info("Partition: " + record.partition());log.info("Offset: " + record.offset());}}

关于@KafkaListener注解的参数如下:

参数类型说明示例
topicsString[]指定要监听的主题列表。@KafkaListener(topics = "my-topic")
topicPartitionsTopicPartitionOffset[]指定要监听的主题和分区。可以用于更细粒度的控制。@KafkaListener(topicPartitions = @TopicPartition(topic = "my-topic", partitions = { "0", "1" }))
groupIdString指定消费者的组ID。如果在配置文件中已经指定了组ID,这里可以省略。@KafkaListener(topics = "my-topic", groupId = "my-group")
containerFactoryString指定用于创建监听器容器的工厂Bean的名称。通常在配置类中定义。@KafkaListener(topics = "my-topic", containerFactory = "kafkaListenerContainerFactory")
idString指定监听器的唯一标识符。可以在监控和管理中使用。@KafkaListener(topics = "my-topic", id = "myListener")
concurrencyString指定并发消费者线程的数量。@KafkaListener(topics = "my-topic", concurrency = "3")
autoStartupboolean指定监听器是否在应用程序启动时自动启动。@KafkaListener(topics = "my-topic", autoStartup = "false")
propertiesMap<String, String>指定额外的Kafka消费者属性。@KafkaListener(topics = "my-topic", properties = "max.poll.interval.ms:120000")
groupIdPrefixString指定组ID的前缀。实际的组ID将是前缀加上方法名。@KafkaListener(topics = "my-topic", groupIdPrefix = "prefix-")
clientIdPrefixString指定客户端ID的前缀。实际的客户端ID将是前缀加上方法名。@KafkaListener(topics = "my-topic", clientIdPrefix = "client-")
containerPropertiesContainerProperties指定容器的属性。@KafkaListener(topics = "my-topic", containerProperties = @ContainerProperties(ackMode = AckMode.MANUAL))
errorHandlerString指定错误处理器Bean的名称。@KafkaListener(topics = "my-topic", errorHandler = "myErrorHandler")
replyTemplateString指定回复模板Bean的名称。@KafkaListener(topics = "my-topic", replyTemplate = "myReplyTemplate")
replyTopicString指定回复主题。@KafkaListener(topics = "my-topic", replyTopic = "reply-topic")
replyTimeoutlong指定回复超时时间(毫秒)。@KafkaListener(topics = "my-topic", replyTimeout = 5000)
replyHeadersString[]指定要传递的回复头。@KafkaListener(topics = "my-topic", replyHeaders = { "header1", "header2" })
groupIdIsolationLevelIsolationLevel指定隔离级别。@KafkaListener(topics = "my-topic", groupIdIsolationLevel = IsolationLevel.READ_COMMITTED)
containerGroupString指定容器组。@KafkaListener(topics = "my-topic", containerGroup = "group1")

 额外说明一下containerFactory 参数,为了使用 containerFactory 参数,你需要在配置类中定义相应的工厂Bean:


@Configuration
@EnableKafka
public class KafkaConfig {@Beanpublic ConsumerFactory<String, String> consumerFactory() {Map<String, Object> props = new HashMap<>();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");props.put(ConsumerConfig.GROUP_ID_CONFIG, "my-group");props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);return new DefaultKafkaConsumerFactory<>(props);}@Beanpublic ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();factory.setConsumerFactory(consumerFactory());factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);return factory;}
}

基于使用containerFactory配置一般主要用于手动提交的时候,可以在方法中使用提交参数,如下:

@Service
public class KafkaConsumer {@KafkaListener(topics = "my-topic",containerFactory = "kafkaListenerContainerFactory")public void listen(ConsumerRecord<String, String> record, Acknowledgment acknowledgment){log.info("Received Message: " + record.value());// 处理消息try {// 模拟消息处理Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 手动提交偏移量 enable-auto-commit为false的话acknowledgment.acknowledge();}
}

消息生产

主要是基于KafkaTemplate进行消息的发送,可以根据需求,先定义生产者的工厂Bean:

@Configuration
public class KafkaProducerConfig {@Beanpublic ProducerFactory<String, String> producerFactory() {Map<String, Object> configProps = new HashMap<>();configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);return new DefaultKafkaProducerFactory<>(configProps);}@Beanpublic KafkaTemplate<String, String> kafkaTemplate() {return new KafkaTemplate<>(producerFactory());}
}

 封装生产者方法:

@Service
public class KafkaProducer {@Autowiredprivate KafkaTemplate<String, String> kafkaTemplate;/*** 发送字符串消息到指定主题** @param topic   主题名称* @param message 消息内容*/public void sendMessage(String topic, String message) {kafkaTemplate.send(topic, message);}/*** 发送带键的字符串消息到指定主题** @param topic   主题名称* @param key     消息键* @param message 消息内容*/public void sendMessageWithKey(String topic, String key, String message) {kafkaTemplate.send(topic, key, message);}/*** 异步发送消息并处理回调** @param topic   主题名称* @param message 消息内容* @param callback 回调函数*/public void sendAsyncMessage(String topic, String message, KafkaCallback<String, String> callback) {kafkaTemplate.send(topic, message).addCallback(callback);}/*** 异步发送带键的消息并处理回调** @param topic   主题名称* @param key     消息键* @param message 消息内容* @param callback 回调函数*/public void sendAsyncMessageWithKey(String topic, String key, String message, KafkaCallback<String, String> callback) {kafkaTemplate.send(topic, key, message).addCallback(callback);}
}

为了支持异步发送消息并处理回调,定义回调不同的接口:

public interface KafkaCallback<K, V> extends ListenableFutureCallback<SendResult<K, V>> {@Overridedefault void onSuccess(SendResult<K, V> result) {//回调处理}@Overridedefault void onFailure(Throwable ex) {//处理}
}

 直接使用

@RestController
@RequestMapping("/kafka")
public class KafkaController {@Autowiredprivate KafkaProducerService kafkaProducerService;@PostMapping("/send")public String sendMessage(@RequestBody String message) {kafkaProducerService.sendMessage("my-topic", message);return "Message sent: " + message;}@PostMapping("/send-with-key")public String sendMessageWithKey(@RequestBody String message) {kafkaProducerService.sendMessageWithKey("my-topic", "key1", message);return "Message with key sent: " + message;}@PostMapping("/send-async")public String sendAsyncMessage(@RequestBody String message) {kafkaProducerService.sendAsyncMessage("my-topic", message, new KafkaCallback<String, String>());return "Async message sent: " + message;}@PostMapping("/send-async-with-key")public String sendAsyncMessageWithKey(@RequestBody String message) {kafkaProducerService.sendAsyncMessageWithKey("my-topic", "key1", message, new KafkaCallback<String, String>());return "Async message with key sent: " + message;}
}

相关文章:

关于SpringBoot集成Kafka

关于Kafka Apache Kafka 是一个分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流应用。它能够处理大量的数据流&#xff0c;具有高吞吐量、可持久化存储、容错性和扩展性等特性。 Kafka一般用作实时数据流处理、消息队列、事件架构驱动等 Kafka的整体架构 ZooKeeper:…...

4.STM32之通信接口《精讲》之IIC通信---软件实现IIC《深入浅出》面试必备!

接下正式&#xff0c;进入软件编写IIC时序了&#xff0c;并实现对MPU6050的控制&#xff0c;既然是软件实现&#xff0c;那么硬件方面&#xff0c;我仅需两根控制线即可&#xff0c;即&#xff1a;数据控制线SDA&#xff0c;时钟控制线SCL。&#xff08;人为软件层面定义的&…...

6G通信技术对比5G有哪些不同?

6G&#xff0c;即第六代移动通信技术&#xff0c;是5G之后的延伸&#xff0c;代表了一种全新的通信技术发展方向。与5G相比&#xff0c;6G在多个方面都有显著的不同和提升&#xff0c;以下是对6G通信技术及其与5G差异的详细分析&#xff1a; 一、6G的基本特点 更高的传输速率…...

「Mac玩转仓颉内测版28」基础篇8 - 元组类型详解

本篇将介绍 Cangjie 中的元组类型&#xff0c;包括元组的定义、创建、访问、数据解构以及应用场景&#xff0c;帮助开发者掌握元组类型的使用。 关键词 元组类型定义元组创建元组访问数据解构应用场景 一、元组类型概述 在 Cangjie 中&#xff0c;元组是一种用于存储多种数据…...

WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理

WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理 1. 标题识别elementUI组件爆红 这个原因是&#xff1a; 在官网说明里&#xff0c;才版本2024.1开始&#xff0c;默认启用的 Vue Language Server&#xff0c;但是在 Vue 2 项目…...

机械设计学习资料

免费送大家学习资源&#xff0c;已整理好&#xff0c;仅供学习 下载网址&#xff1a; https://www.zzhlszk.com/?qZ02-%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83SOP.zip...

Python 快速入门(上篇)❖ Python 字符串

Python 字符串 字符串格式化输出字符串拼接获取字符串长度字符串切片字符串处理方法 字符串格式化输出 name “xhx” age 30 # 方法1 print("我的名字是%s,今年%s岁了。 " % (name, age)) # 方法2 print(f"我的名字是{name},今年{age}岁了。")字符串拼接…...

Ubuntu中使用多版本的GCC

我的系统中已经安装了GCC11.4&#xff0c;在安装cuda时出现以下错误提示&#xff1a; 意思是当前的GCC版本过高&#xff0c;要在保留GCC11.4的同时安装GCC9并可以切换&#xff0c;可以通过以下步骤实现&#xff1a; 步骤 1: 安装 GCC 9 sudo apt-get update sudo apt-get ins…...

1+X应急响应(网络)文件包含漏洞:

常见网络攻击-文件包含漏洞&命令执行漏洞&#xff1a; 文件包含漏洞简介&#xff1a; 分析漏洞产生的原因&#xff1a; 四个函数&#xff1a; 产生漏洞的原因&#xff1a; 漏洞利用条件&#xff1a; 文件包含&#xff1a; 漏洞分类&#xff1a; 本地文件包含&#xff1a; …...

机器学习实战记录(1)

决策树——划分数据集 def splitDataSet(dataSet, axis, value): retDataSet [] #创建返回的数据集列表for featVec in dataSet: #遍历数据集if featVec[axis] value:reducedFeatVec featVec[:axis] #去掉axis特征reducedFeatVec.extend(featVec[axis1…...

PHP8解析php技术10个新特性

PHP8系列是 PHP编程语言的最新主线版本&#xff0c;带来了许多激动人心的新特性和改进。作为一名PHP开发者&#xff0c;了解这些更新能够帮助你编写更高效、安全和现代的代码。 8的核心技术知识点&#xff0c;包括语言特性、性能优化、安全增强以及开发者工具的改进。 Just-In…...

C++模版特化和偏特化

什么是模版特化 特化的含义&#xff1a;所谓特化&#xff0c;就是将泛型搞得具体化一些&#xff0c;从字面上来解释&#xff0c;就是为已有的模板参数进行一些使其特殊化的指定&#xff0c;使得以前不受任何约束的模板参数&#xff0c;或受到特定的修饰&#xff08;例如const或…...

Simulink中Model模块的模型保护功能

在开发工作过程中&#xff0c;用户为想要知道供应商的开发能力&#xff0c;想要供应商的模型进行测试。面对如此要求&#xff0c;为了能够尽快拿到定点项目&#xff0c;供应商会选择一小块算法或是模型以黑盒的形式供客户测试。Simulink的Model模块除了具有模块引用的功能之外&…...

Linux常用工具的使用(2):文本编辑器的使用

实验题目&#xff1a;Linux常用工具的使用&#xff08;2&#xff09;&#xff1a;文本编辑器的使用 实验目的&#xff1a; &#xff08;1&#xff09;理解文本编辑器vi的工作模式&#xff1b; &#xff08;2&#xff09;掌握文本编辑器的使用方法 实验内容&#xff1a; &a…...

【StarRocks】starrocks 3.2.12 【share-nothing】 多Be集群容器化部署

文章目录 一. 集群规划二.docker compose以及启动脚本卷映射对于网络环境变量 三. 集群测试用户新建、赋权、库表初始化断电重启扩容 BE 集群 一. 集群规划 部署文档 https://docs.starrocks.io/zh/docs/2.5/deployment/plan_cluster/ 分类描述FE节点1. 主要负责元数据管理、…...

联想ThinkServer服务器主要硬件驱动下载

联想ThinkServer服务器主要硬件驱动下载&#xff1a; 联想ThinkServer服务器主要硬件Windows Server驱动下载https://newsupport.lenovo.com.cn/commonProblemsDetail.html?noteid156404#D50...

Ansys Zemax Optical Studio 中的近视眼及矫正

近视&#xff0c;通常称为近视眼&#xff0c;是一种眼睛屈光不正&#xff0c;导致远处物体模糊&#xff0c;而近处物体清晰。这是一种常见的视力问题&#xff0c;通常发生在眼球过长或角膜&#xff08;眼睛前部清晰的部分&#xff09;过于弯曲时。因此&#xff0c;进入眼睛的光…...

三次握手后的数据传输

一旦三次握手成功完成&#xff0c;TCP连接便正式建立&#xff0c;双方可以开始传输数据。在这个阶段&#xff0c;TCP协议利用其独特的可靠性和流控机制&#xff0c;确保数据的有序、无差错传输。 序列号与确认号&#xff1a;在数据传输过程中&#xff0c;TCP会为每个报文段分配…...

企业OA管理系统:Spring Boot技术实现与案例研究

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管理系统的系统分析部…...

(免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统

摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在大学生在线计算机类专业考研学习网站管理的要求下&#xff0c;开发一…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...