Spring Boot 項目中集成 Kafka-03

在 Spring Boot 項目中集成 Kafka 有多種方式,適應不同的應用場景和需求。以下將詳細介紹幾種常用的集成方法,包括:

  1. 使用 Spring Kafka (KafkaTemplate@KafkaListener)
  2. 使用 Spring Cloud Stream 與 Kafka Binder
  3. 使用 Spring for Apache Kafka Reactive(基于 Reactor)
  4. 手動配置 Producer 和 Consumer Bean
  5. 使用 Spring Integration Kafka
  6. 在測試中使用嵌入式 Kafka

每種方法都有其特點和適用場景,選擇合適的方法能夠有效提升開發效率和應用性能。


1. 使用 Spring Kafka (KafkaTemplate@KafkaListener)

這是最常用的 Spring Boot 集成 Kafka 的方式,依賴于 Spring for Apache Kafka 項目,提供了 KafkaTemplate 用于發送消息,以及 @KafkaListener 注解用于接收消息。

步驟一:添加 Maven 依賴

pom.xml 中引入 spring-kafka 依賴:

<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId>
</dependency>

步驟二:配置 application.propertiesapplication.yml

示例 (application.properties):

# Kafka 集群地址
spring.kafka.bootstrap-servers=worker1:9092,worker2:9092,worker3:9092# 生產者配置
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.acks=1
spring.kafka.producer.retries=3
spring.kafka.producer.batch-size=16384
spring.kafka.producer.linger.ms=1# 消費者配置
spring.kafka.consumer.group-id=myGroup
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=true

步驟三:編寫消息生產者

使用 KafkaTemplate 發送消息:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;@Service
public class ProducerService {@Autowiredprivate KafkaTemplate<String, String> kafkaTemplate;private static final String TOPIC = "topic1";public void sendMessage(String message) {kafkaTemplate.send(TOPIC, message);}
}

步驟四:編寫消息消費者

使用 @KafkaListener 接收消息:

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;@Component
public class ConsumerService {@KafkaListener(topics = "topic1", groupId = "myGroup")public void listen(ConsumerRecord<?, ?> record) {System.out.println("Received message: " + record.value());}
}

優缺點

  • 優點
    • 簡單易用,快速上手。
    • 與 Spring 生態系統無縫集成。
    • 支持事務、冪等性等高級特性。
  • 缺點
    • 適用于傳統的阻塞式應用,若需要響應式編程則不夠友好。

2. 使用 Spring Cloud Stream 與 Kafka Binder

Spring Cloud Stream 是一個構建消息驅動微服務的框架,通過 Binder(綁定器)與不同的消息中間件集成。使用 Kafka Binder,可以更加簡化 Kafka 與 Spring Boot 的集成。

步驟一:添加 Maven 依賴

pom.xml 中引入 spring-cloud-starter-stream-kafka 依賴:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>

并確保引入 Spring Cloud 的 BOM 以管理版本:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR12</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

步驟二:配置 application.yml

spring:cloud:stream:bindings:output:destination: topic1contentType: application/jsoninput:destination: topic1group: myGroupkafka:binder:brokers: worker1:9092,worker2:9092,worker3:9092

步驟三:編寫消息生產者

使用 @EnableBindingSource 接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;@Service
@EnableBinding(Source.class)
public class StreamProducerService {@Autowiredprivate Source source;public void sendMessage(String message) {source.output().send(MessageBuilder.withPayload(message).build());}
}

步驟四:編寫消息消費者

使用 @StreamListener 注解:

import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.stereotype.Component;@Component
@EnableBinding(Sink.class)
public class StreamConsumerService {@StreamListener(Sink.INPUT)public void handleMessage(String message) {System.out.println("Received message: " + message);}
}

優缺點

  • 優點
    • 高度抽象,減少配置與代碼量。
    • 更適合微服務架構,支持綁定多個輸入輸出。
    • 支持多種消息中間件,易于切換。
  • 缺點
    • 抽象層較高,可能難以實現一些細粒度的自定義配置。
    • 學習曲線較陡,需理解 Binder 和 Channel 的概念。

