springboot 对kafka的集成特别友好
话不多说
pom 依赖文件
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
配置文件
# kafka集群IP
spring.kafka.bootstrap-servers=192.168.23.223:19092,192.168.23.224:19092,192.168.23.225:19092
# 生产者 key 和 value 序列化方法
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
#消费者默认的组ID
spring.kafka.consumer.group-id:smk_ad
# 消费者 key 和 value 序列化方法
spring.kafka.consumer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.consumer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
生产者代码
package com.smk.ad.service.kafka;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
// 注入的时候只能使用 @Component 不能使用 @Service
@Component
public class KafkaProductService {
// 引入泛型必须和配置文件保持一致
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
/**
* 发送消息
*
* @param msg
*/
public void sendClickMsg(String msg) {
kafkaTemplate.send(KafkaConsumerService.topic, msg);
}
}
消费者
package com.smk.ad.service.kafka;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import com.cat.common.exception.RequestException;
import com.cat.common.json.RJson;
import com.cat.common.lang.RString;
import com.smk.ad.bean.ad.AdCount;
import com.smk.ad.service.ad.AdCountService;
@Component
public class KafkaConsumerService {
public static final String topic = "smk_ad_log";
public static final String group = "smk_ad";
@Autowired
private AdCountService adCountService;
// KAFKA监听的注解, topic
@KafkaListener(topics = {topic})
public void receive(String msg) {
}
}
真的想说:炒鸡简单有木有。。。非常方便 有木有。。
KAFKA广播模式
上面的例子是一个简单的 生产者 消费者模式,一个生产者,一个消费者
kafka 还有一种广播模式, 一个生产者。 多个消费者 消费同一个消息。
坑: 我使用的 springboot 版本是 1.5.10.RELEASE 版本的。
使用配置文件
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
这种方式默认引用的是 1.1 版本的spring-kafka 版本。 代码中不支持 一个项目配置多个不同的groupId的消费者
spring 支持多个gourpIde 消费者是从 1.3 版本开始支持的。
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
样例代码:
生产者:(生产者没有什么不同的)
package com.smk.ad.service.kafka.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.cat.common.lang.RDate;
@Component
public class ProTest {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
/**
* 发送消息
*
* @param msg
*/
@Scheduled(cron = "0/5 * * * * ?")
public void sendClickMsg() {
String m = "消息:"+RDate.getCurrentTimeSssStr();
kafkaTemplate.send(Coum.topic, m);
System.out.println("生产发送消息:"+m);
}
}
消费者:
package com.smk.ad.service.kafka.test;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Component
public class Coum {
public static final String topic = "gb_test";
public static final String group = "c1";
@KafkaListener(topics = {topic},groupId=group)
public void receive1(String msg) {
System.out.println("c1-1"+msg);
}
@KafkaListener(topics = {topic},groupId=group)
public void receive12(String msg) {
System.out.println("c1-2"+msg);
}
@KafkaListener(topics = {topic},groupId=group)
public void receive13(String msg) {
System.out.println("c1-3"+msg);
}
@KafkaListener(topics = {topic},groupId="c2")
public void receive2(String msg) {
System.out.println("c2"+msg);
}
@KafkaListener(topics = {topic},groupId="C3")
public void receive3(String msg) {
System.out.println("c3"+msg);
}
}
我这里配置的消费者 有5个消费者, 前面3个消费者:c1-1 ,c1-2 ,c1-3 他们的groupId 相同,都是C1
后面2个消费者的groupId不同,分别是 c2 , c3
看最终的消费信息
生产发送消息:消息:2019-04-03 16:24:10:002
c3消息:2019-04-03 16:24:10:002
c2消息:2019-04-03 16:24:10:002
c1-2消息:2019-04-03 16:24:10:002
消息只消费了 3次。 广播模式成功
简单说下kafka 和 rocketmq的区别
namesvr 和 zookeeper…