?1、前言
? ? ? ? 圣誕節(jié)的到來,程序員不會(huì)收到圣誕老人的??,但可以自己滿足一下自己,所以,趁著有時(shí)間,就記錄一下這會(huì)兒擼了些什么代碼吧?。?!
????????因?yàn)闃I(yè)務(wù)原因,需要在系統(tǒng)內(nèi)新增其他的kakfa配置使用,所以今天研究的是怎么在系統(tǒng)內(nèi)整合多套kafka配置使用。
2、整合kafka實(shí)踐
首先,引入pom依賴,我的版本是 2.3.1?:
<dependency>
? ? <groupId>org.springframework.kafka</groupId>
? ? <artifactId>spring-kafka</artifactId>
</dependency>
然后,設(shè)置properties配置:
spring.kafka.bootstrap-servers=127.0.0.1:9090,127.0.0.1:9091,127.0.0.1:9092
spring.kafka2.bootstrap-servers=127.0.0.2:9090,127.0.0.2:9091,127.0.0.2:9092
?另外還可以設(shè)置很多其他配置,例如生產(chǎn)者、消費(fèi)者各自的消息序列化、消費(fèi)模式等等,
具體的配置樣例,請(qǐng)參考如下:
#################consumer的配置參數(shù)(開始)#################
#如果'enable.auto.commit'為true,則消費(fèi)者偏移自動(dòng)提交給Kafka的頻率(以毫秒為單位),默認(rèn)值為5000。
spring.kafka.consumer.auto-commit-interval;
#當(dāng)Kafka中沒有初始偏移量或者服務(wù)器上不再存在當(dāng)前偏移量時(shí)該怎么辦,默認(rèn)值為latest,表示自動(dòng)將偏移重置為最新的偏移量
# latest:不存在offset時(shí),消費(fèi)最新的消息
# earliest:不存在offset時(shí),從最早消息開始消費(fèi)
# none :不存在offset時(shí),直接報(bào)錯(cuò)
spring.kafka.consumer.auto-offset-reset=latest;
#以逗號(hào)分隔的主機(jī):端口對(duì)列表,用于建立與Kafka群集的初始連接。
spring.kafka.consumer.bootstrap-servers;
#ID在發(fā)出請(qǐng)求時(shí)傳遞給服務(wù)器;用于服務(wù)器端日志記錄。
spring.kafka.consumer.client-id;
#如果為true,則消費(fèi)者的偏移量將在后臺(tái)定期提交,默認(rèn)值為true
spring.kafka.consumer.enable-auto-commit=true;
#如果沒有足夠的數(shù)據(jù)立即滿足“fetch.min.bytes”給出的要求,服務(wù)器在回答獲取請(qǐng)求之前將阻塞的最長(zhǎng)時(shí)間(以毫秒為單位)
#默認(rèn)值為500
spring.kafka.consumer.fetch-max-wait;
#服務(wù)器應(yīng)以字節(jié)為單位返回獲取請(qǐng)求的最小數(shù)據(jù)量,默認(rèn)值為1,對(duì)應(yīng)的kafka的參數(shù)為fetch.min.bytes。
spring.kafka.consumer.fetch-min-size;
#用于標(biāo)識(shí)此使用者所屬的使用者組的唯一字符串。
spring.kafka.consumer.group-id;
#心跳與消費(fèi)者協(xié)調(diào)員之間的預(yù)期時(shí)間(以毫秒為單位),默認(rèn)值為3000
spring.kafka.consumer.heartbeat-interval;
#密鑰的反序列化器類,實(shí)現(xiàn)類實(shí)現(xiàn)了接口org.apache.kafka.common.serialization.Deserializer
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
#值的反序列化器類,實(shí)現(xiàn)類實(shí)現(xiàn)了接口org.apache.kafka.common.serialization.Deserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
#一次調(diào)用poll()操作時(shí)返回的最大記錄數(shù),默認(rèn)值為500
spring.kafka.consumer.max-poll-records;
#################consumer的配置參數(shù)(結(jié)束)#################
#################producer的配置參數(shù)(開始)#################
#procedure要求leader在考慮完成請(qǐng)求之前收到的確認(rèn)數(shù),用于控制發(fā)送記錄在服務(wù)端的持久化,其值可以為如下:
#acks = 0 如果設(shè)置為零,則生產(chǎn)者將不會(huì)等待來自服務(wù)器的任何確認(rèn),該記錄將立即添加到套接字緩沖區(qū)并視為已發(fā)送。在這種情況下,無(wú)法保證服務(wù)器已收到記錄,并且重試配置將不會(huì)生效(因?yàn)榭蛻舳送ǔ2粫?huì)知道任何故障),為每條記錄返回的偏移量始終設(shè)置為-1。
#acks = 1 這意味著leader會(huì)將記錄寫入其本地日志,但無(wú)需等待所有副本服務(wù)器的完全確認(rèn)即可做出回應(yīng),在這種情況下,如果leader在確認(rèn)記錄后立即失敗,但在將數(shù)據(jù)復(fù)制到所有的副本服務(wù)器之前,則記錄將會(huì)丟失。
#acks = all 這意味著leader將等待完整的同步副本集以確認(rèn)記錄,這保證了只要至少一個(gè)同步副本服務(wù)器仍然存活,記錄就不會(huì)丟失,這是最強(qiáng)有力的保證,這相當(dāng)于acks = -1的設(shè)置。
#可以設(shè)置的值為:all, -1, 0, 1
spring.kafka.producer.acks=1
#每當(dāng)多個(gè)記錄被發(fā)送到同一分區(qū)時(shí),生產(chǎn)者將嘗試將記錄一起批量處理為更少的請(qǐng)求,
#這有助于提升客戶端和服務(wù)器上的性能,此配置控制默認(rèn)批量大?。ㄒ宰止?jié)為單位),默認(rèn)值為16384
spring.kafka.producer.batch-size=16384
#以逗號(hào)分隔的主機(jī):端口對(duì)列表,用于建立與Kafka群集的初始連接
spring.kafka.producer.bootstrap-servers
#生產(chǎn)者可用于緩沖等待發(fā)送到服務(wù)器的記錄的內(nèi)存總字節(jié)數(shù),默認(rèn)值為33554432
spring.kafka.producer.buffer-memory=33554432
#ID在發(fā)出請(qǐng)求時(shí)傳遞給服務(wù)器,用于服務(wù)器端日志記錄
spring.kafka.producer.client-id
#生產(chǎn)者生成的所有數(shù)據(jù)的壓縮類型,此配置接受標(biāo)準(zhǔn)壓縮編解碼器('gzip','snappy','lz4'),
#它還接受'uncompressed'以及'producer',分別表示沒有壓縮以及保留生產(chǎn)者設(shè)置的原始?jí)嚎s編解碼器,
#默認(rèn)值為producer
spring.kafka.producer.compression-type=producer
#key的Serializer類,實(shí)現(xiàn)類實(shí)現(xiàn)了接口org.apache.kafka.common.serialization.Serializer
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
#值的Serializer類,實(shí)現(xiàn)類實(shí)現(xiàn)了接口org.apache.kafka.common.serialization.Serializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
#如果該值大于零時(shí),表示啟用重試失敗的發(fā)送次數(shù)
spring.kafka.producer.retries
#################producer的配置參數(shù)(結(jié)束)#################
#################listener的配置參數(shù)(結(jié)束)#################
#偵聽器的AckMode,參見https://docs.spring.io/spring-kafka/reference/htmlsingle/#committing-offsets
#當(dāng)enable.auto.commit的值設(shè)置為false時(shí),該值會(huì)生效;為true時(shí)不會(huì)生效
spring.kafka.listener.ack-mode;
#在偵聽器容器中運(yùn)行的線程數(shù)
spring.kafka.listener.concurrency;
#輪詢消費(fèi)者時(shí)使用的超時(shí)(以毫秒為單位)
spring.kafka.listener.poll-timeout;
#當(dāng)ackMode為“COUNT”或“COUNT_TIME”時(shí),偏移提交之間的記錄數(shù)
spring.kafka.listener.ack-count;
#當(dāng)ackMode為“TIME”或“COUNT_TIME”時(shí),偏移提交之間的時(shí)間(以毫秒為單位)
spring.kafka.listener.ack-time;
#################listener的配置參數(shù)(結(jié)束)#################
最后,編寫kafka的config配置類:
package ***.***.***.kafka;
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.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import java.util.HashMap;
import java.util.Map;
@Configuration
@EnableKafka
public class KafkaConfiuration {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServer;
@Value("${spring.kafka2.bootstrap-servers}")
private String bootstrapServer2;
@Bean("kafkaTemplateOne")
public KafkaTemplate<String, String> oneReqKafkaTemplate() {
return new KafkaTemplate<>(oneEnquiryReqFactory());
}
@Bean
public ProducerFactory<String, String> oneEnquiryReqFactory() {
return new DefaultKafkaProducerFactory<>(oneProducerConfigs());
}
@Bean
public Map<String, Object> oneProducerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServer);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return props;
}
@Bean("kafkaTemplateTwo")
public KafkaTemplate<String, String> twoKafkaTemplate() {
return new KafkaTemplate<>(twoFactory());
}
@Bean
public ProducerFactory<String, String> twoFactory() {
return new DefaultKafkaProducerFactory<>(twoProducerConfigs());
}
@Bean
public Map<String, Object> twoProducerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServer2);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return props;
}
}
配置完成之后,就可以直接使用啦:
package ***.***.***.controller;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class KafkaTestController {
@Resource(name = "kafkaTemplateOne")
private KafkaTemplate<String, String> kafkaTemplateOne;
@Resource(name = "kafkaTemplateTwo")
private KafkaTemplate<String, String> kafkaTemplateTwo;
private final static String TOPIC1 = "testTopic1";
private final static String TOPIC2 = "testTopic2";
@PostMapping("/testKafka")
public void testKafka(){
kafkaTemplateOne.send(TOPIC1,"test message 1");
kafkaTemplateTwo.send(TOPIC2,"test message 2");
}
@KafkaListener(groupId = "TOPIC_DATA_ACCOUNT_GROUPID",topics = TOPIC1)
public void receiveMsg(String msg){
System.out.println(TOPIC1+" 接收到的消息是:"+msg);
}
@KafkaListener(groupId = "TOPIC_DATA_ACCOUNT_GROUPID",topics = TOPIC2)
public void receiveMsg1(String msg){
System.out.println(TOPIC2+" 接收到的消息是:"+msg);
}
}
效果如下:
2022-11-15 18:35:28,973 [kafka-producer-network-thread | producer-2] [] INFO (Metadata.java:261)- [Producer clientId=producer-2] Cluster ID: SrufjpSTQpiu0QseCKbwYg
testTopic2 接收到的消息是:test message 2
testTopic1 接收到的消息是:test message 1
3、總結(jié)
????????本次的記錄內(nèi)容,只是簡(jiǎn)單的demo實(shí)踐,具體的使用情況,可以根據(jù)自身系統(tǒng)設(shè)置詳細(xì)配置處理。
????????若有疑問,歡迎留言討論~~。
????????最后祝大家圣誕節(jié)快樂,新年快到了,繼續(xù)加油吧?。?!文章來源:http://www.zghlxwxcb.cn/news/detail-427534.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-427534.html
到了這里,關(guān)于【消息中間件MQ系列】Spring整合kafka并設(shè)置多套kafka配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!