SpringCloudAlibaba云商场-高性能门户网构建(十)

112 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情

每日英语:

It's okay to be scared,we just have to do it anyway.

翻译:害怕也不要紧,我们只需要勇往直前。 -《小谢尔顿》

1.Canal安装

1.1 在MySQL中对canal授权

授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant:

CREATE USER canal IDENTIFIED BY 'canal';

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

1.2 采用docker方式安装canal

我们采用docker安装方式:

docker run -p 11111:11111 --name canal -d docker.io/canal/canal-server

安装成功后,用命令进行查看

docker images

进入到安装好的canal容器中

docker exec -it canal /bin/bash

cd到指定路径下进行文件修改

cd canal-server/conf/

ls 可以看到要修改的canal.properties,canal.properties 是canal自身的配置,在canal.ip = ,下面增加

canal.id = 123

添加完后,进行保存退出

接下来对instance.properties 进行配置,instance.properties是需要同步数据的数据库连接配置

cd example/

ls下,可以看到要修改的instance.properties

修改配置如下:

# position info,你本机服务mysql的配置
canal.instance.master.address=192.xx.xx.xx:3306

另一处配置:

# table regex
#canal.instance.filter.regex=.*\..*
#监听配置
canal.instance.filter.regex=shop_goods.ad_items

配置完成后,重启canal容器

docker restart canal

2.多级缓存架构缓存一致性实战

多级缓存架构缓存一致性实战.jpg

2.1 Canal微服务搭建

工程坐标:

<groupId>com.xz.mall</groupId>
<version>0.0.1-SNAPSHOT</version>
<artifactId>mall-canal-service</artifactId>

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mall-service</artifactId>
        <groupId>com.xz</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mall-canal-service</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--springboot-canal快速构建依赖包-->
        <dependency>
            <groupId>top.javatool</groupId>
            <artifactId>canal-spring-boot-starter</artifactId>
            <version>1.2.1-RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.xz</groupId>
            <artifactId>mall-goods-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

bootstrap.yml:

server:
  port: 8083
spring:
  application:
    name: mall-canal
  cloud:
    nacos:
      config:
        file-extension: yaml
        server-addr: xx.xx.xx.xx:8848
      discovery:
        #Nacos的注册地址
        server-addr: xx.xx.xx.xx:8848
#Canal配置
canal:
  server: xx.xx.xx.xx:11111
  destination: example
#日志配置
logging:
  pattern:
    console: "%msg%n"
  level:
    root: error

创建监听类com.xz.mall.canal.listener.AdItemsHandler,代码如下:

@Component
@CanalTable(value = "ad_items")
public class AdItemsHandler implements EntryHandler<AdItems> {

    @Autowired
    private SkuFeign skuFeign;

    /**
     * 数据库增加数据,执行该方法
     * @param adItems
     */
    @Override
    public void insert(AdItems adItems) {
        skuFeign.updateTypeItems(adItems.getType());
    }

    /**
     * 数据库修改数据,执行该方法
     * @param before
     * @param after
     */
    @Override
    public void update(AdItems before, AdItems after) {
        if (before.getType().intValue() != after.getType().intValue()) {
            //重新加载变更前分类的ID对应的推广产品
            skuFeign.updateTypeItems(before.getType());
        }
        //重新加载缓存
        skuFeign.updateTypeItems(after.getType());
    }

    /**
     * 数据库删除数据,执行该方法
     * @param adItems
     */
    @Override
    public void delete(AdItems adItems) {
        skuFeign.delTypeItems(adItems.getType());
    }
}

创建启动类com.xz.mall.canal.MallCanalApplication,代码如下:

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableFeignClients(basePackages = "com.xz.mall.goods.feign")
public class MallCanalApplication {

    public static void main(String[] args) {
        SpringApplication.run(MallCanalApplication.class, args);
    }

}

可以通过修改数据中shop_goods库中,ad_items 表的数据,增加,修改,删除都可以。进行相应的测试。

总结:本篇主要介绍了一下Canal的安装,还有Canal微服务的初步搭建。