电商项目——CG
1.canal原理2.搭建canal微服务3.1广告缓存更新
1.canal原理
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议mysql master收到dump请求,开始推送binary log给slave(也就是canal)canal解析binary log对象(原始为byte流)
2.搭建canal微服务
第五天我们已经用nginx和lua实现了只需输入地址请求就可以完成首页的部署和广告的更新,但如何用代码进行实时更新呢?
思路: canal伪装成mysql slave,监听tb_ad表。定义mq配置,简单模式即可,只要表中数据改变,mq立马发送消息,内容为position的值。定义一个mq监听,此队列一旦有新消息,立马执行更新广告数据的操作。
具体操作:
创建微服务模块,pom文件中引入starter-canal依赖定义启动类,配上注解@EnableCanalClient声明此为canal客户端添加配置文件application.properties,canal中已配置监听哪个数据库
canal.client.instances.example.host=192.168.200.128
canal.client.instances.example.port=11111
canal.client.instances.example.batchSize=1000
spring.rabbitmq.host=192.168.200.128
创建mq配置类,根据业务可能需要配置多个消息队列
3.1广告缓存更新
在canal微服务中编写BusinessListener类,代码如下:
@CanalEventListener
public class BusinessListener {
@Autowired
private RabbitTemplate rabbitTemplate
;
@ListenPoint(schema
= "changgou_business",table
= "tb_ad")
public void adUpdate(CanalEntry
.EventType eventType
,CanalEntry
.RowData rowData
){
rowData
.getBeforeColumnsList().forEach((c
)-> System
.out
.println("每个队列的值:"+c
.getName()+":"+c
.getValue()));
System
.out
.println("------------------------");
List
<CanalEntry.Column> columnsList
= rowData
.getAfterColumnsList();
for (CanalEntry
.Column column
: columnsList
) {
if ("position".equals(column
.getName())){
rabbitTemplate
.convertAndSend("",RabbitMQConfig
.AD_UPDATE_QUEUE
,column
.getValue());
}
}
}
}
mq消费端yml配置在spring下加上rabbitmq配置,编写listener类,代码如下:推荐法2
@Component
public class AdListener {
@Autowired
private RestTemplate restTemplate
;
@RabbitListener(queues
="ad_update_queue")
public void receiveMessage(String message
){
String url
="http://192.168.200.128/ad_update?position="+message
;
String str
= restTemplate
.getForObject(url
, String
.class);
System
.out
.println(str
);
}
}