URL
URL:统一资源定位符,一般代指地址,本质就是一串包含特殊字符的字符串。
dubbo是采用URL的方式来约定参数类型。
URL具体参数如下:
- protocol: 指的是dubbo的各种协议:如dubbo thrift http
- username/password
- host/port
- path: 接口的名称
- parameters: 参数键值对
服务暴露全流程
- 检测配置,如果有的配置为空的话默认创建,并且组装成URL
- 暴露服务,暴露在本地的服务和远程的服务
- 注册服务到注册中心。
从对象构建转换的角度看可以分为两个步骤:
- 将服务实现类转换成Invoker
- 将Invoker通过具体的协议转换成Exporter
具体的实现类 -> ServiceConfig -> ProxyFactory (javasist 或者jdk的动态代理) -> Invoker -> Protocol -> Exporter
SerrviceBean
- 实现了ApplicationListener, 在IOC容器刷新完成之后调用onApplicationListener,做服务暴露
dubbo支持多注册中心,并且支持多个协议,如果一个服务有多个协议那么就都要暴露,比如同时支持dubbo协议和hessian协议,那么需要将这个服务用两种协议分别向多个注册中心暴露注册。
本地暴露
本地暴露走的是injvm协议。
为什么要封装成invoker其实就是向屏蔽调用的细节,统一暴露出一个可执行体,这样调用者简单的使用它,向它发起invoker调用,它有可能是一个本地的实现,也有可能是一个远程的实现,也可能一个集群的实现。
- 为什么要搞一个本地暴露呢?
可能存在同一个JVM内部引用自身服务的情况,因此暴露的本地服务在内部调用的时候可以直接消费同一个JVM的服务避免网络间的通信。
远程暴露
和本地暴露一样,需要封装成invoker,不过这里相对而言比较复杂一些,走registry协议,然后参数里又有export=dubbo:// 这个走dubbo协议,我们可以得知会通过registry协议找到RegistryProtocol进行export, 然后根据export字段得到值然后执行DubboProtocol的export方法。