Spring Boot 單體應用一鍵升級成 Spring Cloud Alibaba

阿里云云原生發表於2023-05-16

作者:十眠

背景

隨著 Apache Dubbo、Nacos 以及 Spring Cloud 等服務框架的流行,越來越多的企業開始採用微服務架構來構建其應用程式。微服務架構使企業能夠將其應用程式拆分成多個小型服務,這些服務可以獨立部署和擴充套件。這種架構模式也使企業更容易實現敏捷開發和持續交付,從而提高了其業務效率和響應能力。

 title=

微服務四大件:註冊中心、服務提供者、服務消費者、服務治理

如今,隨著服務提供者、服務消費者、服務註冊中心以及服務治理等微服務幾大件的出現和成熟,使得我們使用微服務開發,不僅可以做到快速開發,更能夠追求微服務的高效和穩定。

 title=

單體 or 微服務?

從上圖我們可以看到,隨著業務規模的增大,選擇單體架構與微服務架構的選擇趨勢,他們之間存在一個交點。在交點之後,選擇微服務架構,業務規模越大越可以享受到微服務架構帶來的效率的提升。我們可以觀察到,這個交點在持續地向左移動。數字化程式的快速發展普遍讓企業的 IT 系統更復雜,開源以及雲端計算推進的技術標準化,正在大幅度地降低微服務架構的技術門檻,在雲上小公司也可以很好地玩轉微服務。隨著這個趨勢的到來,還在使用單體架構的企業也逐漸考慮向微服務轉型。我們發現在雲上大部分 Java 應用仍然是基於 SpringBoot 的,Spring Boot 應用由於其架構實現的簡單性,客戶端只需透過 http 和域名就能實現服務呼叫。因此,許多中小型公司仍然採用該方式進行應用開發。從技術角度上看,我們如何升級 SpringBoot 應用至微服務架構,享受到微服務治理帶來的技術紅利,我們需要增加 SpringCloud 的 maven 依賴?需要業務進行程式碼改造?本文可以回答你,不需要一行程式碼改動。

本方案可以透過 MSE 無侵入實現 Java 應用的註冊、發現與治理能力。

  1. 當前 MSE 提供的註冊中心產品能力主要集中在非持久化服務發現,即服務的狀態維護在 client,需要業務方依賴 SDK 主動註冊服務,並維持心跳;本方案提供了一種的持久化服務發現能力。
  2. 解決跨平臺服務發現問題,如跨 K8s 服務發現、非 K8s 服務和 K8s 服務互相發現等。
  3. 無侵入實現基於 Spring Boot 應用的服務治理能力,如全鏈路灰度、限流降級、安全可信等。

方案實踐與探索

為了驗證該場景,我們提供了一個稍微比較複雜的Demo,透過該 Demo 來分別演示如何透過 MSE 無侵入實現 Spring Boot 應用的服務註冊與服務治理。Demo 是根據 K8s Service 進行服務發現並且透過簡單的 HttpClient 進行請求呼叫,詳細請求如下:

➜  ~ curl http://47.97.117.48/A/spring_boot                                   
A[10.0.3.238] -> B[10.0.3.227] -> C[10.0.3.230]%

架構如下所示:

 title=

介紹完 Demo 之後,我們來逐步演示如何透過服務治理進行服務註冊。

透過服務治理完成服務註冊

  1. 進入到對應的 MSE Nacos 例項頁面,選擇建立服務

 title=

  1. 我們填寫好服務名、分組名之後,可以選擇一個服務治理的應用進行註冊
  2. 開啟了健康檢查能力後,我們還可以選擇健康檢查的協議

 title=

  1. 點選確定後,我們就實現了透過服務治理方式註冊應用與例項至 MSE Nacos 中

 title=

  1. 根據下圖配置,我們分別將 A 應用註冊成 sc-A、B 應用註冊成 sc-b、C 應用註冊成 sc-c

 title=

  1. 同時我們修改 Zuul 應用的 Nacos 地址配置,使其透過 SDK 方式註冊至 MSE Nacos 中
  2. 我們透過服務治理方式註冊的服務,我們還可以透過服務治理方式將對應的節點從 MSE Nacos 中下線

 title=

 title=

  1. 點選 MSE 服務治理中節點詳情頁面的服務下線,在不用重啟應用 pod 的條件下,實現服務從註冊中心中下線

 title=

到目前為止,我們完成了透過服務治理實現服務註冊。

透過服務治理完成服務訂閱

  1. 我們在需要訂閱 Nacos 服務的應用中增加如下 Env

 title=

  1. 如何訂閱對應的服務?

我們 Http 請求域名直接呼叫對應的服務即可,比如:

restTemplate.getForObject("http://sc-b:20002/spring_boot", String.class);

其中 sc-b 為服務名,預設的分組名可以透過 mse_nacos_group 指定,如果需要指定分組名可以呼叫 http://sc-b:20002/spring_boot?mse_nacos_group=xxx 即可。

  1. 驗證

a.透過 MSE Nacos 控制檯可以驗證,明確訂閱關係

 title=

b.透過端到端請求驗證

➜  ~ curl http://47.97.117.48/A/spring_bootA[10.0.3.238] -> B[10.0.3.229] -> C[10.0.3.241]%

無侵入實現基於 SpringBoot 應用的全鏈路灰度

 title=

到目前為止,我們預設就具備了符合如上場景的全鏈路灰度能力。

➜  ~ curl http://47.97.117.48/A/spring_boot -H "x-mse-tag: gray"              
Agray[10.0.3.240] -> B[10.0.3.229] -> Cgray[10.0.3.241]%

總結

使用 Spring Boot 應用一樣可以快速享受到全鏈路灰度能力帶來的釋出體驗。我們透過MSE 服務治理能力與Nacos引擎的整合,可以進一步簡化與降低研發在雲上需要關注的部分,應用的客戶端可以再輕量化,進一步提升研發效率。

 title=

點選此處進入微服務引擎 MSE 官網檢視

相關文章