導航:首頁 > 源碼編譯 > dubbo源碼版本升級

dubbo源碼版本升級

發布時間:2023-05-14 03:26:57

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其他源碼分析,包括負載均衡,路由等等。

閱讀全文

與dubbo源碼版本升級相關的資料

熱點內容
非科班程序員自學 瀏覽:799
壓縮泡沫鞋底底材 瀏覽:217
程序員職場第一課2正確的溝通 瀏覽:677
遇到不合法app應該怎麼辦 瀏覽:90
匯編程序編譯後的文件 瀏覽:77
大智慧均線源碼 瀏覽:371
單片機排阻的作用 瀏覽:213
滴滴金融app被下架如何還款 瀏覽:210
jpg轉換成pdf免費軟體 瀏覽:741
范里安pdf 瀏覽:443
偽造pdf 瀏覽:75
能刪除android文件夾嗎 瀏覽:446
LINUX使用V2ray 瀏覽:797
找人幫忙注冊app推廣是什麼 瀏覽:820
獨立伺服器如何恢復初始化 瀏覽:11
優秀到不能被忽視pdf 瀏覽:316
導遊程序員家政 瀏覽:586
22乘28的快速演算法 瀏覽:338
軟通動力程序員節2021 瀏覽:846
安卓系統如何卸載安裝包 瀏覽:870