在开发一对一视频聊天源码时,数据隔离需要对DB,Redis,RabbitMQ进行数据隔离,接下来主要介绍一下JDBC数据源隔离方法。通过实现Spring动态数据源AbstractRoutingDataSource,通过ThreadLocal识别出来压测数据,如果是压测数据就路由到影子库,如果是正常流量则路由到主库,通过流量识别的改造,各个服务都已经能够识别出压测的请求流量了。
代码实现
数据源路由Key持有对象
根据路由Key将选择将操作路由给那个数据源
/*** 动态数据源上下文*/ public class DynamicDataSourceContextHolder {public static final String PRIMARY_DB = "primary";public static final String SHADOW_DB = "shadow";private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>() {/*** 将 master 数据源的 key作为默认数据源的 key*/@Overrideprotected String initialValue() {return PRIMARY_DB;}};/*** 数据源的 key集合,用于切换时判断数据源是否存在*/public static List<Object> dataSourceKeys = new ArrayList<>();/*** 切换数据源** @param key*/public static void setDataSourceKey(String key) {contextHolder.set(key);}/*** 获取数据源** @return*/public static String getDataSourceKey() {return contextHolder.get();}/*** 重置数据源*/public static void clearDataSourceKey() {contextHolder.remove();}/*** 判断是否包含数据源** @param key 数据源key* @return*/public static boolean containDataSourceKey(String key) {return dataSourceKeys.contains(key);}/*** 添加数据源keys** @param keys* @return*/public static boolean addDataSourceKeys(Collection<? extends Object> keys) {return dataSourceKeys.addAll(keys);} }
动态数据源实现类
根据路由Key实现数据源的切换
/*** 动态数据源实现类*/ public class DynamicDataSource extends AbstractRoutingDataSource {/*** 如果不希望数据源在启动配置时就加载好,可以定制这个方法,从任何你希望的地方读取并返回数据源* 比如从数据库、文件、外部接口等读取数据源信息,并最终返回一个DataSource实现类对象即可*/@Overrideprotected DataSource determineTargetDataSource() {//获取当前的上下文WormholeContext wormholeContext = WormholeContextHolder.getContext();//如果不为空使用影子库if (null != wormholeContext) {DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.SHADOW_DB);} else {//为空则使用主数据源 DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.PRIMARY_DB);}return super.determineTargetDataSource();}/*** 如果希望所有数据源在启动配置时就加载好,这里通过设置数据源Key值来切换数据,定制这个方法*/@Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceContextHolder.getDataSourceKey();}}
以上就是一对一视频聊天源码,JDBC数据源隔离方法, 更多内容欢迎关注之后的文章