在應用編寫好服務並進行以後,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發現服務。