URL

URL:统一资源定位符,一般代指地址,本质就是一串包含特殊字符的字符串。
dubbo是采用URL的方式来约定参数类型。
URL具体参数如下:

  • protocol: 指的是dubbo的各种协议:如dubbo thrift http
  • username/password
  • host/port
  • path: 接口的名称
  • parameters: 参数键值对

    服务暴露全流程

  1. 检测配置,如果有的配置为空的话默认创建,并且组装成URL
  2. 暴露服务,暴露在本地的服务和远程的服务
  3. 注册服务到注册中心。

从对象构建转换的角度看可以分为两个步骤:

  1. 将服务实现类转换成Invoker
  2. 将Invoker通过具体的协议转换成Exporter

    具体的实现类 -> ServiceConfig -> ProxyFactory (javasist 或者jdk的动态代理) -> Invoker -> Protocol -> Exporter

SerrviceBean

  • 实现了ApplicationListener, 在IOC容器刷新完成之后调用onApplicationListener,做服务暴露

dubbo支持多注册中心,并且支持多个协议,如果一个服务有多个协议那么就都要暴露,比如同时支持dubbo协议和hessian协议,那么需要将这个服务用两种协议分别向多个注册中心暴露注册。

注册本质就是:根据配置组装成注册中心相关的url。

本地暴露

本地暴露走的是injvm协议。
为什么要封装成invoker其实就是向屏蔽调用的细节,统一暴露出一个可执行体,这样调用者简单的使用它,向它发起invoker调用,它有可能是一个本地的实现,也有可能是一个远程的实现,也可能一个集群的实现。

  • 为什么要搞一个本地暴露呢?

    可能存在同一个JVM内部引用自身服务的情况,因此暴露的本地服务在内部调用的时候可以直接消费同一个JVM的服务避免网络间的通信。

远程暴露

和本地暴露一样,需要封装成invoker,不过这里相对而言比较复杂一些,走registry协议,然后参数里又有export=dubbo:// 这个走dubbo协议,我们可以得知会通过registry协议找到RegistryProtocol进行export, 然后根据export字段得到值然后执行DubboProtocol的export方法。