温馨提示×

springcloud kafka如何实现消息广播

小樊
81
2024-12-18 21:23:42
栏目: 大数据

在Spring Cloud Kafka中,实现消息广播(也称为发布-订阅模式)主要依赖于Kafka的KafkaTemplateConsumer。以下是实现消息广播的步骤:

  1. 配置Kafka: 首先,确保你的Spring Boot应用程序已经正确配置了Kafka。你可以在application.ymlapplication.properties文件中添加Kafka配置。

    spring:
      kafka:
        bootstrap-servers: localhost:9092
        consumer:
          group-id: my-group
        producer:
          key-serializer: org.apache.kafka.common.serialization.StringSerializer
          value-serializer: org.apache.kafka.common.serialization.StringSerializer
    
  2. 创建Kafka生产者: 使用KafkaTemplate来发送消息。你可以创建一个配置类来初始化KafkaTemplate

    import org.apache.kafka.clients.producer.ProducerConfig;
    import org.apache.kafka.common.serialization.StringSerializer;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.kafka.core.DefaultKafkaProducerFactory;
    import org.springframework.kafka.core.KafkaTemplate;
    import org.springframework.kafka.core.ProducerFactory;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Configuration
    public class KafkaProducerConfig {
    
        @Value("${spring.kafka.bootstrap-servers}")
        private String bootstrapServers;
    
        @Bean
        public ProducerFactory<String, String> producerFactory() {
            Map<String, Object> configProps = new HashMap<>();
            configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
            configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
            configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
            return new DefaultKafkaProducerFactory<>(configProps);
        }
    
        @Bean
        public KafkaTemplate<String, String> kafkaTemplate() {
            return new KafkaTemplate<>(producerFactory());
        }
    }
    
  3. 发送广播消息: 使用KafkaTemplate发送消息时,不需要指定分区键,因为Kafka会自动将消息广播到所有分区的主题。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.kafka.core.KafkaTemplate;
    import org.springframework.stereotype.Service;
    
    @Service
    public class KafkaMessageSender {
    
        @Autowired
        private KafkaTemplate<String, String> kafkaTemplate;
    
        public void sendBroadcastMessage(String topic, String message) {
            kafkaTemplate.send(topic, message);
        }
    }
    
  4. 创建Kafka消费者: 创建一个消费者来消费广播消息。由于是广播模式,所有消费者都会收到相同的消息。

    import org.apache.kafka.clients.consumer.ConsumerConfig;
    import org.apache.kafka.common.serialization.StringDeserializer;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.kafka.annotation.KafkaListener;
    import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
    import org.springframework.kafka.config.KafkaListenerEndpointRegistrar;
    import org.springframework.kafka.config.MethodKafkaListenerEndpoint;
    import org.springframework.kafka.core.ConsumerFactory;
    import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
    import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;
    import org.springframework.kafka.listener.config.MethodKafkaListenerEndpointRegistry;
    import org.springframework.kafka.support.serializer.ErrorHandlingDeserializer;
    import org.springframework.kafka.support.serializer.JsonDeserializer;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Configuration
    public class KafkaConsumerConfig {
    
        @Value("${spring.kafka.bootstrap-servers}")
        private String bootstrapServers;
    
        @Bean
        public ConsumerFactory<String, String> consumerFactory() {
            Map<String, Object> props = new HashMap<>();
            props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
            props.put(ConsumerConfig.GROUP_ID_CONFIG, "my-group");
            props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
            props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer.class);
            ErrorHandlingDeserializer<String> errorHandlingDeserializer = new ErrorHandlingDeserializer<>(new JsonDeserializer<>());
            errorHandlingDeserializer.setFallbackToNull(true);
            props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, errorHandlingDeserializer);
            return new DefaultKafkaConsumerFactory<>(props);
        }
    
        @Bean
        public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
            ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
            factory.setConsumerFactory(consumerFactory());
            return factory;
        }
    
        @Bean
        public KafkaListenerEndpointRegistrar kafkaListenerEndpointRegistrar() {
            return new KafkaListenerEndpointRegistrar();
        }
    
        @Bean
        public MethodKafkaListenerEndpointRegistry methodKafkaListenerEndpointRegistry(KafkaListenerEndpointRegistrar registrar) {
            MethodKafkaListenerEndpointRegistry registry = new MethodKafkaListenerEndpointRegistry();
            registry.setEndpoints(kafkaListenerEndpoints());
            registrar.registerEndpoints(registry);
            return registry;
        }
    
        private Map<String, MethodKafkaListenerEndpoint<?>> kafkaListenerEndpoints() {
            Map<String, MethodKafkaListenerEndpoint<?>> endpoints = new HashMap<>();
            // 添加你的消费者方法
            return endpoints;
        }
    }
    
  5. 创建消费者监听器: 创建一个消费者监听器来处理接收到的消息。

    import org.springframework.kafka.annotation.KafkaListener;
    import org.springframework.stereotype.Service;
    
    @Service
    public class KafkaMessageListener {
    
        @KafkaListener(topics = "${spring.kafka.consumer.topic}", groupId = "${spring.kafka.consumer.group-id}")
        public void listen(String message) {
            System.out.println("Received message: " + message);
        }
    }
    

通过以上步骤,你就可以在Spring Cloud Kafka中实现消息广播了。生产者发送的消息会被广播到指定的主题,所有订阅该主题的消费者都会收到消息。

0