需求分析
商品上架后助币,將sku列表導(dǎo)入索引庫
實(shí)現(xiàn)思路
1.tb_spu列表發(fā)生改變朦蕴,上架標(biāo)記位由0 → 1 疏尿,拿到該條數(shù)據(jù)的spuId并將該消息發(fā)送到rabbitmq榆鼠。
2.由于商品上架后會(huì)有多個(gè)操作邏輯比如商品信息頁面靜態(tài)化等操作,所以商品上架交換機(jī)使用廣播模式fanout俱笛,建立導(dǎo)入索引庫的隊(duì)列捆姜,并建立交換機(jī)與隊(duì)列之間的綁定關(guān)系。
3.搜索微服務(wù)作為rabbitmq的消費(fèi)者端嫂粟,通過feign遠(yuǎn)程調(diào)用商品微服務(wù),根據(jù)spuId拿到sku列表數(shù)據(jù)后墨缘,通過ElasticSearch的API導(dǎo)入索引庫星虹。
具體實(shí)現(xiàn)過程
1.在canal監(jiān)聽微服務(wù)中:配置一個(gè)tb_spu表的監(jiān)聽類
@CanalEventListener//聲明一個(gè)監(jiān)聽類
public class SpuListener {
@Autowired
private RabbitTemplate rabbitTemplate;
@ListenPoint(schema = "changgou_business",table = "tb_spu",eventType = CanalEntry.EventType.UPDATE)
public void goods_up(CanalEntry.EventType eventType,CanalEntry.RowData rowData){
//上架標(biāo)記位由0 → 1 零抬,拿到該條數(shù)據(jù)的spuId并將該消息發(fā)送到rabbitmq
此處代碼略......
}
使用rabbitmq發(fā)送消息,最好新建一個(gè)rabbitmqConfig宽涌,用于配置交換機(jī)平夜,隊(duì)列以及綁定關(guān)系。
@Configuration
public class RabbitmqConfig {
//定義交換機(jī)名
public static final String GOODS_UP_EXCHANGE = "goods_up_exchange";
//定義隊(duì)列名
public static final String AD_UPDATE_QUEUE = "ad_update_queue";
public static final String SEARCH_ADD_QUEUE = "search_add_queue";
@Bean
public Queue Queue(){
return new Queue(AD_UPDATE_QUEUE);
}
//聲明隊(duì)列
@Bean(SEARCH_ADD_QUEUE)
public Queue SEARCH_ADD_QUEUE(){
return new Queue(SEARCH_ADD_QUEUE);
}
//聲明交換機(jī)
@Bean(GOODS_UP_EXCHANGE)
public Exchange GOODS_UP_EXCHANGE(){
return ExchangeBuilder.fanoutExchange(GOODS_UP_EXCHANGE).durable(true).build();
}
//隊(duì)列和交換機(jī)綁定
@Bean
public Binding GOODS_UP_EXCHANGE_BINDING(@Qualifier(SEARCH_ADD_QUEUE)Queue queue,@Qualifier(GOODS_UP_EXCHANGE)Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("").noargs();
}
}
2.新建一個(gè)搜索微服務(wù)卸亮,作為消息隊(duì)列的消費(fèi)者端忽妒。通過接受到的消息數(shù)據(jù)spuId,用Feign調(diào)用goods微服務(wù)中的根據(jù)spuId查詢sku列表方法兼贸,拿到數(shù)據(jù)段直。
feign聲明式調(diào)用:在goods_api微服務(wù)中聲明一個(gè)skuFeign接口,并添加通過spuId查詢sku列表的抽象方法。該接口供搜索服務(wù)中使用溶诞。
@FeignClient(name = "goods")
@RequestMapping("/sku")
public interface SkuFeign {
@GetMapping("/spu/{spuId}")
List<Sku> findListBySpuId(@PathVariable("spuId") String spuId);
}
3.通過feign遠(yuǎn)程調(diào)用商品微服務(wù)鸯檬,根據(jù)spuId拿到sku列表數(shù)據(jù)后,通過ElasticSearch的API導(dǎo)入索引庫螺垢。
當(dāng)搜索服務(wù)中喧务,用到skuFeign.findListBySpuId()方法時(shí),會(huì)調(diào)用goods服務(wù)里的方法( " /goods/sku/spu/{spuId} " )