依赖
Maven
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
配置文件
spring:
kafka:
# 地址
bootstrap-servers: 自己链接的地址,不给这一项时会默认链接本地的 9092端口
# 消费者配置
consumer:
group-id: kafka-demo-kafka-group
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer #关键字的序列化类
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer #值的序列化类
# 账号密码配置 如果设置了
properties:
sasl.mechanism: PLAIN
security.protocol: SASL_PLAINTEXT
sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="访问用户名" password="访问密码";
# 生产者配置
producer:
group-id: kafka-demo-kafka-group
key-serializer: org.apache.kafka.common.serialization.StringSerializer #关键字的序列化类
value-serializer: org.apache.kafka.common.serialization.StringSerializer #值的序列化类
# 账号密码配置 如果设置了
properties:
session.timeout.ms: 15000
sasl.mechanism: PLAIN
security.protocol: SASL_PLAINTEXT
sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="访问用户名" password="访问密码";
消费者 (Consumer)
注意文件一定要在spring 扫描的路径下
Slf4j 仅为日志 ,如果不用 lombok 可以去除不要
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class KafkaConsumer {
/**
* 构建消费者
* @param consumerRecord 消费记录
*/
@KafkaListener(topics = {
"kafa_test_topic"})
public void handleKafkaMessage(ConsumerRecord<String, String> consumerRecord){
log.info("receive kafka message: value:{}, 偏移量:{}, partition:{}", consumerRecord.value(),
consumerRecord.offset(), consumerRecord.partition());
}
}
生产者(Producer)
使用 kafka 提供的 KafkaTemplate 来完成消息的发送
发送时可以进一步简化入参,具体看send 的重载方法即可,这里提供一种
可能会发现 注入的地方有爆红,但是不用关心,依旧可以正常启动
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class KafkaProducer {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
/**
* 发送kafka消息 使用 KafkaTemplate
* @param content 发送的内容
* @return
*/
public String sendMessage(String content){
// 发送的主题
String topic = "kafa_test_topic";
// 主题,分区(一般测试只有一个时默认给个0即可),值的key, key对应的发送内容
kafkaTemplate.send(topic, 0, "key", content);
return "success";
}
}
在controller 中的示例调用
@RestController
@RequestMapping("/test")
public class RestRequestTestController {
@Autowired
private KafkaProducer kafkaProducer;
@GetMapping("/testKafka")
public Response testKafka(@RequestParam(value = "requestParam")String requestParam){
kafkaProducer.sendMessage(requestParam);
return Response.success(requestParam);
}
}