从dubbo-admin看dubbo

     写在前面:

     我不知道是不是会有人和我有同样的想法,当浏览dubbo用户手册时,会觉得当一切基于配置,会给自己代码省去很多事情,然后会不禁赞叹,dubbo的设计真是精妙,简约而不简单!

     

     其实今天想写的内容在API配置一节中可以窥见一部分,就是通过阅读dubbo-admin源码分析provider、consumer、route、override是如何同注册中心交互的。

     先说最关键的一个类RegistryService,包名com.alibaba.dubbo.registry,通过包名可知它的实现是在dubbo-registry这个项目下的,其本质是通过创建代理,使用ZookeeperRegistry来操作zookeeper的节点数据,因为不在dubbo-admin项目中,所以也没有深入去了解。它的使用后面会有说。

     接着说下次要关键的类,RegistryServerSync,是用来同步注册中心数据的。

private static final URL SUBSCRIBE = new URL(Constants.ADMIN_PROTOCOL, NetUtils.getLocalHost(), 0, "",
			Constants.INTERFACE_KEY, Constants.ANY_VALUE, Constants.GROUP_KEY, Constants.ANY_VALUE,
			Constants.VERSION_KEY, Constants.ANY_VALUE, Constants.CLASSIFIER_KEY, Constants.ANY_VALUE,
			Constants.CATEGORY_KEY,
			Constants.PROVIDERS_CATEGORY + "," + Constants.CONSUMERS_CATEGORY + "," + Constants.ROUTERS_CATEGORY + ","
					+ Constants.CONFIGURATORS_CATEGORY,
			Constants.ENABLED_KEY, Constants.ANY_VALUE, Constants.CHECK_KEY, String.valueOf(false));
registryService.subscribe(SUBSCRIBE, this);//订阅
registryService.unsubscribe(SUBSCRIBE, this);//取消
     通过以上两个方法来进行订阅\取消操作。

     此外,这个类还实现了NotifyListener接口,通过实现notify(List<URL> urls)这一方法,从来完成信息的更新以及分类缓存注册中心信息。

     缓存会写入这个类的变量registryCache中。


     其实讲到上面的内容已经可以结束了,因为无论provider、consumer、route、override,其实到最后就是一个URL,通过下面两个方法来进行数据的更新:

扫描二维码关注公众号,回复: 1578096 查看本文章

registryService.unregister(oldURL);

registryService.register(newURL);
     这样,新的提供者、消费者、路由规则、动态配置就会写入注册中心,从而完成增删改这三个操作。

     至于查,有点特别,为了节约性能,其实查找是通过在缓存中进行筛选,从而获得结果的。但由于是缓存,可能有些人直接调用provider或者consumer中service中findAll()方法会得到原始的值,就是无论你修改了权重或是启用\禁用,都不会改变findAll()的结果,原因就在这里,想要得到最新的信息,其实是需要遍历override,寻找对应的动态配置,然后取到动态配置设置的值。这些方法当然也可以在dubbo.governance.web.common.pulltool.Tool中找到。

     说了这么多,其实最终想表达的就是有些事(我都已忘记,但是我······)其实没有想象中那么复杂,你完全可以通过在URL或者是domain类中添加参数来实现dubbo的扩展,从而完成自己定义的管控台,或者是更复杂的配置!!!(我没这本事啦~~~~~~)


      写的有些凌乱,望包涵~


猜你喜欢

转载自blog.csdn.net/danengbinggan33/article/details/78064890