dubbo源码学习-dubbo-admin监控原理浅析

原创不易,转发请表明出处

在使用dubbo的过程中,dubbo-admin起着很重要的作用,主要作用有服务治理,查看服务状态等,在使用的时候感觉特别好用,所以花了一些时间了解了它的工作原理,目前dubbot-admin的最新地址为https://github.com/apache/incubator-dubbo-ops,感兴趣的同学可以直接下载源码学习,先贴出一张dubbo-admin的首页

1 dubbo-admin 的首页

    如果要了解dubbo-admin的工作原理,首先就要知道dubbo服务注册的原理,dubbo中有消费者和提供者还有注册中心等角色,消费者和服务者都要将自己的服务注册到注册中心上,这样消费者在请求服务者提供的服务时,就不用具体指定哪个服务者,直接从注册中心获取可用服务的列表,做到了和消费者和服务者之间的耦合,那么dubbo-admin进行服务治理的时候,也是主要和注册中心打交道,对注册中心的消费者和提供者列表进行管理,上面从流程上知道了dubbo-admin的大概原理,下面以dubbo-admin根据应用名查询服务的功能来说明代码上的实现,这个功能的操作如下图:


2 根据应用名查询应用

首先看 dubbo-admin的项目结构,发现它是一个单应用的服务,采用spring boot + velocity的技术架构,velocity是前端展示的模板引擎,spring boot就不做过多介绍了,之后当根据应用名字查询服务时,当前的url为 http://localhost:7001/governance/applications?keyword=*

前面的的host和port是根据服务启动的配置决定的,后面的请求路路径就是dubbo-admin的资源路径,根据资源路径 /governance/applications查询代码所在位置


3 根据应用名查询应用

以上代码的主要作用就是根据资源路径path,以及查询参数的值进行查询,下面说一下查询的核心代码,保留核心逻辑

// 把所有的应用查出来,核心方法

List providerApplications =providerService.findApplications();

if (providerApplications !=null && providerApplications.size() >0) {

applications.addAll(providerApplications);

}

List consumerApplications =consumerService.findApplications();

if (consumerApplications !=null && consumerApplications.size() >0) {

applications.addAll(consumerApplications);

}

// 构建要返回的数据

Set newList =new HashSet();

Set newProviders =new HashSet();

Set newConsumers =new HashSet();

model.addAttribute("applications", applications);

model.addAttribute("providerApplications", providerApplications);

model.addAttribute("consumerApplications", consumerApplications);

// 根据keyword过滤服务

if (StringUtils.isNotEmpty(keyword) && !"*".equals(keyword)) {

keyword = keyword.toLowerCase();

for (String o : applications) {

if (o.toLowerCase().indexOf(keyword) != -1) {newList.add(o); }

}

for (String o : providerApplications) {

if (o.toLowerCase().indexOf(keyword) != -1) {newProviders.add(o);}

}

for (String o : consumerApplications) {

if (o.toLowerCase().indexOf(keyword) != -1) { newConsumers.add(o);  }

}

model.addAttribute("applications", newList);

model.addAttribute("providerApplications", newProviders);

model.addAttribute("consumerApplications", newConsumers);

}

// 携带着model,跳转视图

return "governance/screen/applications/index";

以上代码做的主要事情就是providerService.findApplications();consumerService.findApplications()方法获取所有的应用,之后根据传参keyword来进行结果过滤以及返回。可见核心方法是上面的findApplications()方法顺藤摸瓜,继续看看findApplications方法的实现,那么查看providerService.findApplications()的方法实现,贴一下

public ListfindApplications() {

List ret =new ArrayList();

    // 亨元模式,获取所有的服务提供者

// key: com.alibaba.dubbo.demo.DemoService2 com.alibaba.dubbo.demo.DemoService

// value:  Map 其中 Long为版本号, URL为服务地址

    ConcurrentMap> providerUrls = getRegistryCache().get(Constants.PROVIDERS_CATEGORY);

    if (providerUrls ==null)return ret;

    // 遍历所有的服务提供者,根据服务url获取application列表

    for (Map.Entry> e1 : providerUrls.entrySet()) {

    Map value = e1.getValue();

        for (Map.Entry e2 : value.entrySet()) {

            URL u = e2.getValue();

            String app = u.getParameter(Constants.APPLICATION_KEY);

            if (app !=null) ret.add(app);

        }

}

return ret;

}

以上代码主要从getRegistryCache()获取所有提供者的的URL,之后根据url中参数application获取应用的名字,之后全部返回,看来关键的地方还是在getRegistryCache().get(Constants.PROVIDERS_CATEGORY)方法,由于getRegistryCache()方法获取的是RegistryServerSync类的实例,下面就看看RegistryServerSync做了什么


4 获取所有注册信息的方法

如代码的注释所示,上面代码做的事情是,订阅注册中心上所有的变动,之后通过notify()方法写入到registryCache中,监听者模式,之后当dubbo-admin查询信息的时候,就从registryCache这里面进行查询

综上所述

dubbo-admin的监控原理就是监听注册中心所有的变化,之后在本地内存中维护这样的关系,之后供前端查询操作,降级禁用等措施应该是通过registryService去操作注册中心的URL,从而实现降级或者禁用,感兴趣的可以自己看看,本篇只是一篇引子

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容