3. 使用 Spring for Apache Kafka Reactive(基于 Reactor)

對于需要響應式編程的應用,可以使用基于 Reactor 的 Spring Kafka Reactive 進行集成,實現非阻塞的消息處理。

步驟一:添加 Maven 依賴

目前,Spring Kafka 本身并未直接提供響應式支持,但可以結合 Project Reactor Kafka 使用。

引入 Reactor Kafka 依賴:

<dependency><groupId>io.projectreactor.kafka</groupId><artifactId>reactor-kafka</artifactId><version>1.3.11</version>
</dependency>

步驟二:配置 application.yml

kafka:bootstrap-servers: worker1:9092,worker2:9092,worker3:9092producer:key-serializer: org.apache.kafka.common.serialization.StringSerializervalue-serializer: org.apache.kafka.common.serialization.StringSerializerconsumer:group-id: myReactiveGroupkey-deserializer: org.apache.kafka.common.serialization.StringDeserializervalue-deserializer: org.apache.kafka.common.serialization.StringDeserializerauto-offset-reset: earliest

步驟三:編寫響應式消息生產者

使用 SenderOptionsKafkaSender

import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import reactor.kafka.sender.KafkaSender;
import reactor.kafka.sender.SenderOptions;
import reactor.kafka.sender.SenderRecord;
import reactor.core.publisher.Mono;import java.util.HashMap;
import java.util.Map;@Service
public class ReactiveProducerService {@Value("${kafka.bootstrap-servers}")private String bootstrapServers;@Beanpublic SenderOptions<String, String> senderOptions() {Map<String, Object> props = new HashMap<>();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);return SenderOptions.create(props);}@Beanpublic KafkaSender<String, String> kafkaSender(SenderOptions<String, String> senderOptions) {return KafkaSender.create(senderOptions);}public Mono<Void> sendMessage(String topic, String key, String value) {SenderRecord<String, String, Integer> record = SenderRecord.create(new org.apache.kafka.clients.producer.ProducerRecord<>(topic, key, value),1);return kafkaSender(senderOptions()).send(Mono.just(record)).then();}
}

步驟四:編寫響應式消息消費者

使用 ReceiverOptionsKafkaReceiver

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.kafka.receiver.KafkaReceiver;
import reactor.kafka.receiver.ReceiverOptions;
import reactor.kafka.receiver.ReceiverRecord;import java.util.HashMap;
import java.util.Map;@Service
public class ReactiveConsumerService {@Value("${kafka.bootstrap-servers}")private String bootstrapServers;@Value("${kafka.consumer.group-id}")private String groupId;@Beanpublic ReceiverOptions<String, String> receiverOptions() {Map<String, Object> props = new HashMap<>();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");ReceiverOptions<String, String> receiverOptions = ReceiverOptions.create(props);return receiverOptions.subscription(java.util.Collections.singleton("topic1"));}@Beanpublic Flux<ReceiverRecord<String, String>> kafkaFlux(ReceiverOptions<String, String> receiverOptions) {return KafkaReceiver.create(receiverOptions).receive();}public void consumeMessages() {kafkaFlux(receiverOptions()).doOnNext(record -> {System.out.println("Received: " + record.value());record.receiverOffset().acknowledge();}).subscribe();}
}

優缺點

