有贊電商云應用框架設計

背景

有贊是 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==\u0026amp;mid=2455759241\u0026amp;idx=1\u0026amp;sn=ad486d10a00e0cf063e20a028e441a28\u0026amp;chksm=8c686facbb1fe6bab4a951c0a9adc44626d7e78b61ceb66d1c4f19838c992e4c98616fbea0a4\u0026amp;scene=21#wechat_redirect

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536992.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vivado 如何創建工程模式_基于Vivado的FPGA高性能開發研修班2019年8月30日上海舉行...

一、課程介紹:從7系列FPGA開始,Xilinx提出了Vivado Design Suite設計軟件,提供全新構建的SoC 增強型、以 IP 和系統為中心的下一代開發環境,以解決系統級集成和實現的生產力瓶頸。同時,Xilinx專門針對Vivado推出了Ultr…

程序員的自我修養——遠離“外包思維”

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 在我們做開發的日子里,不免會進行跳槽,跳來跳去公司無非就分成兩大類——互聯網公司、外包公司。當然我們本次討論的并…

英特爾為 Kubernetes 推出分布式深度學習平臺:Nauta

2019獨角獸企業重金招聘Python工程師標準>>> 隨著人工智能的發展,深度學習的價值不斷增長,但實現它可能是一個復雜耗時的過程。英特爾(Intel)正尋求通過其在 Kubernetes 進行分布式深度學習的新開源平臺來改變這一狀況,該深度學習…

pytorch梯度下降函數_Pytorch中常用的四種優化器SGD、Momentum、RMSProp、Adam

來源:AINLPer微信公眾號編輯: ShuYini校稿: ShuYini時間: 2019-8-16 引言很多人在使用pytorch的時候都會遇到優化器選擇的問題,今天就給大家介紹對比一下pytorch中常用的四種優化器。SGD、Momentum、RMSProp、Adam。隨機梯度下降法(SGD&#…

2019/02/11-分布式數據庫概述

分布式數據庫類型(1)同構同質型:各場地都是同一種類型的數據庫,如都是關系型數據庫,且都是同一型號的數據庫管理系統(2)同構異質型:各場地是同一種類型的數據庫,但是數據…

python計算無窮級數求和常用公式_傅里葉變換(二) 從傅里葉級數到傅里葉變換...

在上一部分當中,得到了利用三角函數表示周期函數的方法,但是對于非周期函數就...涼了。所以有什么辦法嗎?沒辦法(劃掉)。這時候我們就需要拿出來我們的黑科技——傅里葉變換。一、傅里葉級數的推廣當然這東西肯定不是憑…

中鳴投籃機器人怎么組裝_1000余人參加洛陽市青少年機器人競賽

機器人智能識別地面上的黑色線條,并沿著線條來到指定位置,放下“快遞包裹”;無人機在空中飛舞,時而鉆過圓環,時而來個空翻,猶如跳芭蕾般在空中劃過一道優美曲線;橘紅色乒乓球從筒道中送出&#…

Exchange隊列優先級介紹和配置

一、場景 在日常辦公環境中所有郵件都會存在重要與非重要的情況,并且不同的郵箱的使用人的級別也不一樣,不一樣的職位級別要求不一樣的運維等級,以及發送郵件要求的速度也不一樣。這就導致了郵件需要按照重要性進行分類,重要的郵件…

Mybatis源碼閱讀(一):Mybatis初始化1.3 —— 解析sql片段和sql節點

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

IBM研究院計畫5年改變人類生活創新預測

IBM研究院近日發布未來5年將會改變人類生活方式的5項創新預測(IBM 5 in 5),包含透過數字分身(Digital Twin)農業將用更少的資源供給不斷增長的人口、區塊鏈能防范更多的食物浪費、用微生物基因組群保護人類受到有害細菌…

添加請求頭 retrofit_RxJava 與 Retrofit 結合的最佳實踐

前言RxJava和Retrofit也火了一段時間了,不過最近一直在學習ReactNative和Node相關的姿勢,一直沒有時間研究這些新東西,最近有個項目準備寫,打算先用Android寫一個Demo出來,卻發現Android的世界發生了天翻地覆的變化&am…

Mybatis源碼閱讀(二):動態節點解析2.1 —— SqlSource和SqlNode

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

k8s邊緣節點_邊緣計算,如何啃下集群管理這塊硬骨頭?

導讀邊緣計算平臺,旨在將邊緣端靠近數據源的計算單元納入到中心云,實現集中管理,將云服務部署其上,及時響應終端請求。然而,成千上萬的邊緣節點散布于各地,例如銀行網點、車載節點等,節點數量甚…

Mybatis源碼閱讀(二):動態節點解析2.2 —— SqlSourceBuilder與三種SqlSource

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

搞懂toString()與valueOf()的區別

一、toString() 作用:toString()方法返回一個表示改對象的字符串,如果是對象會返回,toString() 返回 “[object type]”,其中type是對象類型。 二、valueOf( ) 作用:valueOf房啊發返…

oracle入庫的速度能到多少_倒車入庫別練復雜了,其實就這兩點

教練總會讓學員反復練倒車入庫,但不少學員都會有這樣的疑惑:為什么每一次倒庫結果都不一樣,倒車入庫的練習重點是什么?倒車入庫是科二的重點及難點,但只要掌握以下兩個關鍵,順利通過真不難:01方…

Mybatis源碼閱讀(三):結果集映射3.1 —— ResultSetBuilder與簡單映射

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

kdj買賣指標公式源碼_通達信指標公式源碼MACD背離KDJ背離指標

N1:5;N2:10;N3:21;N4:60;牛熊:EMA(CLOSE,N4),COLORGREEN,LINETHICK3;DIFF:EMA(CLOSE,12) - EMA(CLOSE,26);DEA:EMA(DIFF,8);A1:BARSLAST(REF(CROSS(DIFF,DEA),1)); B1:REF(C,A11)>C AND REF(DIFF,A11)DRAWTEXT(IF(B1>0,1,0),L-0.1,MACD底背),COLORGREEN;RSV:(CLOSE-LLV(L…

Mybatis源碼閱讀(三):結果集映射3.2 —— 嵌套映射

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

18.requests

多多的的轉載于:https://www.cnblogs.com/yangyangchunchun/p/10368337.html