服务暴露过程

版本

2.5.7

服务暴露过程过程

dubbo的服务注册、调用等都是通过SPI实现的,即都需要通过ExtensionLoader来加载,且均为单例。

1、只暴露服务端口

在没有注册中心,直接暴露提供者的情况下 , ServiceConfig 解析出的 URL 的格式为:
dubbo://service-host/com.foo.FooService?version=1.0.0
基于扩展点自适应机制,通过 URL 的 dubbo:// 协议头识别,直接调用 DubboProtocol 的
export() 方法,打开服务端口。

2、向注册中心暴露服务

在有注册中心,需要注册提供者地址的情况下 , ServiceConfig 解析出的 URL 的格式为:
registry://registry-host/com.alibaba.dubbo.registry.RegistryService?
export=URL.encode("dubbo://service-host/com.foo.FooService?version=1.0.0") ,
基于扩展点自适应机制,通过 URL 的 registry:// 协议头识别,就会调用 RegistryProtocol 的
export() 方法,将 export 参数中的提供者 URL,先注册到注册中心。
再重新传给 Protocol 扩展点进行暴露: dubbo://service-host/com.foo.FooService?
version=1.0.0 ,然后基于扩展点自适应机制,通过提供者 URL 的 dubbo:// 协议头识别,就会调
用 DubboProtocol 的 export() 方法,打开服务端口。

3、详细流程

程序启动后,加载到ServiceConfig类,执行doExport方法:

  1. 传入的类是否为接口,接口中是否存在配置的方法;
  2. 引用ref是否为空,且是否为接口的实例;
  3. 检查是否有应用配置;
  4. 检查是否有注册中心配置;
  5. 检查是否有协议配置;
  6. 执行doExportUrls方法。

doExportUrls中,通过loadRegistries方法将将配置转换为URL:

  1. 获取注册地址;
  2. 通过ExtensionLoader加载RegistryFactory;
  3. 将之前的配置转为URL,此时协议为registry://。

接下来将协议配置和生成的URL一起传入doExportUrlsFor1Protocol方法中:

  1. 获取dubbo配置的IP和端口,若未配置,则取本地IP和按递增取的可用端口;
  2. 再次组装URL,此时协议为dubbo://(根据配置)。
  3. 根据scope,选择暴露本地和远程服务

暴露服务的时候,默认使用的是JavassistProxyFactory生成invoker,并export出去,实际上就是类似打开一个Socket服务的概念。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,001评论 19 139
  • dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay="5000"),另外一种是没有设置延迟暴露或者...
    加大装益达阅读 21,335评论 5 36
  • dubbo服务发布 dubbo服务发布只需在spring.xml中如下配置即可:<dubbo:service in...
    阿飞的博客阅读 1,633评论 6 10
  • 今天是女儿第一天坐校车去上学,早上一叫她起床,立刻就起来,她自已说我要早早去,可别迟到了。所以她麻利的去洗漱,然后...
    孙佳婧妈妈阅读 176评论 0 0
  • 活着的幽灵,还是作为幽灵也要贯彻自己的信念活着?生死真正的界限…… 灵感,面码。
    乐不思命阅读 215评论 0 1