1. 程式人生 > >Spring Cloud與Dubbo共存方案總結

Spring Cloud與Dubbo共存方案總結

一、背景

假設有一個遺留的Dubbo系統,現在想改用Spring Cloud。

由於遺留Dubbo系統比較龐大,短期之內無法完成技術棧的遷移。因此需要“分步走”,即:初期實現兩者共存,後期逐步絞殺Dubbo應用,最終實現技術棧的統一。

p.s. 這裡並沒有貶低Dubbo的意思,僅是按照該場景討論。

二、頭腦風暴

架構遷移、技術棧更換、專案重構時的第一步往往不是“改造”,而是“停止修改”。基於這個原則,個人不太傾向於去立即大幅重構Dubbo應用原先的程式碼。原因有二:首先是原則問題,更重要的是時間成本、技術風險很難得到控制。

而,假如新編寫的Spring Cloud應用去進行遷就,例如:

完全不動Dubbo遺留系統,使用RestTemplate或Feign編寫Dubbo(DubboX)的RESTful API客戶端代理 —> 有一定的實現複雜度、Dubbo介面改造成RESTful API後,消費方都需要再次修改(開始是代理,後來不用代理,因此有二次修改的問題)。

索性將Spring Cloud應用也整合Dubbo—>存在改造不完整、技術棧不統一、無法約束開發人員用哪種方式API、額外的複雜度的問題(越多的元件、越多的環節意味著越多的坑)。

考慮到一般來講,遺留系統的改造過程中一般都是新系統呼叫老系統,很少出現老系統大規模呼叫新系統的場景(至少我這邊目前是這樣^_^)。因此,筆者列出幾種僅需少量的程式碼編寫成本即可實現Spring Cloud與Dubbo短期/長期共存,並且侵入性較小,同時還允許我們改造遺留Dubbo系統的幾種方案,算是拋磚引玉。期待朋友們提出更優雅、成本更小的方案。

三、亮程式碼

Sample1:藉助Ribbon呼叫Dubbo應用。

優點:

架構不依賴Eureka或其他服務註冊元件,藉助Ribbon去呼叫Dubbo微服務暴露的RESTful API;

缺點:

如果Dubbo微服務較多時,均需手動配置,不適合新式的部署環境(例如Docker,因為每次部署IP/埠可能都不同)

Sample2:藉助Sidecar

使用Sidecar,Dubbo微服務必須實現健康檢查(對於Spring Boot程式即:新增spring-boot-starter-actuator依賴)。

優點:

這種方式下,Dubbo應用也可通過Sidecar呼叫Spring Cloud微服務的介面,Sidecar是連線Spring Cloud應用於Dubbo應用的橋樑。

可以通過Sidecar傳播Dubbo微服務的健康狀態到Eureka Server。

缺點:

在於每個Dubbo微服務節點必須額外部署一個Sidecar應用。

在Dubbo微服務呼叫Spring Cloud微服務時,增加了呼叫鏈的長度。(需使用Sidecar轉發)

Sample3:藉助Eureka實現整合

將Dubbo應用也註冊到Eureka上。

優點:

沒有多餘的元件(除了Dubbo的註冊中心ZK)

沒有什麼侷限

缺點:

對於非Spring Boot的應用,改造有一定的成本。

GOING FAR

本專案中幾個Demo中,都是手動編碼為Dubbo應用開放RESTful API的,實際遷移過程可以藉助cglib或者lombok之類的工具,實現從Dubbo介面道RESTful API的轉換。本倉庫主要還是為大家提供思路,不做具體討論。

程式碼下載地址

https://github.com/itmuch/spring-cloud-dubbo-together