本文介紹在EDAS上如何將應用從HSF遷移到Dubbo3。參考本文檔,您可以在EDAS中將使用HSF構建的微服務系統逐步遷移至Dubbo3架構。遷移期間,您的服務無需整體停機。
背景信息
Dubbo3是流行的開源Java微服務框架,具備更豐富的服務治理能力和更好的社區支持。EDAS同時支持HSF和Dubbo3應用,并建議HSF用戶遷移至Dubbo3。
名詞解釋
HSF2應用:使用HSF注解或XML方式聲明服務提供者或服務消費者,并使用EDAS容器3.x部署的應用。
HSF3應用:使用HSF注解或XML方式聲明服務提供者或消費者,并使用EDAS容器5.x及以上版本部署的應用(EDAS容器4.x也是HSF3,但不支持雙注冊、雙發現)。
Dubbo3應用:使用Dubbo方式聲明服務提供者或消費者,只依賴于開源的Dubbo3。
Config Server:EDAS中HSF應用使用的注冊中心。
使用說明
HSF3(EDAS容器5.x)同時使用Config Server、Nacos作為服務注冊中心,支持服務同時被注冊到Config Server和Nacos。此外,HSF3提供HSF協議和Dubbo協議的服務端口。HSF2應用無需改造,直接使用HSF3容器部署后,應用便可實現同時與HSF2、Dubbo3應用的互相通訊,實現平滑遷移。
原理
如圖所示,整體遷移過程歷經三個階段。
原始狀態:全部為HSF2應用,服務注冊中心使用Config Server。
遷移狀態:應用處于混合部署階段,分為如下子過程:
HSF2應用+HSF3應用:使用HSF3部署部分應用,此時,HSF2、HSF3應用同時使用Config Server作為注冊中心,可互相發現,互相調用服務。具體操作,請參見步驟一:升級應用運行環境
全量HSF3應用:使用HSF3重新部署所有應用后,此時,系統中已無HSF2應用。
HSF3應用+Dubbo3應用:為HSF3應用開啟服務雙注冊、服務雙發現,同時使用Dubbo3方式聲明服務并部署應用實例。具體操作,請參見步驟二:創建應用。此時,HSF3、Dubbo3應用可互相發現、互相調用服務。
最終狀態:所有HSF應用遷移至Dubbo3。
遷移步驟
步驟一:升級應用運行環境
該步驟無需修改應用程序代碼。
對于在EDAS部署的ECS應用,通過運行時環境升降級功能,將Pandora版本升級到5.X。
對于在EDAS使用WAR、JAR包部署的K8s應用,可通過部署,將應用運行環境升級到EDAS-Container 5.X的版本。
對于在EDAS使用鏡像部署的K8s應用,可重新構建鏡像,將鏡像版本升級到5.0.0。在HSF應用的Dockerfile文件中增加如下配置,將HSF應用的運行環境EDAS-Container(Pandora)的版本升級為5.0.0。HSF應用的Dockerfile文件,請參見HSF應用的Dockerfile示例。
# 在WORKDIR/home/admin后增加升級腳本如下 # 設置EDAS-Container/Pandora應用容器版本 ENV UPGRADED_CONTAINER_VERSION 5.0.0 RUN /home/admin/bin/upgradecontainer.sh
修改應用啟動參數或修改應用配置,完成部署。具體操作,請參見HSF3應用配置服務雙注冊、雙發布
步驟二:創建應用
該步驟需要修改應用程序代碼,請參見Dubbo3應用配置樣例,完成配置,并構建出部署包。
使用新的部署包,在EDAS中相同微服務空間下創建Java應用。
ECS應用:
K8s應用:
配置參考
HSF3應用配置服務雙注冊、雙發布
配置要求和方法
使用EDAS容器5.x部署。
啟動雙發布、雙發現。
方法一:通過JVM參數
-Ddubbo.config.hsf.exportNativeDubbo=true
啟用雙發布,-Ddubbo.config.hsf.referNativeDubbo=true
啟用雙發現。方法二:在dubbo.properties文件中,指定
dubbo.config.hsf.exportNativeDubbo=true
啟用雙發布,指定dubbo.config.hsf.referNativeDubbo=true
啟用雙發現。
HSF3應用會默認發布、發現HSF服務。啟用上述配置后,應用將服務注冊到Nacos,并發布Dubbo服務,同時通過Nacos發現服務,調用Dubbo服務。啟用雙發布、雙發現后,HSF3應用可以使用Nacos作為注冊中心,使用Triple協議作為通訊協議,提供Dubbo服務。
雙發現的路由策略
按照Provider數量均衡調用。例如,當有1個HSF服務節點,3個Dubbo節點(一個HSF3節點啟用雙發布后,同時作為HSF服務節點和Dubbo服務節點)時,HSF服務節點被調用的概率為1/4,Dubbo服務節點的調用概率為3/4。
若任一種類型的節點不可用,則調用可用類型的節點。
若兩種類型的節點都不可用,則默認調用HSF類型節點。
Dubbo3應用配置樣例
應用必須聲明對dubbo-registry-nacos、dubbo-rpc-triple的依賴,建議使用3.0.5~3.0.12之間版本。
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-triple</artifactId>
<version>${dubbo.version}</version>
</dependency>
對于nacos-client版本依賴要求,僅能使用2.0.3或2.1.2及以上版本。2.0.4~2.1.1的版本存在不支持EDAS共享注冊中心或MSE注冊中心的問題。
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.2</version>
</dependency>
Dubbo聲明配置要求
HSF3僅支持服務級服務發布、發現。所以需要Dubbo側設置強制使用服務發現模式,設置方法如下:
方法一:聲明JVM參數:
-Ddubbo.application.service-discovery.migration=FORCE_INTERFACE
。方法二:在dubbo.properties中配置
dubbo.application.service-discovery.migration=FORCE_INTERFACE
。spring boot yaml配置格式示例如下:
重要特別注意,需要聲明使用Triple協議。
dubbo: application: name: .... protocol: # 必須聲明該配置,因為HSF3使用Triple協議發布服務 name: tri port: -1 # 聲明使用Nacos注冊、配置中心(EDAS上部署后,將被自動替換) registry: id: nacos-registry address: nacos://127.0.0.1:8848 config-center: address: nacos://127.0.0.1:8848 metadata-report: address: nacos://127.0.0.1:8848
xml配置格式示例如下:
<dubbo:metadata-report address="nacos://127.0.0.1:8848"/> <dubbo:registry address="nacos://127.0.0.1:8848"/> <dubbo:config-center address="nacos://127.0.0.1:8848"/> <dubbo:protocol id="tri" name="tri" />
參考DEMO
下載Demo。
下載包中各個工程模塊target目錄已經包含構建好的部署包,可直接使用部署。
如需構建,需要配置EDAS私有Maven倉庫。配置方法,請參見配置EDAS的私服地址和輕量級配置及注冊中心。
該Demo包含如下工程模塊:
如上圖所示,提供了4組Demo工程,其中第一組Demo采用HSF2容器、HSF3容器部署。
服務提供者 | 服務消費者 |
itemcenter-hsf: HSF方式聲明服務的服務提供者。 | detail-hsf:
|
itemcenter-hsf:
| detail-hsf:
|
itemcenter-hsf-pandora-boot:
| detail-hsf-pandora-boot:
|
itemcenter-dubbo:
| detail-dubbo:
|
itemcenter-dubbo-spring-boot:
| detail-dubbo-spring-boot:
|
可以根據自己的需要,選擇相應的Demo分組部署實驗。部署后,可進入任一Consumer執行如下命令。
curl 'http://127.0.0.1:8080/index.htm?name=abc'
返回信息如下:
# 第x次調用
Item Id: 1, Name: Protocol=HSF,LocalIP=172.17.48.116,Name=default,Date=2022-11-22 19:45:19:372,TraceId=ac11303616691175193702012d003f
# 第x+1次調用
Item Id: 1, Name: Protocol=TRI,LocalIP=172.17.48.116,Name=default,Date=2022-11-22 19:45:15:741,TraceId=ac11303616691175157392011d003f
返回說明:
Protocol:服務提供者使用的處理協議。其中,HSF表示HSF協議,TRI表示Triple協議。
LocalIP:服務提供者的IP地址。
FAQ
HSF3應用如何使用MSE Nacos實例作為Dubbo服務注冊中心
如果您繼續使用EDAS共享注冊中心,則無需執行以下操作。
在應用Maven源碼的resources目錄下,添加dubbo.properties文件,在dubbo.properties文件中,添加以下內容,并構建應用包。
dubbo.config.hsf.nativeDubbo.registry=nacos://mse-xxxx-nacos-ans.mse.aliyuncs.com:8848?namespace=msenamespace01
mse-xxxx-nacos-ans.mse.aliyuncs.com
:實例的地址。msenamespace01
:創建的命名空間ID。
使用程序配置注冊中心。
方法一:添加JVM啟動參數
-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false
。方法二:如下圖,部署應用時,在應用高級設置頁面,展開微服務治理,勾選使用程序配置的注冊中心(即不使用EDAS提供Nacos的注冊中心)。
部署應用后進入MSE引擎實例,查看服務列表是否包含您的服務。
如何查看應用是否正常啟動?
對于Spring-boot+K8s應用,一般查看K8s標準輸出。
對于Tomcat或EDAS容器部署的應用,一般查看tomcat目錄/logs/localhost.log.xxx 文件。
如何查看服務是否注冊到Nacos?
執行grep REGISTER-SERVICE ~/logs/nacos/naming.log | grep 服務名
命令。若存在,如圖所示:
查看服務是否通過Nacos正常發現?
執行命令find ~/nacos/naming -name "*服務名*"
,文件內容部分格式化后如下所示。
{
"name": "providers:com.alibaba.edas.carshop.itemcenter.ItemService:1.0.0:HSF",
"groupName": "DEFAULT_GROUP",
"clusters": "",
"cacheMillis": 10000,
"hosts": [
{
"instanceId": "172.17.XX.XX#50051#null#DEFAULT_GROUP@@providers:com.alibaba.edas.carshop.itemcenter.ItemService:1.0.0:HSF",
"ip": "172.17.XX.XX",
"port": 50051,
"weight": 1.0,
"healthy": true,
"enabled": true,
"ephemeral": true,
"clusterName": "DEFAULT",
"serviceName": "DEFAULT_GROUP@@providers:com.alibaba.edas.carshop.itemcenter.ItemService:1.0.0:HSF",
"metadata": {
"release": "3.0.12",
"methods": "getItemByName,getItemById,getItemByIdAndName",
"deprecated": "false",
"dubbo": "2.0.2",
"pid": "1",
com.alibaba.edas.carshop.itemcenter.ItemService
:服務名。1.0.0
:版本號。HSF
:分組名。hosts
:服務提供者。172.17.XX.XX
:服務提供者IP及服務端口。
服務名稱、版本號和分組名尤為關鍵,是服務的唯一標識。若其中一項與Provider注冊不一致,則Consumer無法找到服務。若不存在,執行cat ~/logs/nacos/naming.log | grep ItemService
命令,查看日志是否觸發訂閱。