目录
需求分析
以微服务项目举例。
item-service项目是生产者,里面集成了对商品的增删改查操作。
search-service是消费者1,负责获取商品的各种信息
goods-web是消费者2,这个项目负责把常用的商品页面静态化,并持久化到本地,提高搜索效率和资源利用效率
通过分析,我们得知生产者需要的操作是增删改时发送商品id(spuid),消费者需要的操作是随着商品信息的变化增删改索引库,增删改静态页面。
RabbitMQ中三种订阅模式都适用这个需求,本文使用订阅模型-Topic
生产者发送消息
我们先在商品微服务leyou-item-service
中实现发送消息
1.引入依赖
在pom文件中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.配置文件
在applicaiton.yml文件中配置MQ连接信息
3.改造GoodsService
先注入amqp模板
我们找到新增商品的方法,在最后面加上发送消息
然后ctrl+alt+M抽取方法。对于新增商品,我们传的参数是insert
更新商品
消费者接受消息
接受者以goods-web为例,前两步同样是引入依赖和添加配置
然后我们新建一个监听者类
配置如下
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
我们在后台页面上把价格改成850
刷新前台页面,价格同步了
然后我们再看下rabbitmq上的消息,可以看到不论是队列还是交换机都配置上了。
最后再来看一下静态页面是否持久化到本地了。里面的内容走的是数据绑定,查询数据库中的价格信息。
到此我们通过订阅topic模型实现了消息通信