Dubbo源码解析系列文章均来自肥朝简书

前言

之前讲完了dubbo集群容错系列,现在开始讲比较重要的环节,也就是dubbo面试中比较喜欢问的两个点:服务发布服务引用.

插播面试题

  • 服务发布过程中做了哪些事

  • dubbo都有哪些协议,他们之间有什么特点,缺省值是什么

  • 什么是本地暴露和远程暴露,他们的区别

直入主题

从启动日志说起

大家都知道,dubbo是阿里巴巴开源的一个项目,前阵子阿里不仅发布的代码规范手册,还发布了相应的插件,从这点我们就知道,阿里是很注重这个代码规范的,从dubbo项目我们也发现了,他有完善的测试体系.说了这么说,那和我们今天要讲的dubbo的服务发布有什么关系呢?当然有,一个规范的项目,必然是有健全的日志系统.做过其他开发比如iOS开发的都知道,这个控制台输出在生产环境是不能随便输出的,太多日志有时候和没有日志是一样的.所以我们来看看这个服务启动过程中,日志究竟输出了什么.

这里我用不同颜色的框将关键的地方画了出来,一共有6种颜色,我一次从上到下说一下这发布过程的一些动作

  • 暴露本地服务
  • 暴露远程服务
  • 启动netty
  • 连接zookeeper
  • 到zookeeper注册
  • 监听zookeeper

从文档入手,了解全局

经常有人问到,看源码要怎么看.要了解这个服务发布,文档就是一个很好的切入口,如下

再献上文档提供的一个时序图

当然这些都是给已经对源码有一定熟悉的人看的,而我的源码解析类文档,是给对源码不熟悉的人看的.

其实我的每周一更dubbo源码系列文章,我的初衷有以下两个,一个就是做到系统分享,比如dubbo系列文章,我会从不少于内核,服务发布,服务引用,编解码这四个模块去剖析,后面如果有时间,会临摹一个简易的dubbo框架.另一个初衷就是把自己思考的过程和大家分享,在这个分享过程中,其实就是回答了"怎么看源码"这个问题

那么准备好五菱宏光,向秋名山出发

出发秋名山

我早年做Android开发的时候,就发现身边的人都是死在了一个点上,那就是配置环境.对于看源码,很多人最常问的一句话就是,怎么入手,也就是切入点.那么我们还是以开头的日志为例,来找一个这个切入点

仔细看输出日志,就会发现在暴露本地服务之前,有一句很重要的日志,就是

The service ready on spring started. service: com.alibaba.dubbo.demo.DemoService, dubbo version: 2.0.0, current host: 127.0.0.1

我们利用编译器的搜索文本功能,定位到了ServiceBean这个类,这个类是干嘛的?好,我假设我也不知道,既然不知道,那我们来看一下他的继承体系图

从这个图我们看到了许多和spring有关的东西,还发现了一个重要的接口,那就是ApplicationListener.要能敏锐的发现这个关键的接口,首先还是要对spring有一定了解,这个就是spring的事件机制(event).什么是事件机制呢?就比如监听spring容器初始化完成.那我们就定位到这行日志的位置,往下debug

下面要开始敲黑板划重点了.

从方法名我们很直观知道目的,但是这里同事不止一次问过我,这个dubbo.properties文件是怎么时候加载的,好像我根本没有设置,另外这个dubbo.properties文件的名字能不能改?面对这种问题,我从来都是不会直接把答案告诉他,而是告诉他,我是怎么得到这个答案的,如下图

同理,对于log4j.xml这个文件,好像我从来没有写代码加载过,为什么他会加载呢,其实也是同理的

接下来继续往下走,下面这里就是我们的第二道面试题

这里为什么会进行遍历呢,因为dubbo是支持多协议的,看文档原话

dubbo支持多种协议,默认使用的是dubbo协议,具体介绍官方文档写得很清楚,传送地址:相关协议介绍

马不停蹄,下面就到了第三个面试题,也是服务发布的重点,本地暴露远程暴露

为什么会有本地暴露远程暴露呢?不从场景考虑讨论技术的没有意义是.在dubbo中我们一个服务可能既是Provider,又是Consumer,因此就存在他自己调用自己服务的情况,如果再通过网络去访问,那自然是舍近求远,因此他是有本地暴露服务的这个设计.从这里我们就知道这个两者的区别

  • 本地暴露是暴露在JVM中,不需要网络通信.
  • 远程暴露是将ip,端口等信息暴露给远程客户端,调用时需要网络通信.

本篇着重讲解服务发布的整体过程,细节和总结后面会陆续展开.我们忘记下.其实注意一下我这些截图就能发现,我截的时候会特意把类名和方法名都截出来,方便大家能迅速定位.

从上图可知,这里用到了Adaptive(这个东西非常关键,后面会专门一篇讲解).点进ProxyFactory查看源码

@Adaptive注解打在类上和方法上,他们是有区别的(面试也喜欢问这种区别类的问题,这个留在Adaptive专题说,记得关注肥朝每周一篇源码解析 _ ),他打在方法上,就会生成动态编译的Adaptive类,下面就介绍一下怎么看这个动态编译类的源码

首先要将这个log4j的level调整为DEBUG

为什么需要调整成DEBUG,更重要的是把如何知道的,告诉大家,比如如下图,当然这个时候可能会朋友说,我也不知道这个类也还是没办法找到这行代码.其实这个也是在后面专门的一篇Adaptive中会说,到时候我会提供另一种实现思路,我们一起思考对比优劣.

