SpringBoot2整合kafka

本文详细介绍如何在SpringBoot中整合Kafka,包括配置、生产者与消费者代码示例,以及如何利用Kafka提高系统吞吐量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这kafka是伪集群,因为虚拟机有限,zookeeper也是集群

上面一篇写了springboot2整合dubbo,原来我以为可以springboot整合dubbo和kafka呢?
之后才发现我想错了

说一下这两个用途的一些区别

  • dubbo是微服务,微小的服务,如果并发量不是太高,上千万,上亿级别的或者想要返回结果的可以用dubbo
  • kafka是消息队列,如果想提高吞吐量不要返回结果(返回结果可以放在redis里)就可以用它
  • 不过上面的两种一般都有,当进行服务降级或者服务熔断消息队列大有用处

添加依赖

<!-- kafka -->
		<dependency>
		    <groupId>org.springframework.kafka</groupId>
		    <artifactId>spring-kafka</artifactId>
		</dependency>
		<!-- json -->
		  <dependency>
         <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>   
         </dependency> 

生产者

1、application.yml
server:
  port: 8080
spring:
  kafka:      
   #kafka的IP:端口,可以多个,因为kafka集群,连接一个端口就可以,当然为了容错性可以把剩下的端口都写上
    bootstrap-servers: 192.168.137.130:9092  
    template:
      default-topic: my-replicated-topic  #kafka默认主题
    listener:             #指定listen容器中的线程数,用于提高并发量
      concurrency: 5  
    producer:
      batch-size: 1000 # 每次批量发送消息的数量
      retries: 3
2、controller类
@Controller
public class UserController {
	@Autowired
		KafkaService kafkaService;
		
		@RequestMapping("findAll")
		public String findAll(Model model) throws Exception {					
			User user = new User();
			user.setUser_id("111");
			user.setName("搞笑");
			user.setAge(5);							
			kafkaService.sendMessage(user);
												
			return "index";			
		}
}

kafka的接口和实现类

接口类

public interface KafkaService {
	/**
	 * 发送一个消息队列
	 * */
	void sendMessage(User user);
}

实现类

public class KafkaServiceImpl implements KafkaService{
	@Autowired
	private KafkaTemplate<String, String> kafkaTemplate;
	@Override
	public void sendMessage(User user) {
		kafkaTemplate.send("my-replicated-topic", JSONObject.toJSONString(user));
		
	}

}

消费者

1、application.yml
server:
  port: 8081
spring:
  kafka:      
  #kafka的IP:端口,可以多个,因为kafka集群,连接一个端口就可以,当然为了容错性可以把剩下的端口都写上
    bootstrap-servers: 192.168.137.130:9093   
    template:
      default-topic: my-replicated-topic  #kafka默认主题
    listener:             #指定listen容器中的线程数,用于提高并发量
      concurrency: 5  
    consumer:
      group-id: mygroup      #指定默认消费者group id,这个必须有
      auto-offset-reset: earliest  #最早未被消费的offset 
2、消费者接收的类

下面是三种方式,自己根据需求选择,三个方法同时执行的时候主题不要一样

@Component
public class Consumer {

    /**
     * 有消息就读取,只读取消息value
     */
	
    @KafkaListener(topics = {"test1"})
    public void receiveMessage(String message){
        //收到通道的消息之后执行秒杀操作
        System.out.println(message);
    }

    /**
     * 有消息就读取,批量读取消息value
     */
    @KafkaListener(topics = "test2")
    public void onMessage(List<String> crs) {
        for(String str : crs){
            System.out.println("test12:" + str);
        }
    }

    /**
     * 有消息就读取,读取消息topic,offset,key,value等信息
     */
    @KafkaListener(topics = "my-replicated-topic")
    public void listenT1(ConsumerRecord<?, ?> cr){
        System.out.println("listenT1收到消息,topic:>>>" + cr.topic() + "  offset:>>" + cr.offset()+ "  key:>>" + cr.key() + "  value:>>" + cr.value());
    }
}

测试

在这里插入图片描述
成功

如果生产者需要返回到那个分区,主题等

 ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topic,message);
 RecordMetadata recordMetadata = future.get().getRecordMetadata();
  System.out.println("partition:"+recordMetadata.partition());
        System.out.println("offset:"+recordMetadata.offset());
        System.out.println("topic:"+recordMetadata.topic());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值