前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dubbo原理何源码解析之服务暴露

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

作者头像
烂猪皮
发布2018-08-03 16:54:48
3680
发布2018-08-03 16:54:48
举报
文章被收录于专栏:JAVA烂猪皮JAVA烂猪皮

一、框架设计

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

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


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA烂猪皮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、框架设计
  • 二、原理和源码解析
    • 2.1 标签解析
      • 2.2 延迟暴露
        • 2.3 参数检查
          • 2.4 多协议、多注册中心
            • 2.5 组装URL
              • 2.6 本地暴露
                • 2.7 远程暴露
                  • Transporters.java
                    • 2.9 服务注册
                    相关产品与服务
                    微服务引擎 TSE
                    微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档