dubbo當前版本 2.7.3 期望升級到 3.0.11。
升級過程
maven依賴變更
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.0.11</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.11</version>
</dependency>
dubbo2 升級到dubbo3相容性配置
服務端
dubbo.application.register-mode 服務端提供者服務的註冊模式 可選值有
- instance 只註冊例項應用級
- all 介面級+應用級均註冊
- interface 只註冊介面級
升級到3.x之後在不修改配置的情況下預設是 all
配置 開啟介面級+應用級註冊
消費端/客戶端
服務有註冊模式 那麼消費端肯定也有服務訂閱發現模式設定
dubbo.application.service-discovery.migration 消費端訂閱模式可選值有
- APPLICATION_FIRST 雙訂閱 即介面模式/應用級模式 智慧決策 一般用於2.7.x與3.x 升級中 共存階段 也是3.x版本預設的訂閱模式
- FORCE_APPLICATION 僅應用級訂閱模式
- FORCE_INTERFACE 僅介面級訂閱模式
關於相容這一步如果專案升級的時候沒有使用者使用 不做相容性升級也沒問題,這裡主要是介紹保障逐步把2.7.x版本升級到3.x 而不是全部停機後重新部署。
紅色虛線框部分是3.x版本的部分升級後例項,左邊是原始的2.7.x版本例項。大概操作流程如下
1、逐步把部分Provider替換為3.x 服務端註冊模式為all
應用級+介面級,這樣2.7.x的消費端也能夠根據介面服務發現
2、逐步把部分Consumer替換為3.x 消費訂閱模式為APPLICATION_FIRST
雙訂閱模式
3、觀察3.x版本 服務端與消費端情況,如果異常就回滾到2.7.x。沒啥問題的話就可以逐步全部切換到3.x版本
4、到了這一步說明當前所有例項均為3.x版本,下次再更新的時候就把服務端註冊模式設定為instance
,消費端訂閱模式設定為 FORCE_APPLICATION
就完美切換到3.x版本 並且是應用級服務發現。
踩坑問題
3.0.11其實也沒有太多問題 好多問題都在之前版本就修復了,主要就是由於自身專案編碼問題導致進了一個坑
由於原來專案編碼不是很規範,在本地服務的介面中用到@Autowired
、本服務內部呼叫有的又用到了 @DubboReference
這種情況啟動的時候就會報錯,在2.7.x卻不報錯。這是因為3.x把Reference的bean代理也注入到spring容器中去了。本身的@DubboService Bean也會註冊到Spring容器中去。就會導致出現2個型別一樣的springBean,導致使用Autowired,由於屬性name不規範的時候就會報錯。
Field demoService in org.apache.dubbo.springboot.demo.provider.DemoService2 required a single bean, but 2 were found:
- demoServiceImpl: defined in file [D:\opensource\dubbo-samples\1-basic\dubbo-samples-spring-boot\dubbo-samples-spring-boot-provider\target\classes\org\apache\dubbo\springboot\demo\provider\DemoServiceImpl.class]
- demoServiceRemote: defined in null
3.x主要新特性
- 服務註冊與發現改版 由介面級別改為應用級
- 雲原生更好的支援 如native image,dubbo proxyless Mesh,
- 視覺化的dubbo-admin服務治理能力
- 全新通訊協議Triple 讓跨語言RPC邁了一大步,支援點對點呼叫、stream 流式呼叫。寫proto IDL 檔案可生成各類客戶端程式碼,完全相容
grpc
讓java與
go`成為後端深度合作伙伴
3.x小版本更新
3.0.x升級到3.1.x
變動不大就只是針對nacos的group進行了對齊。如果配置中填寫的nacos的地址帶了group引數的話 ,需要客戶端和服務端保持一致的group。
當然也可以強制去掉group分組隔離功能 dubbo.nacos-service-discovery.use-default-group=false
全域性屬性值忽略該功能
3.1.x升級到3.2.x
最大的變更是預設序列化的變了,dubbo協議預設序列化由hessian2變更為 fastjson2,原因就是fastjson2效能更高也能相容hessian2
也支援jdk17 和Native 。
triple協議支援自定義異常回傳。