  • 優點
    • 支持響應式編程模型,適用于高并發和非阻塞場景。
    • 更高的資源利用率和吞吐量。
  • 缺點
    • 相較于傳統阻塞式,開發復雜度更高。
    • 需要理解 Reactor 和響應式編程的基本概念。

4. 手動配置 Producer 和 Consumer Bean

對于需要更高自定義配置的應用,可以手動配置 ProducerFactory, ConsumerFactory, KafkaTemplateConcurrentKafkaListenerContainerFactory 等 Bean。

步驟一:添加 Maven 依賴

pom.xml 中引入 spring-kafka 依賴:

<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId>
</dependency>

步驟二:編寫 Kafka 配置類

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.*;import java.util.HashMap;
import java.util.Map;@Configuration
@EnableKafka
public class KafkaManualConfig {@Value("${kafka.bootstrap-servers}")private String bootstrapServers;@Value("${kafka.consumer.group-id}")private String groupId;// Producer 配置@Beanpublic ProducerFactory<String, String> producerFactory() {Map<String, Object> configProps = new HashMap<>();configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,bootstrapServers);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());}// Consumer 配置@Beanpublic ConsumerFactory<String, String> consumerFactory() {Map<String, Object> props = new HashMap<>();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,bootstrapServers);props.put(ConsumerConfig.GROUP_ID_CONFIG,groupId);props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);// 其他自定義配置return new DefaultKafkaConsumerFactory<>(props);}// KafkaListenerContainerFactory@Beanpublic ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {ConcurrentKafkaListenerContainerFactory<String, String> factory =new ConcurrentKafkaListenerContainerFactory<>();factory.setConsumerFactory(consumerFactory());// 其他自定義配置,如并發數、批量消費等return factory;}
}

步驟三:編寫消息生產者和消費者

Producer 示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;@Service
public class ManualProducerService {@Autowiredprivate KafkaTemplate<String, String> kafkaTemplate;private static final String TOPIC = "topic1";public void sendMessage(String message) {kafkaTemplate.send(TOPIC, message);}
}

Consumer 示例:

import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;@Component
public class ManualConsumerService {@KafkaListener(topics = "topic1", groupId = "myGroup")public void listen(String message) {System.out.println("Received message: " + message);}
}

優缺點

  • 優點
    • 高度自定義,適用于復雜配置需求。
    • 可以靈活配置多個 KafkaTemplateKafkaListenerContainerFactory,適應多種場景。
  • 缺點
    • 配置較為繁瑣,代碼量增加。
    • 需要深入理解 Spring Kafka 的配置與使用。

5. 使用 Spring Integration Kafka

Spring Integration 提供了對 Kafka 的集成支持,適用于需要集成多種消息渠道和復雜消息路由的應用。

步驟一:添加 Maven 依賴

pom.xml 中引入 spring-integration-kafka 依賴:

<dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-kafka</artifactId><version>3.3.5.RELEASE</version>
</dependency>

步驟二:編寫 Kafka Integration 配置

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.kafka.inbound.KafkaMessageDrivenChannelAdapter;
import org.springframework.integration.kafka.outbound.KafkaProducerMessageHandler;
import org.springframework.kafka.core.*;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;import java.util.HashMap;
import java.util.Map;@Configuration
public class SpringIntegrationKafkaConfig {@Beanpublic ProducerFactory<String, String> producerFactory() {Map<String, Object> props = new HashMap<>();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"worker1:9092,worker2:9092,worker3:9092");props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class);props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class);return new DefaultKafkaProducerFactory<>(props);}@Beanpublic KafkaTemplate<String, String> kafkaTemplate() {return new KafkaTemplate<>(producerFactory());}// 消費者工廠@Beanpublic ConsumerFactory<String, String> consumerFactory() {Map<String, Object> props = new HashMap<>();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"worker1:9092,worker2:9092,worker3:9092");props.put(ConsumerConfig.GROUP_ID_CONFIG,"myGroup");props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);return new DefaultKafkaConsumerFactory<>(props);}// 輸入通道@Beanpublic MessageChannel inputChannel() {return new DirectChannel();}// 消費者適配器@Beanpublic KafkaMessageDrivenChannelAdapter<String, String> kafkaMessageDrivenChannelAdapter() {KafkaMessageDrivenChannelAdapter<String, String> adapter =new KafkaMessageDrivenChannelAdapter<>(consumerFactory(), "topic1");adapter.setOutputChannel(inputChannel());return adapter;}// 消費者處理器@Bean@ServiceActivator(inputChannel = "inputChannel")public MessageHandler messageHandler() {return message -> {String payload = (String) message.getPayload();System.out.println("Received message: " + payload);};}// 輸出通道@Beanpublic MessageChannel outputChannel() {return new DirectChannel();}// 生產者處理器@Bean@ServiceActivator(inputChannel = "outputChannel")public MessageHandler producerMessageHandler(KafkaTemplate<String, String> kafkaTemplate) {KafkaProducerMessageHandler<String, String> handler =new KafkaProducerMessageHandler<>(kafkaTemplate);handler.setTopicExpressionString("'topic1'");return handler;}
}

