天天看點

進擊的 Spring Cloud Alibaba —— 架構與服務

本文整理自作者于 2020 年雲原生微服務大會上的分享《進擊的 Spring Cloud Alibaba —— 架構與服務》,主要闡述了雲原生環境下,Spring Cloud Alibaba 如何幫助開發者實作微服務;以及在提供 SCA 開發架構基礎之上,如何配合更豐富的服務來幫助開發者在阿裡雲上實作微服務。

進擊的 Spring Cloud Alibaba —— 架構與服務
作者 | 陳曦(良名)  Spring Cloud Alibaba 項目成員,start.aliyun.com 負責人。

導讀:本文整理自作者于 2020 年雲原生微服務大會上的分享《進擊的 Spring Cloud Alibaba —— 架構與服務》,主要闡述了雲原生環境下,Spring Cloud Alibaba 如何幫助開發者實作微服務;以及在提供 SCA 開發架構基礎之上,如何配合更豐富的服務來幫助開發者在阿裡雲上實作微服務。

阿裡巴巴雲原生公衆号背景回複 818 即可擷取直播回看位址和大會 PPT 合集。

Spring Cloud Alibaba 微服務架構

1. Spring Based Framework 已經成為事實标準

根據 Jakarta 2019 年的調研報告,Spring Boot 擁有非常高的占比。熟悉 Java 語言的同學,應該對 Spring 架構都不會陌生。其倡導的依賴倒置、面向切面程式設計等特性已經形成了 Java 語言的事實标準,幾乎所有三方架構都會提供對 Spring 架構的支援。

進擊的 Spring Cloud Alibaba —— 架構與服務

根據 JetBrings 2019 年的調研報告,61% 的使用者會選擇 Spring Boot 來代替傳統的應用伺服器。

進擊的 Spring Cloud Alibaba —— 架構與服務

這裡有一個很有意思的點,為什麼要“代替應用伺服器”呢?回顧前面雲原生的特點,我們要彈性,要自包含,要獨立程序等等。如果此時部署應用還需需要啟動應用伺服器會将整個依賴層級複雜化。同時,雲原生的各種彈性與排程能力,都同傳統的應用伺服器存在重疊。直接使用 Spring Boot 作為應用啟動入口就成為更加“雲原生”的選擇。

回到微服務&雲原生這個場景的下,Spring 提供用來支援開發工作的架構就是 Spring Cloud。

2. Spring Cloud 以微服務為核心的分布式系統建構标準

同樣,還是先看下 Spring 是如何定義 Spring Cloud 這套架構的:

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.

這裡提到了兩個關重要特征:

  • 分布式系統中的常見模式
  • 任何分布式環境

“分布式系統中的常見模式”給了 Spring Cloud 一個清晰的定位,即“模式”。也就是說 Spring Cloud 是針對分布式系統開發所做的通用抽象,是标準模式的實作。這個定義非常抽象,看完之後并不能知道 Spring Cloud 具體包含什麼内容。再來看一下 Spring 官方給出的一個 High Light 的架構圖,就可以對這套模式有更清晰的認識:

進擊的 Spring Cloud Alibaba —— 架構與服務

可以看到這個圖中間就是各個 Microservice,也就是我們的這個微服務的實作,周邊周圍的話就是去圍繞這個微服務來去做各種輔助的資訊事情。例如分布式追蹤、服務注冊、配置服務等,都繞微服務運作時所依賴的必不可少的的支援性功能。我們可以得出這樣一個結論:Spring Cloud 是以微服務為核心的分布式系統的一個建構标準。

3. Spring Cloud Alibaba 的定位

既然說 Spring Cloud 是标準,那麼自然少不了針對标準的實作。這裡,為大家介紹下 Spring Cloud Alibaba 這套實作。先給出下面這張圖幫助大家了解 Spring Cloud Alibaba 的定位:

進擊的 Spring Cloud Alibaba —— 架構與服務

這裡給大家這麼一個公式,這個叫做:“3 加 2”。

