业务需求
提供所有微服务数据源的图形化维护功能代码生成可以根据选择的数据源加载表等源信息数据源管理要支持动态配置,实时生效附录效果图
实现思路
本文提供方法仅供类似简单业务场景,在生产环境和复杂的业务场景请使用分库分表的中间件(例如mycat)或者框架sharding-sphere(一直在用)等。
先来看Spring默认的数据源注入策略,如下代码默认的事务管理器在初始化时回去加载数据源实现。这里就是我们动态数据源的入口:
通过注入一个新的DataSourceTransactionManager实现,并且给它设置多个DataSource来实现多数据源实现:
看下Spring默认提供的路由数据源字段
开始动手
实现AbstractRoutingDataSource,定一个动态数据源实现,只需要实现他的路由key查找方法即可。这里的路由key对应其实是resolvedDataSourcesMap的key哟。
把我们动态数据源实现注入到Spring的事务管理器,去数据库查询出来全部的数据源信息,定义一个个具体的数据源实现我这里使用的HikariDataSource给他赋值等等
怎么使用
只需要根据用户前台选择的数据源key,在业务类保存到TTL即可,会自动根据选择路由数据源
这里当然也可以根据AOP自定义注解等实现。
如何动态数据源动态配置
上边其实已经完成了我们想要的需求功能,但是有什么问题呢?
我们在数据源管理面维护了数据源,动态去修改这个dataSourceMap其实是无效的,不能做到实时刷新。
我们来看下AbstractRoutingDataSource的加载map数据源的源码,只有在初始化的时候调用afterPropertiesSet去初始数据源map。
那我们只要获取当前的DynamicDataSourcebean手动调用afterPropertiesSet即可。整个代码如下: