ShardingJdbc 2.0 编排治理源码浅析

2018-01-18  本文已影响0人  特仑苏纯牛乳
编排治理在架构里的位置: image.png

先解释下什么编排治理:
1.配置集中化与动态化,可支持数据源、表与分片策略的动态切换(2.0.0.M1)
2.客户端的数据库治理,数据源失效自动切换(2.0.0.M2)
3.基于Open Tracing协议的APM信息输出(2.0.0.M3)

先面开始撸源码:
依旧由单元测试入手,单元测试写的好的一个原则就是:单元测试可以被当做文档来用。自动校验的文档。
YamlOrchestrationMasterSlaveIntegrateTest

@Test
    public void assertWithDataSource() throws SQLException, URISyntaxException, IOException {
        File yamlFile = new File(YamlOrchestrationMasterSlaveIntegrateTest.class.getResource(filePath).toURI());
        DataSource dataSource;
        if (hasDataSource) {
            dataSource = OrchestrationMasterSlaveDataSourceFactory.createDataSource(yamlFile);
        } else {
            dataSource = OrchestrationMasterSlaveDataSourceFactory.createDataSource(Maps.asMap(Sets.newHashSet("db_master", "db_slave_0", "db_slave_1"), new Function<String, DataSource>() {
                @Override
                public DataSource apply(final String key) {
                    return createDataSource(key);
                }
            }), yamlFile);
        }
        try (Connection conn = dataSource.getConnection();
             Statement stm = conn.createStatement()) {
            stm.executeQuery("SELECT * FROM t_order");
            stm.executeQuery("SELECT * FROM t_order_item");
            stm.executeQuery("SELECT * FROM t_config");
        }
        OrchestrationDataSourceCloseableUtil.closeQuietly(dataSource);
    }

注意其中一个门面类,封装了一个标志信息 3个service 1个监听器 加一个注册中心

OrchestrationFacade implements AutoCloseable {
    
    private final boolean isOverwrite;
    
    private final ConfigurationService configService;
    
    private final InstanceStateService instanceStateService;
    
    private final DataSourceService dataSourceService;
    
    private final ListenerFactory listenerManager;
    
    private final RegistryCenter regCenter;
}

初始化 3个service 加一个监听器

    /**
     * Initialize for master-slave orchestration.
     *
     * @param dataSourceMap data source map
     * @param masterSlaveRuleConfig master-slave rule configuration
     * @param configMap config map
     * @throws SQLException SQL exception
     */
    public void init(
            final Map<String, DataSource> dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig,
            final Map<String, Object> configMap, final MasterSlaveDataSource masterSlaveDataSource) throws SQLException {
        configService.persistMasterSlaveConfiguration(dataSourceMap, masterSlaveRuleConfig, configMap, isOverwrite);
        instanceStateService.persistMasterSlaveInstanceOnline();
        dataSourceService.persistDataSourcesNode();
        listenerManager.initMasterSlaveListeners(masterSlaveDataSource);
    }

init的时候再注册中心注册了dataSourde
configService.persistMasterSlaveConfiguration:

/**
     * Persist master-slave configuration.
     *
     * @param dataSourceMap data source map
     * @param masterSlaveRuleConfig master-slave rule configuration
     * @param configMap config map
     * @param isOverwrite is overwrite registry center's configuration
     */
    public void persistMasterSlaveConfiguration(
            final Map<String, DataSource> dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig, final Map<String, Object> configMap, final boolean isOverwrite) {
        persistDataSourceConfiguration(dataSourceMap, isOverwrite);
        persistMasterSlaveRuleConfiguration(masterSlaveRuleConfig, isOverwrite);
        persistMasterSlaveConfigMap(configMap, isOverwrite);
    }

注册中心监听注册:

    /**
     * Initialize listeners for master-slave data source.
     *
     * @param masterSlaveDataSource master-slave data source
     */
    public void initMasterSlaveListeners(final MasterSlaveDataSource masterSlaveDataSource) {
        configurationListenerManager.start(masterSlaveDataSource);
        instanceListenerManager.start(masterSlaveDataSource);
        dataSourceListenerManager.start(masterSlaveDataSource);
        configMapListenerManager.start(masterSlaveDataSource);
    }

剩下的核心,就是搞明白这四个监听器都干了什么……
定制化自己的策略

上一篇下一篇

猜你喜欢

热点阅读