步驟三:發送消息到輸出通道

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;@Service
public class IntegrationProducerService {@Autowiredprivate MessageChannel outputChannel;public void sendMessage(String message) {outputChannel.send(MessageBuilder.withPayload(message).build());}
}

優缺點

  • 優點
    • 強大的消息路由和轉換功能,適用于復雜集成場景。
    • 可以與 Spring Integration 的其他模塊無縫協作。
  • 缺點
    • 配置復雜,學習成本較高。
    • 對于簡單的 Kafka 集成場景,可能顯得過于臃腫。

6. 在測試中使用嵌入式 Kafka

在集成測試中,使用嵌入式 Kafka 可以避免依賴外部 Kafka 集群,提升測試效率與穩定性。

步驟一:添加 Maven 依賴

pom.xml 中引入 spring-kafka-test 依賴:

<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka-test</artifactId><scope>test</scope>
</dependency>

步驟二:編寫測試類

使用 @EmbeddedKafka 注解啟動嵌入式 Kafka:

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.test.EmbeddedKafkaBroker;
import org.springframework.kafka.test.context.EmbeddedKafka;
import org.springframework.kafka.test.utils.KafkaTestUtils;import java.util.Map;@SpringBootTest
@EmbeddedKafka(partitions = 1, topics = { "topic1" }, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" })
public class KafkaIntegrationTest {@Autowiredprivate EmbeddedKafkaBroker embeddedKafkaBroker;private static Consumer<String, String> consumer;@BeforeAllpublic static void setUp(@Autowired EmbeddedKafkaBroker embeddedKafkaBroker) {Map<String, Object> consumerProps = KafkaTestUtils.consumerProps("testGroup", "true", embeddedKafkaBroker);consumerProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);consumerProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);DefaultKafkaConsumerFactory<String, String> consumerFactory = new DefaultKafkaConsumerFactory<>(consumerProps);consumer = consumerFactory.createConsumer();embeddedKafkaBroker.consumeFromAnEmbeddedTopic(consumer, "topic1");}@AfterAllpublic static void tearDown() {if (consumer != null) {consumer.close();}}@Testpublic void testSendAndReceive() {// 發送消息// 假設有一個 ProducerService 可以發送消息// producerService.sendMessage("Hello, Kafka!");// 接收消息// Consumer Record 驗證邏輯// 可以使用 KafkaTestUtils 來接收消息并斷言}
}

優缺點

  • 優點
    • 不依賴外部 Kafka 集群,適合 CI/CD 環境。
    • 提升測試的可重復性與穩定性。
  • 缺點
    • 嵌入式 Kafka 啟動較慢,可能影響測試速度。
    • 需要額外配置,測試代碼復雜度增加。

總結

在 Spring Boot 中集成 Kafka 有多種方式,每種方式適用于不同的應用場景和需求:

  1. Spring Kafka (KafkaTemplate@KafkaListener)
    適用于大多數常規應用,簡單易用,與 Spring 生態系統無縫集成。

  2. Spring Cloud Stream 與 Kafka Binder
    適用于微服務架構,需處理復雜消息路由與多中間件支持的場景。

  3. Spring for Apache Kafka Reactive
    適用于需要響應式編程模型、高并發和非阻塞消息處理的應用。

  4. 手動配置 Producer 和 Consumer Bean
    適用于需要高度自定義 Kafka 配置和行為的應用。

  5. Spring Integration Kafka
    適用于復雜集成場景,需要與其他消息渠道和系統協作的應用。

  6. 嵌入式 Kafka 在測試中使用
    適用于編寫集成測試,提升測試效率和穩定性。

