2019独角兽企业重金招聘Python工程师标准>>>

一、框架设计

在官方《Dubbo 用户指南》架构部分,给出了服务调用的整体架构和流程:

另外,在官方《Dubbo 开发指南》框架设计部分,给出了整体设计:

以及暴露服务时序图:

本文将根据以上几张图,分析服务暴露的实现原理,并进行详细的代码跟踪与解析。

二、原理和源码解析

2.1 标签解析

从文章《Dubbo原理和源码解析之标签解析》中我们知道,<dubbo:service> 标签会被解析成 ServiceBean。

ServiceBean 实现了 InitializingBean,在类加载完成之后会用 afterPropertiesSet() 方法。在 afterPropertiesSet() 方法中,依次解析以下标签信息:

  • <dubbo:provider>

  • <dubbo:application>

  • <dubbo:module>

  • <dubbo:registry>

  • <dubbo:monitor>

  • <dubbo:protocol>

方法,实现了服务暴露的功能。

ServiceBean.java

2.2 延迟暴露

ServiceBean 扩展了 ServiceConfig,调用 export() 方法时由 ServiceConfig 完成服务暴露的功能实现。

ServiceConfig.java

由上面代码可知,如果设置了 delay 参数,Dubbo 的处理方式是启动一个守护线程在 sleep 指定时间后再 doExport。

2.3 参数检查

在 ServiceConfig 的 doExport() 方法中会进行参数检查和设置,包括:

  • 泛化调用

  • 本地实现

  • 本地存根

  • 本地伪装

  • 配置(application、registry、protocol等)

ServiceConfig.java

2.4 多协议、多注册中心

支持多协议和多注册中心:

ServiceConfig.java

2.5 组装URL

针对每个协议、每个注册中心,开始组装 URL。

ServiceConfig.java

2.6 本地暴露

如果配置 scope=none, 则不会进行服务暴露;如果没有配置 scope 或者 scope=local,则会进行本地暴露。

ServiceConfig.java

1. 暴露服务的时候,会通过代理创建 Invoker;

2. 本地暴露时使用 injvm 协议,injvm 协议是一个伪协议,它不开启端口,不能被远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链。

2.7 远程暴露

如果没有配置 scope 或者 scope=remote,则会进行远程暴露。

ServiceConfig.java

在服务暴露时,有两种情况:

  • 不使用注册中心:直接暴露对应协议的服务,引用服务时只能通过直连方式引用

  • 使用注册中心:暴露对应协议的服务后,会将服务节点注册到注册中心,引用服务时可以通过注册中心动态获取服务提供者列表,也可以通过直连方式引用

2.8 暴露服务

协议为例:

DubboProtocol.java

调用 openServer() 方法创建并启动 Server:

DubboProtocol.java

Exchanger (默认 HeaderExchanger)封装请求响应模式,同步转异步,以 Request、Response 为中心:

HeaderExchager.java

Transporters.java

底层传输默认使用 NettyTransporter,最终是创建 NettyServer:

NettyTransporter.java

NettyServer.java

AbstractServer.java

NettyServer.java

2.9 服务注册

如果使用了注册中心,则在通过具体协议(如 Dubbo 协议)暴露服务之后(即在 2.8 基础之上)进入服务注册流程,将服务节点注册到注册中心。

RegistryProtocol.java

getRegistry() 方法根据注册中心类型(默认 Zookeeper)获取注册中心客户端,由注册中心客户端实例来进行真正的服务注册。

注册中心客户端将节点注册到注册中心,同时订阅对应的 override 数据,实时监听服务的属性变动实现动态配置功能。

最终返回的 Exporter 实现了 unexport() 方法,这样在服务下线时清理相关资源。

至此,服务暴露流程结束。

注:关注作者微信公众号,了解更多分布式架构、微服务、netty、MySQL、spring、性能优化、等知识点。

公众号:《Java烂猪皮》

