在应用编写好服务并进行以后,dubbo负责将服务export出去,dubbo export服务的时候主要作了如下几件事:java
暴露服务的配置方式有:spring
以经常使用的xml配置为例,前面说了dubbo的xml自定义标签最后都是将对应的bean注入容器中,<dubbo:service /> 对应的就是ServiceBean,service暴露服务就在spring初始化ServiceBean的时候网络
<dubbo:service interface="com.test.service.TestDubboService" ref="testDubboServiceImpl"/>
dubbo解析xml会将对应的bean—ServiceBean注入到spring容器中,因为解析xml的时候配置的bean是非lazyInit的,因此在spring容器初始化完成以后,会初始化全部非lazyInit的bean。app
在spring容器初始化后,会广播ContextRefreshedEvent事件通知,ServiceBean实现了ApplicationListener,在收到该事件以后调用export方法框架
// AbstractApplicationContext public void refresh() throws BeansException, IllegalStateException { // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. // 里面会广播ContextRefreshedEvent事件 finishRefresh(); } // ServiceBean public void onApplicationEvent(ApplicationEvent event) { // 在容器初始化完成以后收到ContextRefreshedEvent事件,开始export服务 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()); } export(); } } }
服务export从ServiceConfig#export开始jvm
若是scope没有配置或者配置local、remote,dubbo会将服务export到本地,意思就是:将服务以injvm协议export出去,若是是同一个jvm的应用能够直接经过jvm发起调用,而不须要经过网络发起远程调用。ide
export到本地主要作了如下几件事:ui
若是scope没有配置或者配置remote,dubbo会建立invoker,建立invoker的时候会启动NettyServer,监听指定的端口等待consumer请求。在dubbo中provider和consumer端都会有Invoker,实现的是同一个接口,可是不一样的实现,invoker的意义就是服务的代理,provider侧的invoker就是提供服务的可执行体,在netty接收到请求以后会经过invoker来处理,最后调用目标服务。url
建立invoker并启动NettyServer的调用堆栈线程
export的主要过程是:
filter和listener是可扩展的,能够本身实现filter和listener,按照SPI方式配置好,dubbo会自动加载。
前面只是完成service的启动并具有可被请求的状态,可是dubbo做为一个支持服务自发现的框架,还会把provider的信息注册到registry,而且订阅configurators。
注册的调用堆栈是
注册和订阅主要逻辑在RegistryProtocol#export
registry就是一个目录服务,注册的过程也就是建立对应的目录,并订阅关心的目录变化。provider会在registry中建立相似以下的目录结构
其中provider注册的url为,会建立com.foo.BarService、provider和providerUrl节点
dubbo/com.test.service.TestDubboService/providers/dubbo%3A%2F%2F192.168.0.102%3A20880%2Fcom.test.service.TestDubboService%3Fapplication%3Dcom.test.demo%26default.export%3Dtrue%26export%3Dtrue%26generic%3Dfalse%26interface%3Dcom.test.service.TestDubboService%26pid%3D45599%26side%3Dprovider%26timestamp%3D1515313385792
接下来会建立并订阅configurators节点,订阅的意思就是监听configurators及其子节点,建立configurators的时候会添加listener,provider端监听configurators的listener是:
com.alibaba.dubbo.registry.integration.RegistryProtocol.OverrideListener#notify
在治理中心中修改provider的配置的时候,注册中心会通知监听的listener,provider会进行相关配置。
export服务是dubbo关键路径中的第一步,此时dubbo已经具有了被consumer自动发现并调用的条件,接下来就是consumer发现服务。