3 指的就是圖中深色的部分,其實它就是 Spring Cloud 标準,一共有 3 層。中間顔色最深的部分就是及整個微服務最核心的内容,包括了“ RPC 調用”以及“服務注冊與發現”。第二層,也就是圍繞着核心的這一圈,是一些輔助微服務更好的工作功能,包括了負載均衡、路由、網關、斷路器,還有就是追蹤等等這些内容。再外層的話,主要是一些分布式雲環境裡通用能力。

“3 加 2”中的“2”,指的就是上圖中最外面這一圈。這一部分就是這個我們 Spring Cloud Alibaba 的一個定義,它其實包含兩個部分的内容:

右上部分是對于 Spring Cloud 标準的實作。例如,我們通過 Dubbo 實作了 RPC 調用功能,通過 Nacos 實作了“服務注冊與發現”、“分布式配置”,通過 Sentinel 實作了斷路器等等,這裡就不一一列舉了。

左下部分是我們 Spring Cloud Alibaba 對阿裡雲各種服務的內建。可能很多同學會有這樣的一個問題:為什麼要加上這一部分呢?此時回頭審視一下 Spring Cloud ,它僅僅是一個微服務的一個架構。但是在實際生産過程中,單獨使用微服務架構其實并不足以支撐我們去建構一個完整的系統。是以這部分是用阿裡幫助開發者完成微服務以外的雲産品內建的功能。

這裡可能會很多同學會有這麼一個擔心:是不是使用了 Spring Cloud Alibaba,就會被阿裡雲平台綁定呢?在此,我們明确的告訴大家,這是不會的。為什麼這麼說呢?如上面說的,“3 加 2”中的 2 是被分為兩個部分的。其中對 Spring Cloud 的實作是完全獨立的,開發者可以隻是用這部分實作運作在任何雲平台中。當然,另一部分,由于天然是對阿裡雲服務的內建,這部分是和平台相關的。這裡給開發者充分的自由,選擇隻是用其中的部分還是全部産品。當然,我們也非常歡迎開發者選擇使用阿裡雲的全套服務,我們也會盡量保證使用整套産品時的連貫性與開發的便利性。

4. Spring Cloud 各套實作對比

Spring Cloud 作為一套标準,它的實作肯定不止一套,那麼各套實作都有什麼差別呢?我們來一起看一下下面這張圖:

進擊的 Spring Cloud Alibaba —— 架構與服務

可以發現 Spring Cloud Alibaba 是所有的實作方案中功能最齊全的。尤其是在 Netflix 停止更新了以後,Spring Cloud Alibaba 依然在持續更新和疊代。

進擊的 Spring Cloud Alibaba —— 架構與服務

從 18 年 7 月份 Spring Cloud Alibaba 正式送出代碼開始,就得到了大家廣泛的關注。截止今天,Spring Cloud Alibaba 一共獲得了超過了 1.5 萬的 star 數,已經的領先于所有其他實作的總和。

根據今年 X-lab 開放實驗室剛剛釋出的《2020 年微服務領域開源數字化報告》,Spring Cloud Alibaba 已經成為最活躍的 Spring Cloud 實作。

進擊的 Spring Cloud Alibaba —— 架構與服務

資料來源《2020 年微服務領域開源數字化報告》,公衆号背景回複關鍵詞“微服務報告”擷取報告全文。

5. Spring Cloud Alibaba 生态

作為一個雲廠商,我們提供的服務是非常豐富的。可以看到除了圍繞着 Spring Cloud 的标準實作以外,還有包括的資料、資源、消息、緩存等各種類型的服務。在不同類型的服務下,也有很多具體的産品可供使用者選擇。

進擊的 Spring Cloud Alibaba —— 架構與服務

這裡羅列典型而非全部産品。更多的内容,可以參考阿裡雲官網

6. Spring Cloud Alibaba 使用者數

截止到今天,Spring Cloud Alibaba 獲得了數超過 1.5w 的 star 數。同時在 Github 上的項目依賴,就是對 Spring Cloud Alibaba 産生依賴關系的産品,也超過了 6000。最重要的,使用 Spring Cloud Alibaba 的公司超過 1000 家。當然不隻是外部的公司在使用,我們自己其實也在使用。那經過了雙十一的洗禮,其實整個這套架構它的這個穩定性可靠性都得到了印證。

