sharding-jdbc服务编排,观后感

编排治理

概述

  • 和dubbo的服务治理很类似啊,不过不带UI,功能还在完善中
  1. sharding-jdbc启动时,将配置信息分库分表,主从等信息持久化到zookeeper/etcd节点上
  2. 注册zookeeper/etcd 的监听zookeeper的watch。(不理解的先了解zk的特点)。
  3. 一旦节点改变,将新的节点信息下发到zk client,zk client重新建立配置信息
  • 服务治理也就是这是原理,大同小异,配置信息改变,服务不需要重启,可动态改变适应新配置

具体实现

  • 工厂模式一路跟进,没什么特别的
  • @1 开始注册znode监听器
DataSource dataSource = OrchestrationShardingDataSourceFactory.createDataSource(yamlFile);

public static DataSource createDataSource(......) throws SQLException {
        OrchestrationShardingDataSource result = new OrchestrationShardingDataSource(dataSourceMap, shardingRuleConfig, configMap, props, orchestrationConfig);
        result.init();
        return result;
    }

public void init() throws SQLException {
        orchestrationFacade.init(dataSourceMap, shardingRuleConfig, configMap, props, this);
    }

public void init(......) throws SQLException {
          ......
        //持久化配置到znode
        dataSourceService.persistDataSourcesNode();
        //@1 注册zk监听器
        listenerManager.initShardingListeners(shardingDataSource);
    }

public void initShardingListeners(final ShardingDataSource shardingDataSource) {
        ......
        dataSourceListenerManager.start(shardingDataSource);
    }

注册监听器

  • 监听数据源路径,发现改变,重新创建数据源
@Override
    public void start(final ShardingDataSource shardingDataSource) {
        regCenter.watch(stateNode.getDataSourcesNodeFullPath(), new EventListener() {
            
            @Override
            public void onChange(final DataChangedEvent event) {
                if (DataChangedEvent.Type.UPDATED == event.getEventType() || DataChangedEvent.Type.DELETED == event.getEventType()) {
                    try {
                        shardingDataSource.renew(dataSourceService.getAvailableShardingRuleConfiguration().build(dataSourceService.getAvailableDataSources()), configService.loadShardingProperties());
                    } catch (final SQLException ex) {
                        throw new ShardingJdbcException(ex);
                    }
                }
            }
        });
    }
  • renew具体更新上下文信息等操作
public void renew(final ShardingRule newShardingRule, final Properties newProps) throws SQLException {
        ShardingProperties newShardingProperties = new ShardingProperties(null == newProps ? new Properties() : newProps);
        int originalExecutorSize = shardingProperties.getValue(ShardingPropertiesConstant.EXECUTOR_SIZE);
        int newExecutorSize = newShardingProperties.getValue(ShardingPropertiesConstant.EXECUTOR_SIZE);
        if (originalExecutorSize != newExecutorSize) {
            executorEngine.close();
            executorEngine = new ExecutorEngine(newExecutorSize);
        }
        boolean newShowSQL = newShardingProperties.getValue(ShardingPropertiesConstant.SQL_SHOW);
        shardingProperties = newShardingProperties;
        shardingContext = new ShardingContext(newShardingRule, getDatabaseType(), executorEngine, newShowSQL);
    }
  • watch里面就是zk client发现改变,触发事件。一些sharding-jdbc根据状态做不同处理。比较直白
@Override
    public void watch(final String key, final EventListener eventListener) {
        final String path = key + "/";
        if (!caches.containsKey(path)) {
            addCacheData(key);
        }
        TreeCache cache = caches.get(path);
        cache.getListenable().addListener(new TreeCacheListener() {
            
            @Override
            public void childEvent(final CuratorFramework client, final TreeCacheEvent event) throws Exception {
                ChildData data = event.getData();
                if (null == data || null == data.getPath()) {
                    return;
                }
                eventListener.onChange(new DataChangedEvent(getEventType(event), data.getPath(), null == data.getData() ? null : new String(data.getData(), "UTF-8")));
            }
            
            private DataChangedEvent.Type getEventType(final TreeCacheEvent event) {
                switch (event.getType()) {
                    case NODE_UPDATED:
                        return DataChangedEvent.Type.UPDATED;
                    case NODE_REMOVED:
                        return DataChangedEvent.Type.DELETED;
                    default:
                        return DataChangedEvent.Type.IGNORED;
                }
            }
        });
    }

小结

  • 服务治理思想更深刻了,注册中心,内容改变,所有注册用户都自动改变。还是看代码理解的透彻啊
  • 中间应该可能做更多的事,限流啊,熔断啊,监控啊什么的
  • 阿里的代码咋就那么难以阅读呢,RocketMQ,Dubbo,再接再厉吧
  • sharding-jdbc 路由sql重写下一步

转载于:https://my.oschina.net/u/1432304/blog/1607893

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值