Dubbo服务暴露的过程

服务的暴露起始于 Spring IOC 容器刷新完毕之后,
会根据配置参数组装成 URL, 然后根据 URL 的参数来进行本地或者远程调用。
会通过 proxyFactory.getInvoker,利用 javassist 来进行动态代理,封装真的实现类,
然后再通过 URL 参数选择对应的协议来进行 protocol.export,默认是 Dubbo 协议。
在第一次暴露的时候会调用 createServer 来创建 Server,默认是 NettyServer。
然后将 export 得到的 exporter 存入一个 Map 中,供之后的远程调用查找,
然后会向注册中心注册提供者的信息。

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

一句话概括服务暴露:Service->Invoker->Exporter
Dubbo 会在 Spring 实例化完 bean 之后,在刷新容器最后一步发布 ContextRefreshEvent 事件的时候,通知实现了 ApplicationListener 的 ServiceBean 类进行回调 onApplicationEvent 事件方法,Dubbo 会在这个方法中调用 ServiceBean 父类 ServiceConfig 的 export 方法,而该方法真正实现了服务的(异步或者非异步)发布。
image.png

源码解读

dubbo服务配置参数
  1. dubbo.properties文件,dubbo会去读取该文件的内容作为服务的参数,Dubbo的源码中叫做PropertiesConfiguration
  2. 配置中心,dubbo在2.7版本后就支持了分布式配置中心,可以在dubbo-admin中操作配置中心,分布式配置中心相当于远程的dubbo.properties文件。可以在dubbo-admin中修改该远程dubbo.properties文件。配置中心支持全局配置,也可以按应用级别进行配置,Dubbo的源码中叫做ExternalConfiguration(全局)跟AppExternalConfiguration(应用)
  3. 系统变量配置,启动应用程序是通过-D的方式制定参数,Dubbo的源码中叫做SystemConfiguration
  4. 通过@Service注解配置的参数,Dubbo的源码中叫做AbstractConfig
  5. 环境配置Dubbo的源码中叫做EnvironmentConfiguration
    默认优先级
    SystemConfiguration> AppExternalConfiguration>ExternalConfiguration>AbstractConfig>PropertiesConfiguration
    可以看出-D方式配置的优先级最高,配置中心次之,注解随后,dubbo.properties最后
    dubbo.properties也支持给服务配置参数
    1. dubbo.service.{interface-name}[.{method-name}].timeout = 3000
    服务配置也可能继承上级应用