根據項目的具體需求,選擇最合適的集成方式能夠有效提升開發效率,確保應用的穩定性與可擴展性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65298.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65298.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65298.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

生物醫學信號處理--緒論

前言 參考書籍&#xff1a;劉海龍&#xff0c;生物醫學信號處理&#xff0c;化學工業出版社 生物醫學信號分類 1、由生理過程自發或者誘發產生的電生理信號和非電生理信號 ? 電生理信號&#xff1a;ECG/心電、EEG/腦電、EMG/肌電、 EGG/胃電、 EOG/眼電 ? 非電生理信號&am…

unity 播放 序列幀圖片 動畫

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、方法一&#xff1a;代碼控制播放序列幀1、設置圖片屬性2、創建Image組件3、簡單的代碼控制4、掛載代碼并賦值 二、方法二&#xff1a;直接使用1.Image上添加…

QT c++ 自定義按鈕類 加載圖片 美化按鈕

如果你有需要利用圖片美化按鈕的情況&#xff0c;本文能幫助你。 鼠標左鍵按下按鈕和松開&#xff0c;按鈕顯示不同的圖片。 1.按鈕類 //因為此類比較簡單&#xff0c;1個頭文件搞定&#xff0c;沒有cpp文件 #ifndef CUSTOMBUTTON_H #define CUSTOMBUTTON_H #include <Q…

web漏洞之文件包含漏洞

一、文件包含漏洞 1、把DVWA頁面改為low級別&#xff0c;然后點擊File Inclusion頁面 文件包含漏洞有四種include()/require()/include_once()/require_once() 常見的文件包含漏洞代碼如下 <?php$file$_GET[filename]; filename隨意定義include($file); ?> -----…

小程序與物聯網(IoT)融合:開啟智能生活新篇章

一、引言 隨著移動互聯網技術的飛速發展&#xff0c;小程序作為一種輕量級的應用形式&#xff0c;憑借其無需下載安裝、即用即走的特點&#xff0c;迅速滲透到人們生活的各個領域。與此同時&#xff0c;物聯網&#xff08;IoT&#xff09;技術也在不斷進步&#xff0c;將各種物…

Ubuntu無法創建python venv環境

排查步驟如下 1. python3 -m venv venv he virtual environment was not created successfully because ensurepip is not available. On Debian/Ubuntu systems, you need to install the python3-venv package using the following command.apt install python3.8-venvYou…

如何很快將文件轉換成另外一種編碼格式?編碼?按指定編碼格式編譯?如何檢測文件編碼格式?Java .class文件編碼和JVM運行期內存編碼?

如何很快將文件轉換成另外一種編碼格式? 利用VS Code右下角的"選擇編碼"功能&#xff0c;選擇"通過編碼保存"可以很方便將文件轉換成另外一種編碼格式。尤其&#xff0c;在測試w/ BOM或w/o BOM, 或者ANSI編碼和UTF編碼轉換&#xff0c;特別方便。VS文件另…

PCL點云庫入門——PCL庫點云特征之PFH點特征直方圖(Point Feature Histograms -PHF)

1、算法原理 PFH點&#xff08;Point Feature Histogram&#xff09;特征直方圖的原理涉及利用參數化查詢點與鄰域點之間的空間差異&#xff0c;并構建一個多維直方圖以捕捉點的k鄰域幾何屬性。這個高維超空間為特征表示提供了一個可度量的信息空間&#xff0c;對于點云對應曲面…

5. CSS引入方式

