dubbo2升級到dubbo3實踐

peachyy發表於2022-12-12

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.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主要新特性

  1. 服務註冊與發現改版 由介面級別改為應用級
  2. 雲原生更好的支援 如native image,dubbo proxyless Mesh,
  3. 視覺化的dubbo-admin服務治理能力
  4. 全新通訊協議Triple 讓跨語言RPC邁了一大步,支援點對點呼叫、stream 流式呼叫。寫proto IDL 檔案可生成各類客戶端程式碼,完全相容grpc 讓javago`成為後端深度合作伙伴

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協議支援自定義異常回傳。

相關文章