一、URL
在说Dobbu之前我们先来讲一下URL,为什么要提URL呢?
一般而言我们说的 URL 指的就是统一资源定位符,在网络上一般指代地址,本质上看其实就是一串包含特殊格式的字符串,标准格式如下:
https://www.linzhuotech.com/Product/download?value=lz
而Dubbo就是采用URL的方式作为约定参数类型,也可以理解为Provider和Consumer沟通的枢纽。如果没有这个标准,那么不同的接口就会以不同的参数来传递信息,而且通过统一的契约之后,代码会显得更加的规范。
二、服务暴露过程
1、执行过程
第一步:检测Dubbo配置,如果配置为空则会默认创建,并组装成URL。
第二步:暴露服务,Provider将服务暴露给本地服务和远程的服务。
第三步:将Provider服务提交至注册中心。
2、对象创建过程
第一步:Dubbo将服务实现类转换成Invoker。
第二步:将Invoker转换成Exporter。
三、源码分析
1、在初始化过程中service定义
这里实现了ApplicationListener,所以就会在SpringIOC容器刷新完成后调用onApplicationEvent()方法,这个方法里面做的就是服务暴露,也是服务的启动点。接着通过调用export方法完成暴露过程。
而Dubbo支持多注册中心,并且支持多个协议,一个服务如果有多个协议那么就都需要暴露。因此需要将多个协议分别向多个注册中心暴露注册,这里我们看一下doExportUrls方法具体实现。
2、封装成invoker
至于为什么要封装成invoker其实就是想屏蔽调用的细节,统一暴露出一个可执行体。
然后我们看下export是什么样子。如下图,export方法是标注了@Adaptive注解的,因此会生成代理类,然后代理类会根据Invoker里面的URL参数得知具体的协议,然后通过Dubbo SPI机制选择对应的实现类进行export。
对于完整流程我们可以看一下官网的时序图。