1. 需求场景
因业务线越做越大,需要将数据库进行拆分隔离。因此梳理已有的十余个服务,需要进行两种方式的拆分。一种是整个服务的数据源全量迁移,一种是服务中库表需部分迁移,需做双数据源。
接着分析发现需做双数据源的服务属于基础服务,更新不会很频繁,因此做静态上线——即配置双数据源。dba做表全量迁移,之后服务发布上线。需要数据源全量迁移的服务属于实时要求高的服务,访问量高,不可停机维护。因此采用热切换。
2. 前期准备
1. 代码部分: 使用Spring提供的AbstractRoutingDataSource类,进行对当前数据源的监听。另外新写切面判断apollo开关是否开启,如开启则使用新数据源。
需要注意,部分注解会使AbstractRoutingDataSource的动态数据源监听失效,如@Transaction注解。因为事务注解的执行顺序优先于自己建的切换数据源的切面,此时需要配置order顺序保证数据源切换优先执行。
2. dba准备: 在切换的前五分钟做好从老库到新库的双写,保证新库数据的同步性。在切换后做老库和新库流量的监控。
3. no bb, show me code
git地址: https://github.com/bkxpao/datasource-switch
目前线上已成功热切换, 求star :)