千家信息网

sharding-jdbc中MasterSlaveRouter的作用是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇文章为大家展示了sharding-jdbc中MasterSlaveRouter的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MasterSla
千家信息网最后更新 2026年10月31日sharding-jdbc中MasterSlaveRouter的作用是什么

本篇文章为大家展示了sharding-jdbc中MasterSlaveRouter的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

MasterSlaveRouter

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/masterslave/MasterSlaveRouter.java

@RequiredArgsConstructorpublic final class MasterSlaveRouter {        private final MasterSlaveRule masterSlaveRule;        private final boolean showSQL;        /**     * Route Master slave.     *     * @param sql SQL     * @return data source names     */    // TODO for multiple masters may return more than one data source    public Collection route(final String sql) {        Collection result = route(new SQLJudgeEngine(sql).judge().getType());        if (showSQL) {            SQLLogger.logSQL(sql, result);        }        return result;    }        private Collection route(final SQLType sqlType) {        if (isMasterRoute(sqlType)) {            MasterVisitedManager.setMasterVisited();            return Collections.singletonList(masterSlaveRule.getMasterDataSourceName());        }        return Collections.singletonList(masterSlaveRule.getLoadBalanceAlgorithm().getDataSource(                masterSlaveRule.getName(), masterSlaveRule.getMasterDataSourceName(), new ArrayList<>(masterSlaveRule.getSlaveDataSourceNames())));    }        private boolean isMasterRoute(final SQLType sqlType) {        return SQLType.DQL != sqlType || MasterVisitedManager.isMasterVisited() || HintManager.isMasterRouteOnly();    }}
  • MasterSlaveRouter的route方法使用masterSlaveRule来进行路由

MasterSlaveRule

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-common/src/main/java/org/apache/shardingsphere/core/rule/MasterSlaveRule.java

@Getterpublic class MasterSlaveRule {        private final String name;        private final String masterDataSourceName;        private final Collection slaveDataSourceNames;        private final MasterSlaveLoadBalanceAlgorithm loadBalanceAlgorithm;        private final MasterSlaveRuleConfiguration masterSlaveRuleConfiguration;        public MasterSlaveRule(final String name, final String masterDataSourceName, final Collection slaveDataSourceNames, final MasterSlaveLoadBalanceAlgorithm loadBalanceAlgorithm) {        this.name = name;        this.masterDataSourceName = masterDataSourceName;        this.slaveDataSourceNames = slaveDataSourceNames;        this.loadBalanceAlgorithm = null == loadBalanceAlgorithm ? new MasterSlaveLoadBalanceAlgorithmServiceLoader().newService() : loadBalanceAlgorithm;        masterSlaveRuleConfiguration = new MasterSlaveRuleConfiguration(name, masterDataSourceName, slaveDataSourceNames,                 new LoadBalanceStrategyConfiguration(this.loadBalanceAlgorithm.getType(), this.loadBalanceAlgorithm.getProperties()));    }        public MasterSlaveRule(final MasterSlaveRuleConfiguration config) {        name = config.getName();        masterDataSourceName = config.getMasterDataSourceName();        slaveDataSourceNames = config.getSlaveDataSourceNames();        loadBalanceAlgorithm = createMasterSlaveLoadBalanceAlgorithm(config.getLoadBalanceStrategyConfiguration());        masterSlaveRuleConfiguration = config;    }        private MasterSlaveLoadBalanceAlgorithm createMasterSlaveLoadBalanceAlgorithm(final LoadBalanceStrategyConfiguration loadBalanceStrategyConfiguration) {        MasterSlaveLoadBalanceAlgorithmServiceLoader serviceLoader = new MasterSlaveLoadBalanceAlgorithmServiceLoader();        return null == loadBalanceStrategyConfiguration ? serviceLoader.newService() : serviceLoader.newService(loadBalanceStrategyConfiguration.getType(), loadBalanceStrategyConfiguration.getProperties());    }        /**     * Judge whether contain data source name.     *     * @param dataSourceName data source name     * @return contain or not.     */    public boolean containDataSourceName(final String dataSourceName) {        return masterDataSourceName.equals(dataSourceName) || slaveDataSourceNames.contains(dataSourceName);    }}
  • MasterSlaveRule内置了loadBalanceAlgorithm、masterSlaveRuleConfiguration

MasterSlaveLoadBalanceAlgorithm

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-api/src/main/java/org/apache/shardingsphere/spi/masterslave/MasterSlaveLoadBalanceAlgorithm.java

public interface MasterSlaveLoadBalanceAlgorithm extends TypeBasedSPI {        /**     * Get data source.     *      * @param name master-slave logic data source name     * @param masterDataSourceName name of master data sources     * @param slaveDataSourceNames names of slave data sources     * @return name of selected data source     */    String getDataSource(String name, String masterDataSourceName, List slaveDataSourceNames);}
  • MasterSlaveLoadBalanceAlgorithm接口继承了TypeBasedSPI接口,它定义了getDataSource方法;它有两个实现类分别是RandomMasterSlaveLoadBalanceAlgorithm、RoundRobinMasterSlaveLoadBalanceAlgorithm

RandomMasterSlaveLoadBalanceAlgorithm

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-common/src/main/java/org/apache/shardingsphere/core/strategy/masterslave/RandomMasterSlaveLoadBalanceAlgorithm.java

@Getter@Setterpublic final class RandomMasterSlaveLoadBalanceAlgorithm implements MasterSlaveLoadBalanceAlgorithm {        private Properties properties = new Properties();        @Override    public String getType() {        return "RANDOM";    }        @Override    public String getDataSource(final String name, final String masterDataSourceName, final List slaveDataSourceNames) {        return slaveDataSourceNames.get(new Random().nextInt(slaveDataSourceNames.size()));    }}
  • RandomMasterSlaveLoadBalanceAlgorithm使用Random().nextInt来进行随机

RoundRobinMasterSlaveLoadBalanceAlgorithm

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-common/src/main/java/org/apache/shardingsphere/core/strategy/masterslave/RoundRobinMasterSlaveLoadBalanceAlgorithm.java

@Getter@Setterpublic final class RoundRobinMasterSlaveLoadBalanceAlgorithm implements MasterSlaveLoadBalanceAlgorithm {        private static final ConcurrentHashMap COUNTS = new ConcurrentHashMap<>();        private Properties properties = new Properties();        @Override    public String getType() {        return "ROUND_ROBIN";    }        @Override    public String getDataSource(final String name, final String masterDataSourceName, final List slaveDataSourceNames) {        AtomicInteger count = COUNTS.containsKey(name) ? COUNTS.get(name) : new AtomicInteger(0);        COUNTS.putIfAbsent(name, count);        count.compareAndSet(slaveDataSourceNames.size(), 0);        return slaveDataSourceNames.get(Math.abs(count.getAndIncrement()) % slaveDataSourceNames.size());    }}
  • RoundRobinMasterSlaveLoadBalanceAlgorithm使用Math.abs(count.getAndIncrement()) % slaveDataSourceNames.size()进行round robin

MasterSlaveRuleConfiguration

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-api/src/main/java/org/apache/shardingsphere/api/config/masterslave/MasterSlaveRuleConfiguration.java

@Getterpublic class MasterSlaveRuleConfiguration implements RuleConfiguration {        private final String name;        private final String masterDataSourceName;        private final Collection slaveDataSourceNames;        private final LoadBalanceStrategyConfiguration loadBalanceStrategyConfiguration;        public MasterSlaveRuleConfiguration(final String name, final String masterDataSourceName, final Collection slaveDataSourceNames) {        this(name, masterDataSourceName, slaveDataSourceNames, null);    }        public MasterSlaveRuleConfiguration(final String name,                                         final String masterDataSourceName, final Collection slaveDataSourceNames, final LoadBalanceStrategyConfiguration loadBalanceStrategyConfiguration) {        Preconditions.checkArgument(!Strings.isNullOrEmpty(name), "Name is required.");        Preconditions.checkArgument(!Strings.isNullOrEmpty(masterDataSourceName), "MasterDataSourceName is required.");        Preconditions.checkArgument(null != slaveDataSourceNames && !slaveDataSourceNames.isEmpty(), "SlaveDataSourceNames is required.");        this.name = name;        this.masterDataSourceName = masterDataSourceName;        this.slaveDataSourceNames = slaveDataSourceNames;        this.loadBalanceStrategyConfiguration = loadBalanceStrategyConfiguration;    }}
  • MasterSlaveRuleConfiguration定义了name、masterDataSourceName、slaveDataSourceNames、loadBalanceStrategyConfiguration属性

小结

MasterSlaveRouter的route方法使用masterSlaveRule来进行路由;MasterSlaveRule内置了loadBalanceAlgorithm、masterSlaveRuleConfiguration;MasterSlaveLoadBalanceAlgorithm接口继承了TypeBasedSPI接口,它定义了getDataSource方法;它有两个实现类分别是RandomMasterSlaveLoadBalanceAlgorithm、RoundRobinMasterSlaveLoadBalanceAlgorithm

上述内容就是sharding-jdbc中MasterSlaveRouter的作用是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

接口 方法 作用 两个 内容 技能 知识 路由 简明 简明扼要 小结 就是 属性 文章 更多 篇文章 行业 资讯 资讯频道 频道 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 科技与互联网发展 火传媒上海互联网科技 互联网科技英文翻译 互联网科技公司做什么 上海电发互联网科技有限公司 互联网汽车科技小镇 昭通云南众福互联网科技有限公司 互联网系的金融科技公司 华夏互联网科技业 河南住房之家互联网科技 互联网科技创新的路径 朱啸虎曾投资哪些互联网科技企业 半导体是互联网高科技吗 风投北京互联网科技 广西科技产业互联网是什么 西安左小互联网科技有限公司 好易买互联网科技 互联网科技博主张洲 恒生科技互联网指数十大成分股 银优互联网科技有限公司 互联网科技生活的内容 海南科技产业互联网平台 重庆互联网医院沙龙医盟信息科技 互联网科技革命什么开始 互联网行业科技股 互联网科技和法律行业 黑科技 体验场景 互联网大会 互联网金融科技公司的优势 互联网科技创新创业项目
0