【SpringBoot学习12】springboot整合rocketMQ,kafka

1. RocketMQ工作模式

安装之前,我们先来说说RocketMQ工作模式

在RocketMQ中,处理业务的服务器称为broker生产者与消费者不是直接与broker联系的,而是通过命名服务器进行通信。broker启动后会通知命名服务器自己已经上线,这样命名服务器中就保存有所有的broker信息。当生产者与消费者需要连接broker时,通过命名服务器找到对应的处理业务的broker,因此命名服务器在整套结构中起到一个信息中心的作用。并且broker启动前必须保障命名服务器先启动。
在这里插入图片描述

2. 安装rocketMQ

安装

​ windows版安装包下载地址:https://rocketmq.apache.org

RocketMQ安装后需要配置环境变量,具体如下:

  • ROCKETMQ_HOME
  • PATH
  • NAMESRV_ADDR (建议): 127.0.0.1:9876

前面两步就不讲了。
在这里插入图片描述

启动服务器

mqnamesrv		# 启动命名服务器
mqbroker		# 启动broker

​ 运行bin目录下的mqnamesrv命令即可启动命名服务器,默认对外服务端口9876。
在这里插入图片描述
在这里插入图片描述

​ 运行bin目录下的mqbroker命令即可启动broker服务器,如果环境变量中没有设置NAMESRV_ADDR则需要在运行mqbroker指令前通过set指令设置NAMESRV_ADDR的值,并且每次开启均需要设置此项。
在这里插入图片描述
在这里插入图片描述

3. springboot整合rocketMQ

3.1 导入springboot整合RocketMQ的starter

此坐标版本springboot不提供维护,因此需要自己加入版本信息。

<dependency>
	<groupId>org.apache.rocketmq</groupId>
	<artifactId>rocketmq-spring-boot-starter</artifactId>
	<version>2.2.1</version>
</dependency>

3.2 添加核心配置

设置默认的生产者消费者所属组group。

rocketmq:
  name-server: localhost:9876
  producer:
    group: rocketmq_group

3.3 使用RocketMQTemplate操作RocketMQ

使用asyncSend方法发送异步消息。

@Service
public class MsgServiceRocketmqImpl implements MsgService {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    @Override
    public void sendMsg(String id) {
        System.out.println("已将待处理消息加入队列,id :"+id);
        SendCallback callback = new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println("消息发送成功");
            }

            @Override
            public void onException(Throwable throwable) {
                System.out.println("消息发送失败");
            }
        };
        //		使用asyncSend方法发送异步消息。
        rocketMQTemplate.asyncSend("order_id",id,callback);

    }
}

注意,使用asyncSend方法发送异步消息需要传递三个参数,队列名称,传递的参数,回调函数。回调函数会根据成功与否返回相对应的消息提示。

3.4 设置消息监听器

  • 使用消息监听器在服务器启动后,监听指定位置,当消息出现后,立即消费消息
  • RocketMQ的监听器必须按照标准格式开发,实现RocketMQListener接口,泛型为消息类型。
  • 使用注解@RocketMQMessageListener定义当前类监听RabbitMQ中指定组、指定名称的消息队列。
@Component
@RocketMQMessageListener(topic = "order_id",consumerGroup = "rocketmq_group")
class MessageListener implements RocketMQListener<String> {
    @Override
    public void onMessage(String id) {
        System.out.println("已完成短信发送业务(rocketmq),id:"+id);
    }
}

这里监听器的注解是@RocketMQMessageListener,这个注解区别于rabbitMQ,rabbitMQ的监听器注解加在方法上,这里是加在类上。其次,这里的监听器要实现RocketMQListener类,并且指定一个泛型,该泛型就是我们传递参数的类型。

接下来我们运行程序看结果。
在这里插入图片描述在这里插入图片描述

3.5 总结

  1. springboot整合RocketMQ使用RocketMQTemplate对象作为客户端操作消息队列
  2. 操作RocketMQ需要配置RocketMQ服务器地址,默认端口9876
  3. 开发时通常使用监听器来处理消息队列中的消息,设置监听器使用注解@RocketMQMessageListener

4. 安装kafka

安装

​ windows版安装包下载地址:https://kafka.apache.org/downloads

启动服务器

kafka服务器的功能相当于RocketMQ中的broker,kafka运行还需要一个类似于命名服务器的服务。在kafka安装目录中自带一个类似于命名服务器的工具,叫做zookeeper,它的作用是注册中心

