有贊電商雲應用框架設計

背景

有贊是 SaaS 公司,向商家提供了全方位的軟件服務,支撐商家進行採購、店鋪、商品、營銷、訂單、物流等等管理服務。

在這個軟件服務裏,能夠滿足大部分的商家,爲商家保駕護航。

但是很多大商家往往會有自己的特殊需求,如使用自己的優惠券、分期支付、定製的商品詳情頁、定製下單流程等等,爲了能夠滿足這樣的需求,讓商家有更多的可能性,我們提供了很強的擴展能力,這是電商雲的核心

概述

前面提到,爲了滿足商家的定製需求,提供商家更多可能性的能力,我們需要提供很強的擴展能力,擴展能力簡單來說就是用代碼開發擴展服務,然後通過界面配置來編排擴展服務。

用代碼開發擴展服務,我們需要有一個應用框架來支持擴展服務代碼的開發

應用框架

應用框架包含代碼部署、應用開發框架、應用運行框架

看到這裏應該會提出幾個問題,代碼部署在哪裏?擴展服務或者擴展點是什麼?

擴展點是什麼

擴展點是由有贊核心系統定義的一組擴展 API ,分爲業務擴展點、消息擴展點和前端擴展點。

  • 業務擴展點

從技術上可以理解爲 Java 的 SPI ,舉個例子,有贊核心系統價格中心提供了附加費用計算擴展點,對於 Java 程序來說這就是一個接口類,開發者自己寫一個實現類去實現該接口並在我們的控制檯上進行相應的配置生效後,那麼在進行價格計算時會調用開發者編寫的 附加費用計算擴展點實現類,形成的結果就是在標準價格計算之外再會加上開發者實現類返回的附加費用(比如額外的關稅、境外的運輸費等等)。

  • 消息擴展點

一樣的,消息擴展點從技術上可以理解爲 Java 的 SPI。從命名上可以看出它是用來傳遞消息的,也就是說這個擴展點不會影響業務主流程。比如,有消費者進入店鋪了,商家希望獲得這個消息可以做一些事情去儘可能的挽留消費者;比如有消費者下單成功了,通過對應的消息擴展點發送一個消息,商家可以自己去做些更有價值的事情。

  • 前端擴展點

業務擴展點和消息擴展點對應的都是後臺邏輯,我對某個頁面(如下單頁)不滿意或者想擴展裏面的組件或者想自己添加一個組件怎麼辦?前端擴展點給了開發者進行完全前端定製的能力,這裏舉兩個例子來說明:

  1. 拓展官方組件:在下單頁面上有下單按鈕,下單按鈕原有的邏輯是下單,但是下單按鈕的事件它是一個前端擴展點,這個時候開發者就可以實現這個擴展點,在下單的過程中做點好玩的事情,比如蹦出個好玩的動畫、請求後臺的額外接口做些事情等等;

  2. 添加自定義組件:如在下單頁添加個組件,添加一個商品推薦的組件。

代碼部署

如圖中所示,橫線(粗黑線)上方是電商雲部分的服務和操作區,下方是開發者的操作區。

這裏的代碼提交和正常的 Git 管理代碼方式不太一樣,所以這個圖也複雜一點:

  • 電商雲的 Git 倉庫不做代碼管理,這個倉庫的用途主要是用來初始化工程代碼和進行代碼部署。

  • 代碼從電商雲 Git 倉庫拉下來之後,開發者可以使用自己公司內部的 Git 去管理該項目,開發完成後再提交到電商雲的 Git 倉庫。

  • 在提交電商雲 Git 倉庫時只能提交 master 分支。

  • 提交到電商雲 Git 倉庫後,可以去電商雲控制檯進行代碼發佈,部署到服務器上。

所以在這個工程中會發現,電商雲 Git 不承擔團隊管理、分支管理等等功能,他的作用主要是用來發布。

代碼開發框架

整體的 App 是一個 youzan-boot 項目,整體框架分兩部分,內部核心模塊和外部定製模塊,兩個模塊單獨維護單獨開發,互相隔離。

內部核心模塊

這是一個可以單獨運行的模塊,在該模塊裏有很多子模塊,定義了接口、工具類、實現類等等,除此之外還有應用啓動器,這個模塊的開發由有贊內部的開發人員負責開發,實現內容外部不可見,那麼我們會在這個模塊裏做哪些事情呢?

  • 定義標準,編寫接口,供外部開發者依賴實現;

  • 編寫監控實現,來監控應用框架以及外部定製模塊;

  • 編寫dubbo服務註冊發現組件;

  • 編寫自動化數據源和orm框架支持;

  • 基礎配置信息;

  • 各類工具;

  • 其他。

這麼做的好處是什麼?

  • 開發者只關注如何使用,不需要關注實現;

  • 內部核心模塊有些部分會和我們核心域通信,隔離保證安全;

  • 我們內部開發人員更懂我們自己的環境,我們來進行一些通用配置,更加簡化開發者的學習成本;

  • 必要時候可以限制開發者的行爲;

  • 我們可以改變底層實現,如緩存模塊,從redis換成zankv等等;

  • 可以在未來定製一些符合有贊體系的組件如用戶session等,而用戶不需要去感知不需要去改代碼就能直接用。

外部定製模塊

這個模塊是通常意義上的 App ,也就是開發者可見並進行開發的 App,該模塊同樣有很多子模塊,可以理解爲正常的一個業務項目,只不過沒有啓動器沒有啓動框架,內部核心模塊啓動時會加載本模塊

通過上圖可以看到,這個外部定製模塊跟一般的 Maven 沒什麼區別:

