被kafka-client和springkafka版本坑到自閉及解決
被kafka-client和springkafka版本坑
上周剛剛歡天喜地的在linux上部了kafka,這周打算用spring-boot框架寫(xiě)個(gè)簡(jiǎn)單demo跑一下,結(jié)果悲劇就此展開(kāi)。
首先建立maven工程:pom中添加spring boot kafka依賴(lài):
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ? ?xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ? ?<modelVersion>4.0.0</modelVersion> ? ?<parent> ? ? ? <groupId>org.springframework.boot</groupId> ? ? ? <artifactId>spring-boot-starter-parent</artifactId> ? ? ? <version>2.1.5.RELEASE</version> ? ? ? <relativePath/> <!-- lookup parent from repository --> ? ?</parent> ? ?<groupId>com.example</groupId> ? ?<artifactId>kafkaproducer</artifactId> ? ?<version>0.0.1-SNAPSHOT</version> ? ?<name>kafkaproducer</name> ? ?<description>Demo project for Spring Boot</description> ? ? ?<properties> ? ? ? <java.version>1.8</java.version> ? ?</properties> ? ? ?<dependencies> ? ? ? <dependency> ? ? ? ? ?<groupId>org.springframework.boot</groupId> ? ? ? ? ?<artifactId>spring-boot-starter-web</artifactId> ? ? ? </dependency> ? ? ? ? <dependency> ? ? ? ? ?<groupId>org.projectlombok</groupId> ? ? ? ? ?<artifactId>lombok</artifactId> ? ? ? ? ?<optional>true</optional> ? ? ? </dependency> ? ? ? <dependency> ? ? ? ? ?<groupId>org.springframework.boot</groupId> ? ? ? ? ?<artifactId>spring-boot-starter-test</artifactId> ? ? ? ? ?<scope>test</scope> ? ? ? </dependency> ? ? ? <dependency> ? ? ? ? ?<groupId>org.springframework.kafka</groupId> ? ? ? ? ?<artifactId>spring-kafka</artifactId> ? ? ? </dependency> ? ?</dependencies> ? ? ?<build> ? ? ? <plugins> ? ? ? ? ?<plugin> ? ? ? ? ? ? <groupId>org.springframework.boot</groupId> ? ? ? ? ? ? <artifactId>spring-boot-maven-plugin</artifactId> ? ? ? ? ?</plugin> ? ? ? </plugins> ? ?</build> ? ? </project>
配置文件如下:
server.port=8089 spring.kafka.bootstrap-servers=ip:port spring.kafka.producer.retries= 0 spring.kafka.producer.batch-size=16384 spring.kafka.producer.buffer-memory=33554432 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.linger.ms=1
然后新建一個(gè)Producer類(lèi)
package com.example.kafkaproducer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; ? @Component public class KafkaProducer { ? ? @Autowired ? ? KafkaTemplate kafkaTemplate; ? ? public void produce(){ ? ? ? ? kafkaTemplate.send("test","hello word"); ? ? ? ? System.out.println("發(fā)送消息"); ? ? } }
在test類(lèi)中調(diào)用
package com.example.kafkaproducer;?? import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;? ? @RunWith(SpringRunner.class) @SpringBootTest public class KafkaproducerApplicationTests {? ? ?@Autowired KafkaProducer kafkaProducer;? ? ?@Test ? ?public void contextLoads() { ? ? ? kafkaProducer.produce(); ? ?}? }
然后控制臺(tái)就會(huì)打印一個(gè)莫名奇妙的錯(cuò)誤,沒(méi)有打印任何堆棧信息,大概意思只是表達(dá)了連接不上。
Exception thrown when sending a message with key='null' and payload='' to topic
telnet ip+port 是可以通的
隨后發(fā)現(xiàn),xshell上啟動(dòng)的kafka-server在報(bào)這樣一個(gè)錯(cuò),更詳細(xì)的沒(méi)有留存。
ERROR Closing socket for /127.0.0.1 because of error (kafka.network.Processor)
kafka.common.KafkaException: Wrong request type 18
百度了一下,很可能是Linux上的kafka版本和pom中引入的spring-kafka依賴(lài)不匹配造成的,于是查看對(duì)應(yīng)關(guān)系。
查看kafka,發(fā)現(xiàn)裝的是一個(gè)0.8.2.1 版本的kafka,該版本的kafka是2015年3月發(fā)布的版本,可以說(shuō)是十分古老,真是不知道為什么當(dāng)初要選這么老的版本。
換了幾次spring-kafka的pom之后,依然在報(bào)這個(gè)問(wèn)題,于是我選擇換更新的kafka的包。
換了2.2.0版本kafka的包,問(wèn)題得到解決。
其中consumer的創(chuàng)建命令和老版本的不太一樣,且consumer和producer需使用相同的端口號(hào),而不是像之前producer配置為broker的端口,consumer配置為zookeeper的端口號(hào)。
./bin/kafka-console-consumer.sh --bootstrap-server ip:9092 ?--topic test
且config文件夾下server.properties文件中的一些配置和之前不太一樣,需要注意的是,以下兩行配置原來(lái)是被注解了的,需要在這里取消掉注解,并配置自己的ip。
listeners = PLAINTEXT://your.host.name:9092 advertised.listeners=PLAINTEXT://your.host.name:9092
springboot、spring-kafka、kafka-client三者兼容性關(guān)系
spring官方描述的spring-kafka的版本和kafka-clients的版本對(duì)應(yīng)關(guān)系:
官方地址:https://spring.io/projects/spring-kafka
中間列:“Spring Integration for Apache Kafka Version 可忽略不看:
也就是說(shuō)spring-kafka與spring-client是存在在一對(duì)多關(guān)系的,那是不是他所有的spring-client都可以選呢?
接著往下看(摘自官網(wǎng)):
他說(shuō)啥 ?
- springboot 1.5 你應(yīng)該用的是spring-kafka 1.3.x.
- springboot2.0你應(yīng)該使用的是spring-kafka2.0.x.
- 如果用的是spring boot2.1.x,那么你必須使用spring-kafka的版本是2.2.x。否則就會(huì)出現(xiàn)noClass等等各種異常。
- spring-kafka的版本是2.1默認(rèn)使用的spring-client是1.1.x,當(dāng)你要使用另外兩個(gè)時(shí),你就要使用如下的版本配置.
- 如果你用的是2.2.x的spring-kafka,只看第一張圖,你會(huì)以為2.1.x的kafka-clients也可以用。但是spring說(shuō)了,此時(shí)默認(rèn)用的kafka-clients是2.0.x,如果你想用2.1.x,必須看文檔附錄,下圖的大概意思,必須換掉下圖所示的所有依賴(lài)版本。
也就是說(shuō)并不是一對(duì)多 他默認(rèn)的還是只有一個(gè)kafka-client來(lái)給你的,你要選其他的可以的,你添加一些額外配置
例如:
Spring Boot 2.1.0.RELEASE 版本,因此 spring-kafka 的版本為 2.2.0.RELEASE,kafka-clients 的默認(rèn)版本為2.0.0,所以 kafka 的版本選用為 kafka_2.11-2.1.0 (前面的2.11代表的是Scala的版本后面為kafka的版本號(hào))
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java獲取文件的inode標(biāo)識(shí)符的方法
這篇文章主要介紹了java獲取文件的inode標(biāo)識(shí)符,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04springboot整合curator實(shí)現(xiàn)分布式鎖過(guò)程
這篇文章主要介紹了springboot整合curator實(shí)現(xiàn)分布式鎖過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05java如何實(shí)現(xiàn)自動(dòng)生成數(shù)據(jù)庫(kù)設(shè)計(jì)文檔
以前我們還需要手寫(xiě)數(shù)據(jù)庫(kù)設(shè)計(jì)文檔、現(xiàn)在可以通過(guò)引入screw核心包來(lái)實(shí)現(xiàn)Java?數(shù)據(jù)庫(kù)文檔一鍵生成。本文將具體介紹一下如何通過(guò)java自動(dòng)生成數(shù)據(jù)庫(kù)設(shè)計(jì)文檔,需要的朋友可以參考下2021-11-11解析如何用兩個(gè)棧來(lái)實(shí)現(xiàn)隊(duì)列的方法
本篇文章是對(duì)如何用兩個(gè)棧實(shí)現(xiàn)隊(duì)列的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Spring實(shí)現(xiàn)擁有者權(quán)限驗(yàn)證的方法示例
這篇文章主要介紹了Spring實(shí)現(xiàn)擁有者權(quán)限驗(yàn)證的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03