進擊的 Spring Cloud Alibaba —— 架構與服務

從架構到服務

1. 提供開發者服務,更完整的 Java 開發體驗

作為一套架構,Spring Cloud Alibaba 為開發者提供了便捷的程式設計模型,但是從開發者完整的工作流程上看,是不是還缺點什麼?設想一下這樣一個場景:作為一個開發者,應該說都做過這樣的一個事情,就是從頭從零開始去建構一個工程,一直到功能開發這麼一個過程的一個過程:

進擊的 Spring Cloud Alibaba —— 架構與服務

從設計到功能開發,是一個比較長的一個周期的:先要做抽象設計,包括概要設計、架構設計等;然後是一些具象的設計,還有各種架構搭建與架構驗證等工作。

在抽象設計階段,我們要确定整體的架構模式,包括了微服務、Serverless、事件驅動等。以及在這些架構模式下各個應用的領域邊界劃分。

在具象設計階段,我們要确定諸如應用分層、分包規則的。這裡也有很多的标準可以參考:MVC 分層架構、DDD 領域驅動設計架構等等。在此之後,還有具體的業務模型與接口設計,這些暫不在本文的讨論範圍之内。

在實作階段,需要引入各種架構,并通過配置将這些架構與應用內建起來,完成工程骨架的建立。

最後,還需要将這套骨架運作起來以驗證其可行性。

所有上面的工作完成以後,才可以正式的開始業務邏輯實作工作。

在上面的流程裡,Spring Cloud Alibaba 能起到的作用是有限的。作為一套架構,為開發者帶來的是程式設計模型上的便利。為了能讓開發者更加輕松的完成這一系列流程,我們為大家帶來兩個重要的産品:“Java 工程腳手架”和 “Sandbox 雲沙箱”。

2. Java 工程腳手架:更适合亞太區 Java 開發者的腳手架

進擊的 Spring Cloud Alibaba —— 架構與服務

很多開發者應該跟我一樣,都有過這樣的經曆:建立新應用時,先找一個我們最熟悉的一個老應用,把它裡邊的業務代碼全部清理幹淨。然後相關的各種配置名稱全部改掉,最終做出一個空的一個應用模闆。再把這個應用模闆拿過來改個名子,就變成了一個新的應用。

當然可能有的同學會做的更多一些,例如長期維護這麼一個空白模闆在那裡。下次拿過出來之後再改改個名字,就是一個新的應用。

這樣做可能是一個相對保險的方案,但是缺點也非常明顯:

  • 版本老舊,新特性無法享受
  • 團隊知識無法沉澱
  • 重複勞動

我們通過提供 Java 工程腳手架來解決這個問題。下面就是 Java 工程腳手架的頁面:

進擊的 Spring Cloud Alibaba —— 架構與服務

在這裡,開發者設定項目的基本資訊,例如:開發語言、Java 版本、Spring Boot 版本等内容。

除了基本資訊以外,這個平台還提供多種架構模式可供選擇。在上圖中可以看到,第一個是分層架構,這個是一個很傳統的多層架架構模型,包括我們經常說的這種三層架構、五層架構。另一個架構選項是 COLA。COLA 其實是一個典型的一個 DDD 的架構,如果希望在自己團隊裡邊去實踐标準的六邊形 DDD 架構的話,也是可以去選擇他。未來我們可能會去做更多的例如說 MVC 架構,或者是事件驅動的架構模型,提供給大家。

最下邊是組價依賴部分,開發者可以在這裡選擇項目需要使用的元件。這裡的選擇非常豐富,到從資料庫到開發工具、消息、web 等等,一共 100+ 的組價可供大家選擇,可以說基本上覆寫了應用開發的所有方面。同時,這裡當然不會缺失 Spring Cloud Alibaba 提供的任何元件。

我們希望通過這個工具,盡量減少開發者在建立應用過程中各種查詢資料以及繁瑣的配置工作。隻需要在平台上做一些簡單的選擇,就可以将工程骨架生成完成。

在 Java 工程腳手架裡,除了直接在 WEB 平台配置和下載下傳工程,我們還提供了基于 IDE 的插件,進一步友善使用者的使用。

