Dubbo原理何源码解析之服务暴露

Posted JAVA烂猪皮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo原理何源码解析之服务暴露相关的知识,希望对你有一定的参考价值。

一、框架设计

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

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

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

Dubbo原理何源码解析之服务暴露



2.2 延迟暴露

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

ServiceConfig.java

Dubbo原理何源码解析之服务暴露

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



2.3 参数检查

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

  • 泛化调用

  • 本地实现

  • 本地存根

  • 本地伪装

  • 配置(application、registry、protocol等)

ServiceConfig.java

Dubbo原理何源码解析之服务暴露

Dubbo原理何源码解析之服务暴露


2.4 多协议、多注册中心

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

ServiceConfig.java

Dubbo原理何源码解析之服务暴露


2.5 组装URL

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

ServiceConfig.java

Dubbo原理何源码解析之服务暴露


2.6 本地暴露

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

ServiceConfig.java

Dubbo原理何源码解析之服务暴露

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

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


2.7 远程暴露

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

ServiceConfig.java

Dubbo原理何源码解析之服务暴露

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

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

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


2.8 暴露服务

 协议为例:

DubboProtocol.java

Dubbo原理何源码解析之服务暴露

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

DubboProtocol.java

Dubbo原理何源码解析之服务暴露

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

HeaderExchager.java

Dubbo原理何源码解析之服务暴露

Transporters.java

Dubbo原理何源码解析之服务暴露

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

NettyTransporter.java

Dubbo原理何源码解析之服务暴露

NettyServer.java

Dubbo原理何源码解析之服务暴露

AbstractServer.java

Dubbo原理何源码解析之服务暴露

NettyServer.java

Dubbo原理何源码解析之服务暴露


2.9 服务注册

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

RegistryProtocol.java

Dubbo原理何源码解析之服务暴露

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

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

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

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



以上是关于Dubbo原理何源码解析之服务暴露的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo服务发布引用

Dubbo源码解析:服务暴露与发现

Dubbo原理和源码解析之服务引用

dubbo源码解析-zookeeper创建节点

【dubbo源码】13. 服务消费方之@Reference依赖注入原理

dubbo框架-学习-dubbo原理