首先放上github的issues地址:https://github.com/apache/incubator-shardingsphere/issues/2844

又经过一天的摸索+实验,终于成功实现了刷新actualDataNodes,所以自己来回答下自己的问题,以便有相同问题的用户作为参考。

1、首先,根据官方文档描述,要实现动态刷新配置需要使用如zookeeper等相关第三方注册中心来实现,但是对于有些用户而言,我们并不想引入这么一个东西来增加系统部署维护难度,于是根据官方说法,我们可以实现自己的注册中心。

如图所示,经过测试,发现项目启动过程中,会多次调用watch并传递过来一些数据改变事件监听器,于是我们可以在这里把这些事件监听器缓存下来。然后通过该接口其余的方法(不上图了),可以打印出一些key,根据这些key我们可以找到我们需要的key(没办法,这些官网文档都没有说明)。

2、通过SPI将我们自定义的注册中心注入项目,像这样

3、使用OrchestrationShardingDataSourceFactory注册数据源,注意参数填入我们自定义的类型。

你可以在项目启动时在接口的方法中打断点来判断有没有注册成功

4、那么如何刷新我们需要的配置呢。。。这里我就直接上代码了。

        MyRegistryCenter.keyDataChangedEventListenerCache.get("/orchestration-sharding-data-source/config/schema").onChange(new DataChangedEvent("/orchestration-sharding-data-source/config/schema/logic_db/rule", rule, DataChangedEvent.ChangedType.UPDATED));

代码中的rule,是个字符串,也就是我们要刷新的配置内容。。。那么问题来了,我们需要传什么格式文本过去?通过阅读源码,可以发现内部是使用了SnakeYaml包来解析配置,生成YamlShardingRuleConfiguration配置类,通过了解SnakeYaml,我们可以知道,它支持将yaml flow格式及json格式的字符串转换成对象,看到支持json,那么不就好办了,于是自己配置了一个YamlShardingRuleConfiguration配置对象,然后转成json传了过去,结果发现报错。就像这样

这不对啊,我明明配置的是YamlShardingRuleConfiguration对象,为什么要给我解析成YamlMasterSlaveRuleConfiguration对象?通过查看源码发现了原因

不懂作者们为何在这里通过判断我们所传递的文本是否包含:tables:\n 或 tables:\r\n  来判断该解析成哪个对象。。。这么判断,直接封死了传递json过去解析的方式,于是我们只有最后一个方案,传递yaml的流(flow)格式字符串过去解析(写io读yaml文件方式试过不可行),那么yaml flow格式咋写?于是我又去现学了下yaml flow格式,然后写了一个工具类(后面奉上代码),将对象转成yaml flow 格式文本,注意!!!  转成该格式文本后还不行,因为上图源码的判断中 tables: 后面必须接一个\n  所以我们只能这么做

这样我们终于能过去源码这道坎了。。。

然后经过简单测试,成功刷新的表规则配置。

有了这个事件监听器,我们就可以以各种姿势刷新配置了,比如把配置放到数据库,读出来组成yaml flow格式传过去刷新,可以实现不重启项目的前提下,刷新分库分表规则。

最后,奉上临时写的Yaml工具类

package pub.avalon.test.utils;import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;/*** @author* @date 2019/8/13*/
public class YamlUtils {private YamlUtils() {}public static String toFlow(Object target) {if (target == null) {return null;}Class clazz = target.getClass();if (clazz == String.class|| clazz == Integer.class|| clazz == int.class|| clazz == Long.class|| clazz == long.class|| clazz == Double.class|| clazz == double.class|| clazz == Float.class|| clazz == float.class|| clazz == Boolean.class|| clazz == boolean.class) {return target.toString();}if (target instanceof Map) {return mapToFlow((Map) target);}if (target instanceof Collection) {return collectionToFlow((Collection) target);}if (target instanceof Object[]) {return arrayToFlow((Object[]) target);}return beanToFlow(target);}private static String mapToFlow(Map map) {StringBuilder sb = new StringBuilder();sb.append("{");int i = 0;for (Object key : map.keySet()) {if (i++ > 0) {sb.append(",");}sb.append(toFlow(key)).append(": ").append(toFlow(map.get(key)));}sb.append("}");return sb.toString();}private static String beanToFlow(Object target) {StringBuilder sb = new StringBuilder();sb.append("{");int i = 0;for (Field field : target.getClass().getDeclaredFields()) {if (i++ > 0) {sb.append(",");}field.setAccessible(true);try {sb.append(field.getName()).append(": ").append(toFlow(field.get(target)));} catch (IllegalAccessException e) {e.printStackTrace();}}sb.append("}");return sb.toString();}private static String collectionToFlow(Collection collection) {StringBuilder sb = new StringBuilder();sb.append("[");int i = 0;for (Object value : collection) {if (i++ > 0) {sb.append(",");}sb.append(toFlow(value));}sb.append("]");return sb.toString();}private static String arrayToFlow(Object[] objects) {StringBuilder sb = new StringBuilder();sb.append("[");int i = 0;for (Object value : objects) {if (i++ > 0) {sb.append(",");}sb.append(toFlow(value));}sb.append("]");return sb.toString();}}