打开DEBUG后,我们重新启动,就会看到日志有如下输出,这段就是相关代码,我们根据包名新建文件,如下

我们在getInvoker方法上打上断点,重启一下.

由上图知道,本地暴露的url是以injvm开头的,下面来看下远程暴露,其实这个也是回答本地暴露远程暴露区别的一个回答点.面试回答要的并不是一个满分的答案,而是从一些细节中,看出一个人,是否真的研究过源码.

还是回到开头那句话,dubbo命名是很规范的,从Wrapper这个命名,其实可以和Spring的Bean Wrapper,以及装饰者设计模式联系起来.同时可以看看文档中的
编码约定

写在最后

上面讲到了getInvoker方法,也就是拿到了Invoker,如果注意到本篇开头的文档说明中的那句Dubbo 处理服务暴露的关键就在 Invoker 转换到 Exporter 的过程,就知道,其实这个服务暴露还有很多细节是未完待续的,但是由于本篇已有一定篇幅,所以只能下周再见.

如果对你有所帮助,希望点赞,关注支持.鉴于本人才疏学浅,不对的地方还望斧正

dubbo源码解析-服务暴露原理相关推荐

  1. Dubbo源码解析 - 远程暴露

    作者:肥朝 原文地址:http://www.jianshu.com/p/893f7e6e0c58 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友情 ...

  2. Dubbo源码解析-——服务导出

    前言 在之前我们讲过Spring和Dubbo的集成,我们在服务上标注了@DubboService的注解,然后最终Dubbo会调用到ServiceBean#export方法中,本次我们就来剖析下服务导出 ...

  3. Dubbo源码解析-——服务引用

    前言 在之前我们讲过Spring和Dubbo的集成,我们在服务上标注了@Reference的注解,然后最终Dubbo会调用到ReferenceBean#get方法中来返回一个代理对象,本次我们就来剖析 ...

  4. dubbo源码解析-zookeeper创建节点

    前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...

  5. dubbo源码解析-逻辑层设计之服务降级

    Dubbo源码解析系列文章均来自肥朝简书 前言 在dubbo服务暴露系列完结之后,按计划来说是应该要开启dubbo服务引用的讲解.但是现在到了年尾,一些朋友也和我谈起了明年跳槽的事.跳槽这件事,无非也 ...

  6. 【dubbo源码解析】--- dubbo中Invoker嵌套调用底层原理

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 文章目录 1 dubbo中Invoker的重要性 2 dubbo RPC链条中代理对象的底层逻辑 2 ...

  7. Dubbo源码解析-Dubbo服务消费者_Dubbo协议(一)

    前言: 在介绍完Dubbo 本地模式(Injvm协议)下的服务提供与消费后,上文我们又介绍了Dubbo远程模式(dubbo协议)下的服务暴露过程,本质上就是通过Netty将dubbo协议端口暴露出去, ...

  8. dubbo(5) Dubbo源码解析之服务调用过程

    来源:https://juejin.im/post/5ca4a1286fb9a05e731fc042 Dubbo源码解析之服务调用过程 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与 ...

  9. dubbo源码解析-集群容错架构设计

    前言 本来是想把整个dubbo源码解析一次性弄完,再做成一个系列来发布的,但是正巧最近有位好朋友要去杭州面试,就和我交流了一下.本着对dubbo源码略有心得的心态,在交流过程中也发表了个人的一些粗劣的 ...

  10. dubbo源码解析(二)

    大家好,我是烤鸭: dubbo 源码解析: 1.服务导出 介绍: Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可分为三 ...

最新文章

  1. 1004 Counting Leaves (30分) (vector实现)
  2. java超级简单到爆的Excel导入导出(easypoi)
  3. instantclient_11_2 连接oracle数据
  4. 安卓开发必备知识体系:安卓篇
  5. matlab处理svm的数据,SVM-GUI 使用支持向量机(SVM)算法进行处理数据,提取特征参数,并通过MATLAB界面显示相关数 238万源代码下载- www.pudn.com...
  6. word如何设置长宽高_word怎么设计表格高和宽
  7. xpe低配置系统解决“写缓存失败”问题
  8. 轻松搞定个人虚拟桌面部署之4-配置远程访问
  9. ELK学习总结(2-2)单模式CRUD操作
  10. 【Flink】flink消费kafka报错 KafkaConsumer.assign Ljava/util/List
  11. Java Script 基本知识点
  12. python识别cad图纸_手把手教你广联达软件如何识别天正CAD图纸
  13. 十年磨一剑:梳理淘宝网技术架构的发展
  14. Shiro 完整教程及样例demo
  15. Oracle JDK收费理解
  16. 计算机系统老更新,win10电脑老是重启更新怎么办_完美解决win10电脑老是重启更新的方法...
  17. Ugly Windows UVA - 1419
  18. (七)苏世民:我的经验和教训:决策(34)
  19. API管理平台,管理企业所有API资产
  20. 网优5g前景_5G网络优化师前景怎么样?

热门文章

  1. ssh 命令连接服务器
  2. java分页查询代码实现
  3. 创翼软件linux版本,创翼客户端_创翼客户端下载[2021官方最新版]创翼客户端安全下载_ 极速下载...
  4. 2016年考研数学一真题pdf ​​​
  5. 基于深度学习的关系抽取
  6. 层次图和HIPO图---描绘软件结构的图形工具
  7. python经典编程100例(1)
  8. Scratch案例——放烟花
  9. 计算机专业考研复试经验【最终版本】(来自一位上岸又退学的二战dog)
  10. python实现团队游戏小程序——你画我猜