转载于:https://my.oschina.net/lanzhupi/blog/1830537

Dubbo原理何源码解析之服务暴露相关推荐

  1. 暴露的全局方法_Dubbo源码解析实战 - 服务暴露原理

    欢迎关注全是干货的技术公众号 dubbo面试中比较喜欢问的两个点:服务发布和服务引用. 人性的拷问 服务发布过程中做了哪些事 dubbo都有哪些协议,他们之间有什么特点,缺省值是什么 什么是本地暴露和 ...

  2. Dubbo 实现原理与源码解析系列 —— 精品合集

    摘要: 原创出处 http://www.iocoder.cn/Dubbo/good-collection/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1.[芋艿]精尽 Dubbo 原理与源码专栏 2.[ ...

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

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

  4. 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉

    YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...

  5. SpringMVC工作原理及源码解析

    SpringMVC工作原理及源码解析 一:SpringMVC原理图 二:SpringMVC的主要组件 1.前端控制器DispatcherServlet: 2.处理器映射器HandlerMapping: ...

  6. 【特征匹配】ORB原理与源码解析

    相关 : Fast原理与源码解析 Brief描述子原理与源码解析 Harris原理与源码解析 http://blog.csdn.net/luoshixian099/article/details/48 ...

  7. Redis进阶- Redisson分布式锁实现原理及源码解析

    文章目录 Pre 用法 Redisson分布式锁实现原理 Redisson分布式锁源码分析 redisson.getLock(lockKey) 的逻辑 redissonLock.lock()的逻辑 r ...

  8. PCA-SIFT原理及源码解析

    相关: SIFT原理与源码解析 SURF原理与源码解析 ORB原理与源码解析 FAST原理与源码解析 BRIEF描述子原理与源码解析 Harris原理与源码解析 转载请注明出处:http://blog ...

  9. Netty 源码解析系列-服务端启动流程解析

    netty源码解析系列 Netty 源码解析系列-服务端启动流程解析 Netty 源码解析系列-客户端连接接入及读I/O解析 五分钟就能看懂pipeline模型 -Netty 源码解析 1.服务端启动 ...

最新文章

  1. 《西河大鼓——夸轿车》(唱词文本)
  2. 快速双边滤波在High-Dynamic Range(HDR)图像显示中的应用。
  3. 将查询后的数据导入到其他表中
  4. 专题一:预处理数据(使用sklearn-preprocessing)
  5. Python单元测试之unittest
  6. Java 整数型的进制间的互相转换
  7. SAP的软件是如何深刻影响着世界的?
  8. 软件工程中的启发规则
  9. 为何有些程序员总是想要“干掉”产品经理?
  10. 织梦重置mysql数据库密码忘记_织梦cms管理员密码忘记了怎么重置找回?
  11. 聊聊Lambda架构
  12. matlab画多组数据折线图_Python数据分析之初识可视化
  13. 五分钟读懂UML类图(转)
  14. 从前端开发者看待用友建筑云移动端单点登录与报错原因
  15. bzoj 3123 可持久化线段树启发式合并
  16. Linux自学之旅-安装篇(格式化)
  17. 无法在驱动器1分区上安装W ndOwS,安装win10提示无法在驱动器0分区上安装windows
  18. def在python中什么意思_《python中的def是什么意思》
  19. 大数据、云计算和物联网的关系
  20. spring boot 2.x 拦截器

热门文章

  1. 普华永道重磅报告:决定未来的八大核心科技
  2. 图论之拓扑排序 poj 2367 Genealogical tree
  3. JS数字转换成货币格式
  4. Merge into的使用
  5. hive2.3.2安装使用
  6. 设计模式——6适配器模式(Adapter)
  7. 如何让网页不受电信114劫持
  8. 《Python数据可视化编程实战》——5.5 用OpenGL制作动画
  9. 更换主版之后远程管理卡恢复操作
  10. 曲苑杂坛--收缩数据库文件