zookeeper-server-start.bat ..\..\config\zookeeper.properties		# 启动zookeeper
kafka-server-start.bat ..\..\config\server.properties				# 启动kafka

​ 运行bin目录下的windows目录下的zookeeper-server-start命令即可启动注册中心,默认对外服务端口2181。
在这里插入图片描述

​ 运行bin目录下的windows目录下的kafka-server-start命令即可启动kafka服务器,默认对外服务端口9092。
在这里插入图片描述

5. springboot整合kafka

5.1 导入springboot整合Kafka的starter

<dependency>
	<groupId>org.springframework.kafka</groupId>
	<artifactId>spring-kafka</artifactId>
</dependency>

5.2 添加核心配置

配置Kafka的服务器地址

spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: order

5.3 使用KafkaTemplate操作Kafka

使用send方法发送消息,需要传入topic名称。

@Service
public class MsgSerivceKafkaImpl  implements MsgService {

    @Resource
    private KafkaTemplate<String,String > kafkaTemplate;

    @Override
    public void sendMsg(String id) {
        System.out.println("已将待处理消息加入队列,id :"+id);
        kafkaTemplate.send("kafka_id", id);
    	}
    }

5.4 设置消息监听器

  • 使用消息监听器在服务器启动后,监听指定位置,当消息出现后,立即消费消息
  • 使用注解@KafkaListener定义当前方法监听Kafka中指定topic的消息.
  • 接收到的消息封装在对象ConsumerRecord中,获取数据从ConsumerRecord对象中获取即可。
@Component
public class MsgListener {
    @KafkaListener(topics = "kafka_id")
    public void onMessage(ConsumerRecord<String,String> record){
        System.out.println("已完成短信发送业务(kafka),id:"+record.value());
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.5 总结

  1. springboot整合Kafka使用KafkaTemplate对象作为客户端操作消息队列

  2. 操作Kafka需要配置Kafka服务器地址,默认端口9092

  3. 开发时通常使用监听器来处理消息队列中的消息,设置监听器使用注解@KafkaListener。接收消息保存在形参ConsumerRecord对象中

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 提供了对 KafkaRocketMQ 的自动配置支持,可以通过简单的配置来集成它们。如果你想区分并集成 KafkaRocketMQ,你需要按照以下步骤进行: 1. 添加 KafkaRocketMQ 的依赖项: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.0.3</version> </dependency> ``` 2. 配置 Kafka: ```yaml spring: kafka: bootstrap-servers: localhost:9092 consumer: group-id: my-group auto-offset-reset: earliest producer: key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.apache.kafka.common.serialization.StringSerializer ``` 3. 配置 RocketMQ: ```yaml spring: rocketmq: name-server: localhost:9876 producer: group: my-group retry-times-when-send-failed: 3 send-msg-timeout: 3000 consumer: group: my-group max-reconsume-times: 3 ``` 4. 创建 KafkaRocketMQ 的 Producer 和 Consumer: ```java @Configuration public class KafkaConfig { @Value("${spring.kafka.bootstrap-servers}") private String bootstrapServers; @Bean public ProducerFactory<String, String> producerFactory() { Map<String, Object> props = new HashMap<>(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); return new DefaultKafkaProducerFactory<>(props); } @Bean public KafkaTemplate<String, String> kafkaTemplate() { return new KafkaTemplate<>(producerFactory()); } @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.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); return new DefaultKafkaConsumerFactory<>(props); } @Bean public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(consumerFactory()); return factory; } } @Configuration public class RocketMQConfig { @Value("${spring.rocketmq.name-server}") private String nameServer; @Bean public RocketMQTemplate rocketMQTemplate() { RocketMQTemplate rocketMQTemplate = new RocketMQTemplate(); rocketMQTemplate.setProducer(new DefaultMQProducer("my-group")); rocketMQTemplate.setDefaultTopic("my-topic"); rocketMQTemplate.setSendTimeout(3000); return rocketMQTemplate; } @Bean public DefaultMQPushConsumer defaultMQPushConsumer() throws MQClientException { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("my-group"); consumer.setNamesrvAddr(nameServer); consumer.subscribe("my-topic", "*"); consumer.setMaxReconsumeTimes(3); return consumer; } } ``` 这样,你就能够区分并集成 KafkaRocketMQ 了。在需要使用 KafkaRocketMQ 的地方,可以注入相应的 Producer 和 Consumer,并使用它们来发送和接收消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值