電商雲 App 是一個 maven 項目,根 pom 的 parent 是 cloud-parent ,cloud-parent 管理了 spring-boot、spring、jdk、內部對外的 API 等框架和 API 的版本。所以在 App 開發過程中開發者依賴這些體系的jar包時不需要指定版本。

擴展點開發

擴展點開發是基於 Maven 框架去做的,有贊內部通過電商雲把擴展點接口發佈到有贊雲 Maven 倉庫,開發人員在本地配置有贊雲 Maven 倉庫後就可以拉取擴展點接口包,進行擴展點實現的開發。

代碼運行框架

上圖中可以看到,開發者將外部定製模塊開發完後通過電商雲控制檯進行發佈,此時會將 App 打成一個 Jar 包發到服務器上,發佈系統會啓動內部核心模塊,在啓動時內部核心模塊會啓動 Aladdin (有贊Jar包加載容器),Aladdin 會將外部定製模塊的 Jar 包加載進來,啓動裏面的業務邏輯,完成發佈。

爲什麼這麼做

其實前面講了很多 App 的總體框架,也講了一些這樣做的好處,這裏主要列舉三點來闡述一下:組件開放、組件升級和安全性

組件開放

在設計電商雲應用框架時,考慮到的一點就是如何更便捷更快速的把我們有讚的能力開放出去,如何做更新的迭代,如今天開放了數據庫組件、明天開放隊列服務?如何做到先準備後開放?如何讓開發者的接入成本最低?

有贊內部其實有很多很好的組件,有些可以開放在開發者,有些可能無法開放。同時開源也有很多組件,如何把這些能力集成到電商雲平臺上?

經過討論和思考,決定以接口聲明的模式(對於 Java 來說就是 Interface Jar包)對外提供服務。

這種方式對於開發者來說是非常便捷的:

結合電商雲控制檯來完成組件申請和配置初始化,開發者只需要在代碼裏寫 Bean 注入代碼就行,比如 Redis:

    
@Autowire    
private RedisTemplate redisTemplate;

    ................
        ...............

如上所示,開發者只需要寫這樣的代碼就可以使用,無需關注配置,也不需要做太多的依賴。

組件開放也很簡單:

  1. 編寫SDK;

  2. 按一定規範編寫電商雲Interface;

  3. 將SDK實現放在內部核心模塊,並使用電商雲組件配置加載邏輯初始化SDK;

  4. 提供簡單文檔供開發者使用;

在這個過程中,由於電商雲組件的使用方式是統一的,都通過一定規範的 Interface 開放,所以不需要做太多的 SDK 兼容去兼容開發者各種各樣的使用場景。

開發者也只需要一種學習姿勢,不會遇到不同的組件用不同的方式的困惑。除此之外也建立了電商雲組件開放的規範。

組件升級

有贊通過 Interface 的方式對外開放組件服務,那麼該組件的實現類就會落到內部核心模塊裏,也就是說我們的服務實現對於開發者來說是個黑盒,有贊來負責對這個實現的開發、監控、管理,在未來的發展過程中,由於一些原因可能需要對實現進行修改和升級,這是很正常的情況,通過這種模式,開發者無感,開發者只關注業務擴展、方案實現。

組件的實現方式也分兩種,一種是組件的實現源碼直接寫在內部核心模塊工程裏,另一種是單獨一個 Jar 包(內部核心模塊依賴這個 Jar 包)

對於第二種模式,有贊有對應的 Jar 包管理工具 Aladdin,在應用啓動時會匹配當前版本是否爲最新版本,不是的話就會升級。

同時在這個開發過程中,假如核心模塊和外部模塊都依賴了同一個 Jar 包,但是不同的版本怎麼辦? Aladdin 也會去識別出來,只加載一個版本。

安全性

組件安全

對於開發者可見的只有自己的業務代碼,組件對於開發者來說是個黑盒,開發者無法去對組件實現植入代碼,這樣保證了組件實現的安全可控運行。

如果不是這種模式,而是將組件作爲一個client開放給開發者,首先開發者能夠看到我們組件的邏輯,第二個能夠對組件實現做一些入侵(如修改字節碼)。

數據安全

如上圖所示,app-biz 即開發者部分的 App,和有贊進行實線連接的只有我們提供的接口層(Java 的 Interface),接口層的實現由 App 基礎框架來負責,來訪問配置、訪問數據庫、訪問緩存。

雖然每個 App 的數據庫、緩存等等相互之間是隔離的,但是他們可能都在一個機房或者一個網絡環境,如果不做這種封裝,讓 App 直接訪問這些資源,很難保證不會對其他 App 的數據庫、緩存等等造成影響或者攻擊。

目前這種模式天然的保證了每個 App 的私有資產的安全性。

展望

電商雲目前處於開荒後的創世階段,我們希望能夠讓開發者和商家有更多的可能性,那麼落到應用框架上,就需要有更多的靈活性和更多的能力來支持。

首先、完善組件,開放更多的組件;

第二、支持多語言,目前不管是組件還是應用框架都只支持 Java;

第三、支持本地運行,前面講到 App 無法自己運行,也就說明 App 無法在開發者本地運行,所以未來要支持本地運行;

第四、支持遠程調試;

第五、完善應用框架,如監控、熱加載等等;

其他……

創世階段需要更多人才,也希望各路神仙加入展現絕技。

轉載自公衆號“ 有贊coder”:https://mp.weixin.qq.com/s?__biz=MzAxOTY5MDMxNA==&mid=2455759241&idx=1&sn=ad486d10a00e0cf063e20a028e441a28&chksm=8c686facbb1fe6bab4a951c0a9adc44626d7e78b61ceb66d1c4f19838c992e4c98616fbea0a4&scene=21#wechat_redirect

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章