經常光顧 Spring 的同學,應該對這個界面應該非常熟悉,這和 Spring 官方提供的腳手架非常相似。那麼我們的工程腳手架和 Spring 官方的實作有什麼差別呢?是不是就是對官方功能的鏡像呢?我們看一下下面的對比:

進擊的 Spring Cloud Alibaba —— 架構與服務

差別主要在如下幾個方面:

  • 樣例代碼 & 典型配置:Spring 官方其實是沒有這些樣例代碼以及配置漏記的。在我們的實作裡,會添加這一部分,目前主要覆寫了 Spring Cloud Alibaba 的元件,後面會繼續覆寫更多的元件;
  • 阿裡雲元件支援:Spring 要保證平台中立的特性,各廠商的元件自然是不會支援的,我們提供 Spring Cloud Alibaba 的全部開源元件和阿裡雲平台服務元件,同時也會把這些部分獨立出來,避免同其他部分的元件揉在一起,影響使用者選擇;
  • 工具鍊:Spring 官方的實作裡,例如 IDEA 的插件是專業版裡才有,也就是說這是收費的,我們使用 Cloud Tookits 插件實作相關功能,并且完全免費,同時,我們的平台 100% 支援官方插件連結;
  • 網絡環境:Spring 官方服務部署在國外,國内通路不穩定;
  • 應用架構:這部分在官方實作裡是沒有的,也是我們未來會重點建設的部分,應用架構在實際生産過程中是不可或缺的。

這套本地化的腳手架也獲得了 Spring 官方布道師 Josh Long 的推薦。我們會盡量延續 Spring initiliazr 的産品體驗,功能上我們隻做增量,同時這個增量給使用者保留了充分的選擇的自由權益。就是說我們增加這個東西,你可以完全不要,此時整體上和官方提供的産品體驗是一模一樣的,這是我們整個産品的繼續發展會一直堅持的原則。

3. Sandbox 雲沙箱:免費、快速驗證雲産品

第二個服務産品,就是我們的 Sandbox 雲沙箱。我們來設想這樣一個場景:今天建立一個新的應用,在基礎骨架代碼開發完成以後,需要去運作它,以驗證它的可行性或者是發現其中有沒有坑,此時定需要一個運作環境。我如果自己去搭建完整的背景服務運作環境,要麼選擇從雲服務商購買,要麼自己本地搭建。這兩個選擇一個費錢、一個費力。

進擊的 Spring Cloud Alibaba —— 架構與服務

除了驗證新應用的架構,還有很多其他場景也會有類似的困難。例如,需要驗證一個雲服務産品的可行性,學習相關組價的使用等等。

那麼有沒有什麼更好的辦法呢?這就是 Sandbox 雲沙箱需要解決的問題。

進擊的 Spring Cloud Alibaba —— 架構與服務

這個産品有三個主要的特性:便捷、真實和免費。

  • 便捷:我們為使用者準備了相關代碼&開發環境&運作環境,隻需要點點滑鼠就可以完成整個項目的建立,并部署在我們提供的隔離環境中,中間過程甚至不需要鍵盤;
  • 真實:指的是整個産品非常貼近實際工作場景,從開發者角度看,整個項目研發流程,包括代碼 checkout / checkin,開發工具,編譯流程、部署流程等,使用的都是真實生産流程;從運作時角度看,所有的底層服務使用的都是阿裡雲提供的真實服務,沒有任何單獨定制的服務存在;
  • 免費:所有的服務不會像使用者收取費用,甚至所有計費行為的發生,都不會跟使用者的賬号發生關聯。

這套産品支援完整的分布式場景。很多其他的廠商也有類似的産品,但是都隻能提供基于單一容器或者主機的案例,這和實際環境中多應用的分布式環境是有差距的。而這個問題,在我們的沙箱産品裡是不用擔心的。開發者在應用部署後的項目有半小時的使用時間,同時流量&并發數等也會存在一定的限制。

下面來看一下産品的界面:

進擊的 Spring Cloud Alibaba —— 架構與服務

左邊是産品的手冊 & 說明部分。這裡會包含說目前項目的功能說明、應用架構,以及如何部署和通路這些應用的操作步驟等。一些項目中使用到的技術點以及這些相關知識,也都會在這裡呈現給使用者。這部分文檔的目的,就是友善使用者去學習和了解目前的案例。

