在开发一对一视频聊天源码时,数据隔离需要对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 */ @Override protected 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实现类对象即可 */ @Override protected DataSource determineTargetDataSource() { //获取当前的上下文 WormholeContext wormholeContext = WormholeContextHolder.getContext(); //如果不为空使用影子库 if (null != wormholeContext) { DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.SHADOW_DB); } else { //为空则使用主数据源 DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.PRIMARY_DB); } return super.determineTargetDataSource(); } /** * 如果希望所有数据源在启动配置时就加载好,这里通过设置数据源Key值来切换数据,定制这个方法 */ @Override protected Object determineCurrentLookupKey() { return DynamicDataSourceContextHolder.getDataSourceKey(); } }
以上就是一对一视频聊天源码,JDBC数据源隔离方法, 更多内容欢迎关注之后的文章
标签:JDBC,return,DynamicDataSourceContextHolder,数据源,源码,static,key,public From: https://www.cnblogs.com/yunbaomengnan/p/18199013