说明
本文只探讨 dubbo 服务暴露的相关内容 , 服务暴露可以划分为本地暴露 , 网络暴露 , 注册中心暴露这三部分 , 对照 Dubbo Architecture 中的 0. start , 1.register 这两部分。也可以说是 provider 的发布过程。本人能力有限不能将所有细节探究的很清楚,希望能和大家多交流相互学习。
![89e6a116c80d8cc1dd75cf2b4d09a82a.png](https://i-blog.csdnimg.cn/blog_migrate/cf364f4e3a5c7e8a1a6f3c52402ebfa8.jpeg)
dubbo 服务暴露顺序
服务的暴露过程大致上分为四个过程 ,容器初始化 , 服务本地暴露 , 服务网络暴露 , 服务注册中心暴露。
![a5af34c6e8d5efb0fb3e4386b97addb1.png](https://i-blog.csdnimg.cn/blog_migrate/2d8d5d7adc462b98112c1114728b4e2e.jpeg)
在容器初始化时会读取配置文件并解析 , dubbo 使用
com.alibaba.dubbo.config.spring.schema.DubboBeanDefinitionParsercom.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
来进行配置文件的解析 , 解析每一个 配置时都会对应的在 spring 容器中初始化一个 ServiceBean 的实例对象 , ServiceBean 中封装了用户自定义的服务接口实现类的实例对象。 ServiceBean 实现了 spring 的 ApplicationListener 接口 , 会对容器发生的事件进行处理 , 当有事件发布时 spring 调用每一个 Listener 的 onApplicationEvent 方法 , dubbo 服务暴露就是在这个过程中完成的。服务暴露的范围是可以配置的 , 在 scope 可选配置 "none" (不暴露服务) , "local" (本地暴露), "remote" (网络暴露,注册中心暴露)。没有指定默认进行 remote 暴露处理。
public void onApplicationEvent(ApplicationEvent event) { if (ContextRefreshedEvent.class.getName().equals(event.getClass().getName())) { if (isDelay() && !isExported() && !isUnexported()) { if (logger.isInfoEnabled()) { logger.info("The service ready on spring started. service: " + getInterface()); } // dubbo 服务暴露 export(); } } }
dubbo 服务本地暴露
dubbo 在进行服务的本地暴露时会将 host , port , protocol (dubbo 中的 protocol) 进行修改,host 会改为 127.0.0.1 , port 改为 0 , protocol 改为 injvm , 得到的 URL 类似这样 :
injvm://127.0.0.1/net.j4love.dubbo.quickstart.