springboot + kafka+消费者和生产者

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…

猜你喜欢

转载自blog.csdn.net/walle167/article/details/88995001