1. 【bbo源碼】5.配置信息解析-註解版
用於把bbo.properties讀到spring的environment中,
這個工作是由Spring的類來完成的.檢測到某個需要注冊的Bean上有@PropertySource註解,就會讀該文件的配置信息,弄到environment對象的MutablePropertySources對象中。
後期會把配置信息弄到bbo 配置類中.
該註解上還有@DubboComponentScan,@EnableDubboConfig,這兩個註解是bbo用註解與spring集成的核心了
該註解用@import導入了這個類
實現了ImportBeanDefinitionRegistrar介面,那麼spring在實例化的時候會調用重寫ImportBeanDefinitionRegistrar介面的registerBeanDefinitions方法,並且將用@Import導入的類的元數據包裝成importingClassMetadata對象。
其實就是為了獲取入口類AnnoBean上的@EnableDubboConfig註解里的multiple屬性配置的值,默認是true.
然後注冊了兩個DubboConfigConfiguration的內部類
通過讀Class對象注冊到ioc容器
類上有@EnableDubboConfigBindings,值為@EnableDubboConfigBinding數組
通過綁定,將有對應前綴的配置信息賦值到對應的配置類中
又用@Import導入DubboConfigBindingsRegistrar類,DubboConfigBindingsRegistrar這個類又實現了ImportBeanDefinitionRegistrar,EnvironmentAware介面
實現ImportBeanDefinitionRegistrar肯定是為了另外導入一些類,並且拿到導入的源類,獲取源類上配置的信息
實現EnvironmentAware是為了拿到spring的environment對象,因為 bbo.properties 已經被@PropertySource註解機制載入到了environment.MutablePropertySources中,在這里只對beanName的創建有作用。
registrar.registerBeanDefinitions :
注冊的過程中,需要從environment對象中拿bbo相關的配置,比如ApplicationConfig只拿
bbo.application.*相關的配置,然後創建ApplicationConfig的BeanDefinition.
如果 @EnableDubboConfigBinding配置的multiple為true(默認為false),並且在配置文件中配置了同樣前綴的屬性,如:
這樣會為同一種配置類型,生成兩個BD.beanName不同的配置Bean,名稱規則如下所示, #0表示的是'.'在配置的key中出現的位置
之後還會注冊一個BeanPostProcessor類型的類的beanDefinition,BeanPostProcessor類型 會在每一個Bean實例化的過程中,根據配置的前綴,從environment拿出所需的配置,根據beanName來處理beanName相同的這一個配置Bean,把配置信息綁定到配置類的屬性中。
.
利用 bboConfigBinder 對象來綁定前綴為bbo.application的配置信息到配置Bean中
這里bboConfigBinder對象是中的一個屬性,是在因為這個類實現了InitializingBean這個介面的afterPropertiesSet方法,bboConfigBinder對象就是在這里初始化的
最後用的DataBinder的api把一個MutablePropertyValues綁定到Bean的屬性
@import進來了DubboComponentScanRegistrar類
DubboComponentScanRegistrar又實現了ImportBeanDefinitionRegistrar介面,實現registerBeanDefinitions方法.
跟xml的邏輯一樣,同樣是
2. bbo從 2.4.5 升級到 2.7.8 注意事項
一、升級bbo版本
二虧冊、替換所有Spring版本
因為bbo升級Spring版本也需要跟著升級這里升級為5.2.11.RELEASE
生成的spring依賴要統一不然會出錯並桐
四、 全文替換 com.alibaba.bbo 為org.apache.bbo *
包括啟動腳絕空坦本從
1、 com.alibaba.bbo.container.Main 替換為 org.apache.bbo.container.Main
2、bbo 配置文件的schema
3. 關於升級 Dubbo 版本到 2.6.5 後啟動失敗的「坑」
Dubbo 從低版本升級到 2.6.5 版本後,啟動失敗,報錯如下:
<b><font color='red'>上終極方案:使用 2.6.2 以下版本或者 2.7.0 以上版本的 bbo ;</font></b>
具體解決方式需要根據項目的情況解決,提供一些其他方案:
刪除 web.xml 中如下的配置:
Spring Boot 工程沒有特別好的解決方案,提供兩個解決思路:
這個方案也沒有繞過添加 web.xml 的命運,做法如下:
觀察報錯日誌,報錯位置很明顯是 Spring 框架初始化時的報錯,重點是: there is already a root application 。
這個錯誤拋出位置余汪返位於: Spring-web 包的 ContextLoader 類的 initWebApplicationContext 方法。
原因很明顯, ContextLoader 被調用了至少兩遍,第二遍報錯導致項目初始化失敗,其主要的「罪魁禍首」是 bbo 包下面的 web-fragment.xml 。
Servlet 3.0 是隨著 Java EE 6 規范發布的,主要新增特性:
支持 Servlet 3.0 規范的容器,在啟動後會掃描工程的 jar 包,找到符合規范的 添加了相關註解的類 和 web-fragment.xml 然後跟 web.xml 的配置合並作為整個項目的初始化配置。
上述問題的發生原因很明顯了:
這個是 Servlet 3.0 提供的一個屬性,等同一個開關,設置為 true 則表示 web.xml 已經提供了全部的配置信息,不需要容器再去各個 jar 包找配置了陵罩,換句話就是:關閉 可插特性 ;
這個屬性是 注釋裡面提供的解決思路。這個屬性可以理解為指定 web-fragment.xml 的載入順序,和 ordering 標簽的區別是, absolute-ordering 僅僅針對我們指定的 web-fragment.xml 做排序。
輕易升級一個基礎框架不是一個好的做法豎飢,<b>升級基礎框架還是應該關注下當前版本和目標升級版本,框架作者做了些什麼事情,出現過什麼BUG。</b>
當前的 Spring Boot 的解決方案並不讓人滿意,畢竟 Spring Boot 的無Xml的感覺還是很爽的,為了這個升級引入了 web.xml 會有一點點不爽。
4. Dubbo2.7.8服務啟動過程源碼分析
可以從 git clone,導入intellij idea,子模塊bbo-demo可以調試。
也可以新建Maven工程,自寫demo。 推薦(要動手) 。
本文以新建為例,並 推薦 引入nacos做為注冊中心(可選其他注冊中心)。
新建介面:
新建介面實現類AnnotationProviderServiceImpl:
新建啟動類AnnotationProviderBootstrap.
bbo-provider.properties配置文件如下:
整體目錄結構:
上述工程是基於annotation方式創建的,所以啟動類為
設置斷點,並啟動。
AnnotatedBeanDefinitionReader的190-192行:
回到84行:
AbstractApplicationContext的524行:
上述是初始化各種Processor,會做兩部分操作,可實時查看控制台輸出日誌。
在的50行設置斷點。
回到546行:
來到DubboBootstrap的893行start方法, 核心 所在:
initialize();主要是一些初始化操作。
重點關注exportServices
在exportServices中:
ServiceConfig被翻譯成:
<bbo:service beanName="ServiceBean:com.zp.bbo.api.HelloService" />
sc.export()過程:
見ServiceConfig183行:
init serviceMetadata之後真正執行doExport動作,最終來到ServiceConfig304行:doExportUrls
這里做了幾件事:
1.registerProvider:將HelloService放入 providers 和providersWithoutGroup。
2.獲取注冊中心地址:registryURLs
3.doExportUrlsFor1Protocol
4.exportLocal
這里根據不同的Protocol啟動不同的Server。可調試進入DubboProtocol的export方法。
5.在RegistryProtocol中注冊到注冊中心
調試至FailbackRegistry240行:
進入NacosRegistry152行,進行注冊。
進入NacosNamingService139行:registerInstance
最終NamingProxy168行registerService完成注冊。
6.exported() 分發ServiceConfigExportedEvent事件
那麼到此,bbo的服務提供者注冊過程分析就已經全部完成。
接下來將進行bbo其他源碼分析,包括負載均衡,路由等等。