右邊的部分是應用清單。在微服務場景下,一個完整的産品通常需要多個應用組成分布式的叢集協同工作。這裡就是用來陳列相關的應用清單,同時包含了針對這些應用的操作入口。

圖檔中的案例是一個任務管理器産品,功能相對簡單。但是麻雀雖小五髒俱全。這個産品包含兩個應用:

  • 一個服務端,的包含了這個任務管理器的所有業務邏輯,以及下層的持久化能力等;
  • 一個 WEB 用戶端,包含了所有前端頁面邏輯、與前端通信的控制器層。

這兩個應用通過一個注冊中心來實作服務的注冊&發現。最終實作一個完整的任務管理器産品。

點選“開發”按鈕,打開一個 WEB-IDE 來檢視和修改對應應用的代碼:

進擊的 Spring Cloud Alibaba —— 架構與服務

這個 WEB-IDE 和開發者日常使用的 IDE 是一樣的,都是左側代碼樹,右側代碼編輯器的标準布局。即使是不熟悉這個産品的使用者,也可以非常快的上手,甚至不需要學習過程。如果需要部署這個應用,隻需要在“運維”功能下,點選“部署”按鈕,此時隻需要等待部署完成即可。在部署過程會有很多的日志輸出,都可以通過“輸出”窗體浏覽:

進擊的 Spring Cloud Alibaba —— 架構與服務

部署完成以後,會向 WEB-IDE 傳回一個通路位址,開發者隻需要點選這和位址就可以通路這個應用。下圖是實際的通路效果。可以看到,兩個應用,一個是任務管理器的 web 操作頁面、一個是背景資料庫管理頁面:

進擊的 Spring Cloud Alibaba —— 架構與服務

通過上面的步驟,開發者可以将案例快速部署起來。先部署試用,然後去學習和修改代碼,最後再部署驗證。通過這樣的循環,可以讓開發者很快學習和了解案例的功能和相關技術點。

最後再看一下整個沙箱的系統架構流程以及一些關鍵點:

進擊的 Spring Cloud Alibaba —— 架構與服務

通過顔色,可以很清楚地看到,沙箱的資源被分為兩個部分。藍色的部分其實是使用者獨享的資源,包括了:私有代碼倉庫、部署流程、運作環境等。這一部分在每個使用者間互相隔離。尤其是在右下角可以看到,完整的運作環境被隔離在獨立的專有網絡中。如果是多個應用,這些應用都會連結再同一個網絡裡邊。橙色的部分是公共的資源,這裡隻有 2 個:案例代碼倉庫和沙箱背景服務。

第二組概念是:臨時資源和長期資源。

臨時資源,包括部署流程和運作流程在内。這些資源會在一段時間後會被銷毀,進而保證整個産品成本的可控,也避免部分使用者對這套産品的濫用。如果需要在資源釋放以後,繼續使用,隻需要重新部署這個應用即可。長期資源的就是會長期存續的資源。可以看到,使用者的私有代碼倉庫就是長期資源。也就是說,無論運作環境是否存續,使用者的代碼都會一直得到保留。這部分代碼,使用者可以随時下載下傳到自己本地,并在自己的環境中運作它們。

後續規劃

下面是今年,整個 Spring Cloud Alibaba 以及相關服務産品的整體規劃:

進擊的 Spring Cloud Alibaba —— 架構與服務

後續我們會基于 Sandbox 雲沙箱上線七天系列課程。通過這個基礎知識學習+實操來更好的掌握微服務的相關技術,尤其是對 Spring Cloud Alibaba 的使用。未來還會在沙箱中上線完整的電商商場的案例,包括具有高并發場景的秒殺案例。最後,對 Spring Cloud Alibaba 本身,也會繼續建設,內建不少于 20 種阿裡雲中常用的雲産品。進一步提升開發便利性。

如果你對這個産品有進一步了解的興趣,或者是有什麼更好的意見或者建議,歡迎加入釘釘群(釘釘搜尋:34930571),一起來交流、吐槽。

“阿裡巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的公衆号。”