RabbitMQ之Topic模式实战

 

目录

需求分析

生产者发送消息

1.引入依赖

2.配置文件

3.改造GoodsService

消费者接受消息

测试


 

需求分析

 

以微服务项目举例。

item-service项目是生产者,里面集成了对商品的增删改查操作。

search-service是消费者1,负责获取商品的各种信息

goods-web是消费者2,这个项目负责把常用的商品页面静态化,并持久化到本地,提高搜索效率和资源利用效率

通过分析,我们得知生产者需要的操作是增删改时发送商品id(spuid),消费者需要的操作是随着商品信息的变化增删改索引库,增删改静态页面。

RabbitMQ中三种订阅模式都适用这个需求,本文使用订阅模型-Topic

RabbitMQ之Topic模式实战_第1张图片

 

 

生产者发送消息

 

我们先在商品微服务leyou-item-service中实现发送消息

 

1.引入依赖

在pom文件中引入依赖

        
            org.springframework.boot
            spring-boot-starter-amqp
        

 

2.配置文件

在applicaiton.yml文件中配置MQ连接信息

RabbitMQ之Topic模式实战_第2张图片

 

 

3.改造GoodsService

先注入amqp模板

我们找到新增商品的方法,在最后面加上发送消息

RabbitMQ之Topic模式实战_第3张图片

然后ctrl+alt+M抽取方法。对于新增商品,我们传的参数是insert

RabbitMQ之Topic模式实战_第4张图片

 

更新商品

RabbitMQ之Topic模式实战_第5张图片

 

 

消费者接受消息

 

 接受者以goods-web为例,前两步同样是引入依赖和添加配置

RabbitMQ之Topic模式实战_第6张图片

 

然后我们新建一个监听者类

RabbitMQ之Topic模式实战_第7张图片

配置如下

package com.leyou.goods.listener;

import com.leyou.goods.service.GoodsHtmlService;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class GoodsListener {

    @Autowired
    private GoodsHtmlService goodsHtmlService;

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "LEYOU.ITEM.SAVE.QUEUE", durable = "true"),
            exchange = @Exchange(value = "LEYOU.ITEM.EXCHANGE", ignoreDeclarationExceptions = "true", type = ExchangeTypes.TOPIC),
            key = {"item.insert", "item.update"}
    ))
    public void save(Long id) {
        if(id == null) {
            return;
        }
        this.goodsHtmlService.createHtml(id);
    }


    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "LEYOU.ITEM.DELETE.QUEUE", durable = "true"),
            exchange = @Exchange(value = "LEYOU.ITEM.EXCHANGE", ignoreDeclarationExceptions = "true", type = ExchangeTypes.TOPIC),
            key = {"item.delete"}
    ))
    public void delete(Long id) {
        if(id == null) {
            return;
        }
        this.goodsHtmlService.deleteHtml(id);
    }
}

最后执行的createHtml方法就是通过thymeleaf持久化到本地的方法

 

另一个微服务项目也做如上操作

 

 

测试

 

两个微服务项目都配置好RabbitMQ后,我们测试一下。

1.启动elasticsearch

2.重启修改后的三个微服务项目

3.启动门户网站的前端,再启动后台系统的前端。

 

目前从门户网站浏览到华为G9青春版是849

RabbitMQ之Topic模式实战_第8张图片

 

我们在后台页面上把价格改成850

RabbitMQ之Topic模式实战_第9张图片

刷新前台页面,价格同步了

RabbitMQ之Topic模式实战_第10张图片

 

然后我们再看下rabbitmq上的消息,可以看到不论是队列还是交换机都配置上了。

RabbitMQ之Topic模式实战_第11张图片

 

最后再来看一下静态页面是否持久化到本地了。里面的内容走的是数据绑定,查询数据库中的价格信息。

RabbitMQ之Topic模式实战_第12张图片

到此我们通过订阅topic模型实现了消息通信

 

你可能感兴趣的:([RabbitMQ])