Apache shardingSphere(5.x)源码解析之readwrite-splitting源码
2021/11/13 20:42:24
本文主要是介绍Apache shardingSphere(5.x)源码解析之readwrite-splitting源码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
概述
读写分离功能作为shardingsphere的可插拔能力之一
包结构分析
api:对外暴露的接口,包括算法spi、配置的对象类
core:核心层,包含默认提供的读分配的负载均衡的算法、以及SQL改写,选取数据源的核心逻辑
distSQL:distsql解析以及管理的相关的流程
spring:spring-boot-starter以及spring-namespace相关的实现。
具体实现
在api层面,对外提供的主要是配置对象以及,读的负载均衡。
在这里,官方提供了两种方式的负载。
1、ROUND_ROBIN(默认算法)
核心实现:
private static final ConcurrentHashMap<String, AtomicInteger> COUNTS = new ConcurrentHashMap<>(); @Override public String getDataSource(final String name, final String writeDataSourceName, final List<String> readDataSourceNames) { AtomicInteger count = COUNTS.containsKey(name) ? COUNTS.get(name) : new AtomicInteger(0); COUNTS.putIfAbsent(name, count); count.compareAndSet(readDataSourceNames.size(), 0); return readDataSourceNames.get(Math.abs(count.getAndIncrement()) % readDataSourceNames.size()); }
2、RANDOM
@Override public String getDataSource(final String name, final String writeDataSourceName, final List<String> readDataSourceNames) { return readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size())); }
核心路由逻辑
通过下述逻辑获取对应的读或者写的数据源。
/** * Route. * * @param sqlStatement SQL statement * @return data source name */ public String route(final SQLStatement sqlStatement) { if (isPrimaryRoute(sqlStatement)) { String autoAwareDataSourceName = rule.getAutoAwareDataSourceName(); if (Strings.isNullOrEmpty(autoAwareDataSourceName)) { return rule.getWriteDataSourceName(); } Optional<DataSourceNameAware> dataSourceNameAware = DataSourceNameAwareFactory.getInstance().getDataSourceNameAware(); if (dataSourceNameAware.isPresent()) { return dataSourceNameAware.get().getPrimaryDataSourceName(autoAwareDataSourceName); } } String autoAwareDataSourceName = rule.getAutoAwareDataSourceName(); if (Strings.isNullOrEmpty(autoAwareDataSourceName)) { return rule.getLoadBalancer().getDataSource(rule.getName(), rule.getWriteDataSourceName(), rule.getReadDataSourceNames()); } Optional<DataSourceNameAware> dataSourceNameAware = DataSourceNameAwareFactory.getInstance().getDataSourceNameAware(); if (dataSourceNameAware.isPresent()) { Collection<String> replicaDataSourceNames = dataSourceNameAware.get().getReplicaDataSourceNames(autoAwareDataSourceName); return rule.getLoadBalancer().getDataSource(rule.getName(), rule.getWriteDataSourceName(), new ArrayList<>(replicaDataSourceNames)); } return rule.getLoadBalancer().getDataSource(rule.getName(), rule.getWriteDataSourceName(), rule.getReadDataSourceNames()); } private boolean isPrimaryRoute(final SQLStatement sqlStatement) { return containsLockSegment(sqlStatement) || !(sqlStatement instanceof SelectStatement) || HintManager.isWriteRouteOnly() || TransactionHolder.isTransaction(); }
这篇关于Apache shardingSphere(5.x)源码解析之readwrite-splitting源码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享