5.1 CSS的三種樣式 按照 CSS 樣式書寫的位置(或者引入的方式)&#xff0c;CSS樣式表可以分為三大類&#xff1a; 1.行內樣式表&#xff08;行內式&#xff09; 2.內部樣式表&#xff08;嵌入式&#xff09; 3. 外部樣式表&#xff08;鏈接式&#xff09; 5.2 內部樣式表 …

為什么ip屬地一會河南一會江蘇

在使用互聯網的過程中&#xff0c;許多用戶可能會遇到這樣一個問題&#xff1a;自己的IP屬地一會兒顯示為河南&#xff0c;一會兒又變成了江蘇。這種現象可能會讓人感到困惑&#xff0c;甚至產生疑慮&#xff0c;擔心自己的網絡活動是否受到了某種影響。為了解答這一疑問&#…

unity3d-搞個場景漫游如何實現Alpha

要處理兩個問題&#xff1a; 如何設置地面人不掉下去 方法一、 游戲物體加剛體&#xff0c;將游戲物體和地面加collider。如果是地形&#xff0c;可以使用 Terrain Collider&#xff1b;如果是簡單的平面&#xff0c;可以添加 Box Collider 或者 Mesh Collider&#xff08;如果…

git merge rebase

merge操作 Git自己分支合并dev分支 rebase 操作 git rebase

doris 2.1 temporay partition 測試及總結

測試步驟 創建表 drop table order_info_shuffle; CREATE TABLE order_info_shuffle ( order_id varchar(20), user_id varchar(20), goods_id

jmeter性能測試例子

目錄 一、介紹 二、操作例子 設置線程數 添加同步定時器 添加聚合報告 一、介紹 在軟件測試中&#xff0c;一般用jmeter來對接口做性能測試&#xff0c;對對接口進行一個壓力的測試。 簡述&#xff1a; 在接口的線程中設置線程的數量和時間&#xff0c;添加一個定時器…

C# 設計模式(行為型模式):解釋器模式

C# 設計模式&#xff08;行為型模式&#xff09;&#xff1a;解釋器模式 (Interpreter Pattern) 什么是解釋器模式&#xff1f; 解釋器模式&#xff08;Interpreter Pattern&#xff09;是一種行為型設計模式&#xff0c;用于定義一種語言的語法表示&#xff0c;并提供一個解釋…

ubuntu16 重啟之后lvm信息丟失故障恢復

一、背景 1、問題背景 業務有一臺物理開發服務器&#xff0c;文件系統有損壞&#xff1b;由于重啟時沒有檢查&#xff0c;導致重啟卡住。后面通過斷電重新啟動之后&#xff0c;無法進入系統&#xff1b;進入救援模式&#xff0c;注釋數據盤掛載。重啟之后進入系統&#xff0c…

React函數組件中與生命周期相關Hooks詳解

React 函數組件及其鉤子渲染流程是 React 框架中的核心概念之一。以下是對該流程的詳細解析&#xff1a; 一、React 函數組件基礎 定義&#xff1a; React 函數組件是一個接收 props 作為參數并返回 React 元素的函數。它們通常用于表示 UI 的一部分&#xff0c;并且不保留內部…

水一篇水水水

為了拿推廣卷&#xff0c;但不想把我原本完整的文章拆成零散的多篇&#xff0c;只能出此下策隨便發一篇&#xff0c;認真寫的都筆記專欄里 網絡是由若干節點和連接這些節點的鏈路構成&#xff0c;表示諸多對象及其相互聯系。 在1999年之前&#xff0c;人們一般認為網絡的結構都…

PDFelement 特別版

Wondershare PDFelement Pro 是一款非常強大的PDF編輯軟件&#xff0c;它允許用戶輕松地編輯、轉換、創建和管理PDF文件。這個中文特別版的軟件具有許多令人印象深刻的功能&#xff0c;PDFelement Pro 提供了豐富的編輯功能&#xff0c;可以幫助用戶直接在PDF文件中添加、刪除、…