美文网首页JAVA后端架构
Dubbo原理何源码解析之服务暴露

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

作者: AI乔治 | 来源:发表于2018-06-14 21:31 被阅读5次

    一、框架设计

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

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

    以及暴露服务时序图:

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

    二、原理和源码解析

    2.1 标签解析

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

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

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

    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() 方法,这样在服务下线时清理相关资源。

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

    在此我向大家推荐一个架构学习交流群。交流学习群号:478030634 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

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

    公众号:《Java烂猪皮》

    相关文章

      网友评论

        本文标题:Dubbo原理何源码解析之服务暴露

        本文链接:https://www.haomeiwen.com/subject/nssueftx.html