其它推荐

Vue在线表单设计器

ShardingSphere4.0.0-RC1实现动态刷新actualDataNodes,不使用zookeeper等第三方注册中心。相关推荐

  1. micro-job 0.0.2 发布,分布式任务调度框架

    micro-job 0.0.2 发布了,更新记录 v.0.0.2.RELEASE(2019-2-21) 任务消费者定义JobKey上报注册中心 调度器拉取所有的JobKey 调度器添加memory方式 ...

  2. iMatrix平台6.0.0.RC1版本可以在线使用了

      iMatrix平台6.0.0.RC1版本已经部署成功,并可以在线试用,满足用户在第一时间可以试用. 如图所示,在官网首页中点击在线试用,即可进入平台登录页面. 或者直接输入登录地址 http:// ...

  3. Java Spring Boot 3.0.0 RC1 震撼登场!

    备受期待的Spring Boot 3.0.0 RC1现在已经推出. 微信搜索关注<Java学研大本营>,加入读者群,分享更多精彩 Phil Webb两天前在Spring博客上宣布,备受期待 ...

  4. 重磅消息:Redis 6.0.0 稳定版发布

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.sohu.com/a/ ...

  5. Spring for Android 1.0.0发布

    近日,Spring for Android 1.0.0 GA版发布了,Spring for Android支持在Android环境下使用Spring Framework.此次GA版发布包含了自RC1以 ...

  6. Redis 6.0.0 GA

    Redis 创始人宣布 Redis 6.0.0 稳定版正式 GA. 从首个 RC 版本到正式 GA 经历了四个月左右的时间,重要的新特性已在 RC1 中公布过: 许多新的模块 API(modules ...

  7. java月亮升起与落下动画设计_Java版1.0.0/开发版本

    本页面列出了Java版1.0.0的开发版本. Beta 1.9-pre1 Beta 1.9 Prerelease是Java版1.0.0的首个预发布版. 它被称为"丢失的更新", 新 ...

  8. ERROR: Failed to resolve: com.android.support:appcompat-v7:29.0.0

    错误内容如下 ERROR: Failed to resolve: com.android.support:appcompat-v7:29.0.0 Show in Project Structure d ...

  9. No cached version of com.android.tools.build:gradle:2.0.0 available for offline mode.

    异常场景 从AS2.0升级到2.1,重新编译工程后,抛出了如下异常 Error:A problem occurred configuring root project 'AndroidStudioPr ...

最新文章

  1. IDEA的这几个调试的骚操作,用了都说爽!
  2. F#探险之旅(四):面向对象编程(中)
  3. 响应式编程RxJava (一)
  4. python dict 排序原理_第一章Python数据结构和算法(字典排序)
  5. Adobe Lifecycle ES的安装截图
  6. 二元函数最大最小值定理证明_代数基本定理,用复数证明所有多项式函数都有根...
  7. Python遍历文件夹获取文件名并写入excel
  8. 64位win7搭建php mysql_Win7 64位操作系统下配置PHP+MySql+Apache环境
  9. 哈工大刘铭:开放式知识图谱的自动构建技术
  10. 多进程——守护进程例子
  11. 代码管理学:凡事养成登记的做法,比如依赖库
  12. IDC机房建设方案参考资料
  13. 【病毒查杀】CAD杀毒方法
  14. 微信小程序如何跳转视频号直播间
  15. html 让360浏览器兼容模式,360浏览器兼容模式怎么设置?360浏览器兼容模式设置方法介绍...
  16. 一切过往皆序章,一切未来皆可期——2021给自己定个小目标:读完52本书
  17. 如何在Ubuntu系统下装windows10双系统
  18. 苹果平板历史各版本 援引自知乎https://www.zhihu.com/question/315944330
  19. python全局变量(模块法和global)
  20. 初学larval 第一篇(大神绕道哦,针对新手友好的一篇)

热门文章

  1. 基础平台项目之集成Jquery.pagination.js实现分页
  2. matlab n维插值,简单调研多维插值方法
  3. 靶机18 driftingblues1
  4. DFD图转化成SD图
  5. ChatGPT通过中国数据库系统工程师(DBA)认证?
  6. 你没玩过的全新版本!Win10这些骚操作你知多少
  7. 关于github的license选择
  8. 采用亥姆霍兹线圈进行稀土永磁性能测量
  9. Apache RewriteRule规则的一个“坑”
  10. POJ 2395 Out of Hay 最小生成树 Kruskal