主頁 > 企業開發 > 【資料中臺商業化】資料中臺微前端實踐

【資料中臺商業化】資料中臺微前端實踐

2023-04-22 07:46:58 企業開發

作者:京東科技 陳云飛

一,需求背景

1 業務背景

在以往的業務場景中,用戶進入五花八門的選單體系中,往往會產生迷茫情緒,難以理解平臺名稱及具體作用,導致資料開發與管理學習成本較高,降低作業效率,為此我們整合從資料接入,資料開發,資料管理的全鏈路流程,期望讓用戶體驗一站式資料開發與管理的便捷性;并提供不同業務場景,方便根據業務場景進行進一步資料開發與管理作業,為資料應用平臺打下夯實規范的資料基礎,方便用戶在資料平臺里,對于資料開發和資料應用進行便捷性的切換,因此我們設計目前的門戶基座,可以快速瀏覽各個平臺,同時串聯資料開發與管理的作業,減少用戶的試錯成本,提升作業效率,

2 標品需求

基座子-專案互動簡圖如圖1;

1,基座的業務頁面比較簡單,主要包含:頂部邊欄、左側邊欄、公共子選單、頂級平臺選單;

2,點擊左上角圖示,顯示頂級平臺選單,點擊平臺,在基座左側邊欄動態顯示平臺一級選單;

3,點擊基座左側邊欄,在公共子選單,動態顯示一級選單下邊的二級、三級選單;

4,點擊基座左側邊欄或者公共子選單,需要基座調度,在子專案區域正確加載子專案及子專案頁面;

圖 1

資料中臺新門戶基座要接入老資料平臺一、老資料平臺二等 多平臺的前端專案,并且原有前端子專案在門戶基座呈現任意子專案、任意子專案頁面 任意混搭的需求;新門戶要接入的專案關系詳情如圖2;

圖 2

3 資料中臺融合;

資料中臺融合指的是京東體系內,其他對外獨立交付的資料中臺,比如京東工業、京東城市等專案;資料中臺商業化的子專案不僅在新門戶容器內,也可以按需打包進其他資料中臺容器;下面簡稱 資料中臺融合;

二,微前端技術調研

原有資料中臺接入子應用的方式有多種:iframe 嵌套、@weus 微應用、鏈接跳轉等;

1 iframe 存在問題:

? url 不同步,瀏覽器重繪 iframe url 狀態丟失、后退前進按鈕無法使用,

? UI 不同步,DOM 結構不共享,想象一下螢屏右下角 1/4 的 iframe 里來一個帶遮罩層的彈框,同時我們要求這個彈框要瀏覽器居中顯示,還要瀏覽器 resize 時自動居中..

? 全域背景關系完全隔離,記憶體變數不共享,iframe 內外系統的通信、資料同步等需求,主應用的 cookie 要透傳到根域名都不同的子應用中實作免登效果,

? 慢,每次子應用進入都是一次瀏覽器背景關系重建、資源重新加載的程序,

2 weus 存在問題:

?weus 是京東內部研發已經不再維護了,如果有新的問題需要自己解決,對微前端有新需求也需要自己去實作;

?weus 沒有嚴格的 css 沙箱、js 沙箱,而在我們的需求中,沙箱機制是剛需,我們要接入的子專案在 window 上掛在哪些變數,無法通過規范做到強有力的制約(因為要接入的專案是已經寫完了)

?weus 在微前端功能實作,沒有qiankun 豐富健全,比如全域狀態管理、雖然 weus 實作了子應用的預加載,但是比較機械,是把所有注冊的子應用都快取,實際可能不需要,qiankun 就比較靈活可以根據需要手動快取等;

3 鏈接跳轉

鏈接跳轉,指的是點擊一個選單,跳轉到另一個頁面,這種方式不符合 “一站式 ”大資料平臺產品定位;

4 最終結論

通過幾種實作方式的對比,最終決定以 qiankun 微前端為基礎,結合我們的實際業務場景,通過權限選單樹 和 子專案關聯來實作基座對子專案的調度,具體方案請參照 三,基座技術方案詳細描述;

三,技術方案詳細描述;

1 名詞解釋

跨子專案跳轉

指的是子專案沒通過基座自行跳轉,基座此時需要根據 url 匹配正確的基座顯示;

觸發節點

點擊選單,選單對應的節點即為觸發節點,跨子專案跳轉(重繪頁面)沒有觸發節點,以跳轉后url 對應的頁面節點為觸發節點;

頁面節點

權限選單樹中,掛載了子專案頁面的節點

門戶節點

狹義指的是,當前頁面節點對應的公共子選單父級節點;廣義指的是通過頁面節點向父系節點查詢,最終確認公共子選單、基座邊欄的顯示,并通過頁面節點確定選單高亮等行為;

第一子系節點

指的是在由觸發節點查頁面節點時,只關注子節點中的第一個,如果當前節點的第一個節點不是頁面節點,繼續在孫子節點的第一個,直到節點型別為頁面節點為止;

調度引擎

指的是在基座中,對權限樹資料處理,接識訓座業務層調度,通過對權限樹遍歷、查詢操作對業務層輸出運算結果的一個抽象分層;

2 整體流程圖

如圖3 為基座技術方案的整體流程圖,下面詳細介紹

圖 3

3 技術方案-分步描述

第 1 步,配置權限選單樹,關聯子專案頁面

?如圖 3 所示,首先會在權限中心配置權限選單樹,權限選單樹有很多級,比如一級平臺,二級平臺,二級平臺一級選單,二級選單等,三級選單等;

?然后需要在選單樹上,掛在子專案的頁面,子專案頁面的一些權限按鈕等;

?最后權限中心對不同的用戶賦予權限選單樹的子集;

第 2 步,基座選單樹資料處理;

?基座從介面拿到權限選單樹關聯頁面資料后,觸發調度引擎初始化、并把基座的業務更新函式傳給調度引擎;

?基座獲取到選單樹以后,廣度優先演算法(如圖4)遍歷整個樹結構,并建立節點間父子關聯關系,根據節點是否掛載了子專案頁面定義前端節點型別 ;最終形成圖 5 的資料;

?在樹遍歷程序中,會統一在基座左側邊欄這一層級的節點,做一個門戶節點的標記;

圖4

?如圖 5 所示,前端調度關系中,把權限選單樹分成 兩種節點型別,掛載了子專案頁面的節點,定義為頁面節點,另一種沒掛載子專案頁面的節點,定義為分組節點;在基座調度中,不關心權限按鈕節點,在資料處理中,頁面節點就是整個權限選單樹的葉子節點;

圖 5

第 3 步,點擊基座邊欄或公共子選單

?點擊基座邊欄,觸發點擊選單流程,點擊的節點即為 “觸發節點”;

?由觸發節點,向第一子系節點查頁面節點,查頁面節點同時,會同時匹配門戶節點;

?沒有匹配到門戶節點,由觸發節點向父系節點匹配門戶節點;

第 4 步,重繪頁面或跨子專案跳轉

?這時沒有直接的觸發節點,只能通過 url 上的標識和選單樹上的頁面節點進行匹配

?匹配到頁面節點以后,由頁面節點向父系節點查門戶節點;

第 5 步,通過門戶節點輸出 “運算結果”

?這里的運算結果主要包含:基座左側邊欄、公共子選單選單樹串列、選單高亮、產品平臺名稱等一系列基座需要正確顯示所需要的資料;

?基座調度引擎,根據觸發調度的型別;如果是點擊選單觸發會執行 切換頁面操作,重繪和跨子專案跳轉則不需要觸發;

第 6 步,基座業務層執行運算結果;

?基座調度引擎,在接識訓座業務層調度指令后,通過對圖 5 權限樹的遍歷、查詢操作,最侄訓取運算結果;

? 呼叫基座業務層的更新函式,執行運算結果,到此基座調度流程結束;

四,基座-子專案結構通信圖

1 基座分為業務層、調度引擎兩部分;

?基座業務層主要包含:左側邊欄、頂部邊欄、頂級平臺選單等 UI顯示;

?基座調度層,以 qiankun 微前端為基礎,豐富擴展了權限樹資料處理、調度運算、雙向通信、子專案分組分步預加載策略等;

2 基座子專案通信和路由調度

?基座在執行主題切換時候,通過 qiankun 的 setGlobalState 通知子專案;子專案在系結專案空間等特定需求時,通過調度引擎封裝的 eventCenter 和基座反向通信;

?跨子專案跳轉,子專案會自行觸發 pushState,點擊基座選單跳轉流程,由調度引擎觸發 pushState 觸達

? qiankun 的 pushSate 劫持策略,觸發 popstate 子專案頁面因此觸發更新;

圖 6

3 路由劫持策略原理

基座調度引擎通過監聽 popstate 來獲取重繪、跨子專案跳轉的指令,從而觸發調度流程;以下為原理決議:

?以 Vue 為例,Vue 通過 主動觸發 pushState、replaceState 或者監聽 popstate 變化觸發頁面發生變化;

?但是跨子專案跳轉,執行 pushState 并沒有觸發 popState 基座調度引擎又怎么能監聽到呢?

?通過閱讀 qiankun 中依賴的庫 single-spa 的原始碼,navigation 模塊劫持了 pushstate 方法,只要觸發 pushstate,就會觸發 popstate 事件,關鍵代碼如下所示:

function patchedUpdateState(updateState, methodName) {
  return function () {
    const urlBefore = window.location.href;
    const result = updateState.apply(this, arguments);
    const urlAfter = window.location.href;


    if (!urlRerouteOnly || urlBefore !== urlAfter) {
      if (isStarted()) {
        window.dispatchEvent(
          createPopStateEvent(window.history.state, methodName)
        );
      } else {
        reroute([]);
      }
    }
    return result;
  };
}
window.history.pushState = patchedUpdateState(
   window.history.pushState,
   "pushState"
);

五,基于 qiankun 功能擴展:

1 沙箱隔離

js 沙箱利用 qiankun 沙箱機制;

css 沙箱,qiankun 的 css 沙箱不健全;我們接入的又是老專案,目前的策略是 :

?基座通過特殊命名空間 .susceptor、element-ui 通過 .spr 跟子專案隔離;

?子專案通過特殊命名空間,例如 .datacenter-xxx 跟基座隔離

?子專案對 .el- 不執行隔離,目的是為了統一控制布局、主題,同時做性能優化;

2 通信機制

基座和子專案,屬于典型的主從結構,采用單向資料流通信;為了滿足特殊場景子專案跟基座通信需求,在 qiankun 的通信基礎上,封裝了 eventCenter 僅用于 子專案 跟基座通信;

?基座 -> 子專案,通過qiankun 的 onGlobalStateChange 通信

?子專案 -> 基座,通過 subActions 封裝的 eventCenter 通信

3 分組、分步、動態預加載機制

目前標品基座已經加載了 30多個前端子專案,這么多前端子專案在首個子專案掛載后執行預加載,有可能會阻塞正常頁面訪問;

分組指的是,通過產品劃定的平臺,只有切換到當前平臺才會加載到當前平臺的子專案;

分步指的是,當前平臺子專案過多時,一次預加載少量子專案,分多次預加載;

動態指的是,基座在首個子專案掛載后,會檢測網速,只有網速良好時才會執行預加載;

4 跨子專案跳轉

跨子專案跳轉的背景在于 BDP 一站式開發與管理平臺,是一個大產品,資料規劃、資料集成 等是其中的模塊;模塊之間存在一些跳轉,對于前端就是跨子專案跳轉;

我們目前的跨子專案跳轉,由 subActions 封裝,抹平了標品基座 和 資料中臺融合容器的區別;

基座跳轉邏輯如下:

crossAppJump: ({ subApp='', path= '', paramsStr='', target= ''})=> {
      let jumpUrl = `/susceptor/${subApp}${path}`
      if(paramsStr){
        jumpUrl = `${jumpUrl}${paramsStr}`
      }
      if(target === '_blank'){
        window.open(`${location.origin}${jumpUrl}`)
      } else {
        window.history.pushState({ portalPushState: true }, null, jumpUrl);
      }
  },

資料中臺融合跳轉邏輯如下:

 crossAppJump: ({ subApp='', path= '', paramsStr='', target= ''})=> {
      let jumpUrl = `/${subApp}${path}`
      window.__datafuse_jssdk__.crossAppJumpFnGetter({
        path: jumpUrl,
        paramsStr,
        target
      })();
}

5,介面訪問及登錄鑒權;

由于微前端的技術形態,子專案在基座中加載實質是基座容器的 一段 html,所有介面均是以基座的 域名進行介面轉發;由因為資料中臺融合,所以子專案請求后端介面均是以 /api/datacenter/專案名 開頭;

通過以下 nginx 示例,我們把基座、子專案 的頁面訪問、介面訪問鏈路 說明白;

# proxy.conf 示例(已做脫敏處理,均不是專案升級名稱)
server {
    listen                80;
    server_name           unify.external.dadacenter;
    charset utf-8;
   location /sub-app{
        alias  /export/web/sub-app-web;
        try_files $uri $uri/ /index.html =404;
   }
   location /api/datacenter/subapp {
        proxy_pass   http://server-sup-app/;
   }
   location /susceptor{
      alias  /export/web/susceptor;     on;
      try_files $uri $uri/ /index.html =404;
   }
   location /api{
        proxy_pass  http://sever-api/;
  }
}


# server.conf 示例(已做脫敏處理,均不是實際專案)
upstream server-sup-app{
    server 111.112.113.114:10001;
}
upstream sever-api{
    server 111.112.113.114:1000;
}

鑒權,前端不需要開發,但是需要知道,后端是通過頂級域名種 cookie 鑒權的;例如:unify.external.bigdata 測驗環境是在 .external.bigdatao 域名下,這也是為什么本地開發需要配置 host:127.0.01 loca.external.dadacenter ;

六,寫在最后,不忘初心

本節提供兩個圖, 對上文介紹的微前端實踐,有進一步的能力提升,有感興趣的同學歡迎一起討論;

1,整體流程圖;

如圖 6 所示,配置流程:配置權限選單樹,然后配置子專案-子專案頁面兩級;最后把權限選單樹 和 子專案-子專案頁面關聯起來,形成如圖 7 的權限樹-子專案關聯資料模型;

基座兩個調度流程,跟上文類似,但是多了子專案維度,基座在加載子專案的時候,就可以把子專案 在權限樹的 權限按鈕資訊全部給到子專案;

圖 6

2 權限選單樹模型;

上文介紹的基座調度流程是簡化后的版本,專案節點只有 分組節點、頁面節點;但是從能力層缺失了 子專案維度;在設計之初,如圖 7 所示:專案節點包含了 分組節點、子專案節點、子專案頁面節點、頁面節點 4種節點型別;

圖 7

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/550806.html

標籤:Html/Css

上一篇:學系統集成專案管理工程師(中項)系列07_資訊(檔案)管理

下一篇:返回列表

標籤雲
其他(157818) Python(38089) JavaScript(25379) Java(17985) C(15215) 區塊鏈(8256) C#(7972) AI(7469) 爪哇(7425) MySQL(7135) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4555) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1959) Web開發(1951) python-3.x(1918) HtmlCss(1918) 弹簧靴(1913) C++(1910) xml(1889) PostgreSQL(1872) .NETCore(1854) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 【資料中臺商業化】資料中臺微前端實踐

    我們設計目前的門戶基座,可以快速瀏覽各個平臺,同時串聯資料開發與管理的作業,減少用戶的試錯成本,提升作業效率。 ......

    uj5u.com 2023-04-22 07:46:58 more
  • 學系統集成專案管理工程師(中項)系列07_資訊(檔案)管理

    1. 資訊系統相關資訊(檔案) 1.1. 是指某種資料媒體和其中所記錄的資料 1.2. 永久性 1.3. 由人或機器閱讀 1.4. 僅用于描述人工可讀的東西 2. 分類 2.1. 開發檔案 2.1.1. 可行性研究報告和專案任務書 2.1.2. 需求規格說明 2.1.3. 功能規格說明 2.1.4. ......

    uj5u.com 2023-04-22 07:46:00 more
  • vue全家桶進階之路47:Vue3 Axios攔截器封裝成request檔案

    可以將Axios攔截器封裝成一個單獨的request檔案,以便在整個應用程式中重復使用。 以下是一個示例,展示如何將Axios攔截器封裝成一個request檔案: 1、創建一個名為request.js的新檔案,并匯入Axios: import axios from 'axios'; 2、創建一個名為 ......

    uj5u.com 2023-04-21 09:25:19 more
  • 華為云 OpenTiny 跨端、跨框架企業級開源組件庫專案落地實踐直播

    OpenTiny 組件庫建設者、開源社區負責人 Kagol 與前端楊村長聯合直播,盛情邀請你一同共同揭秘:OpenTiny 的落地實踐之路。
    就在周五晚8點,前端村長直播間,等你來撩~ ......

    uj5u.com 2023-04-21 08:25:03 more
  • vue全家桶進階之路46:Vue3 Axios攔截器

    在Vue.js 3中,使用Axios與Vue.js 2.x中類似,但是需要進行一些修改和更新,下面是Vue.js 3中Axios的定義和使用方式: 首先,你需要安裝Axios和Vue.js 3.x,可以使用npm或yarn等包管理工具安裝: npm install axios vue@next 然后 ......

    uj5u.com 2023-04-21 08:23:47 more
  • 執行背景關系

    變數提升與函式提升 變數宣告提升 通過var定義(宣告)的變數--在定義陳述句之前就可以訪問到 值為undefined console.log(a); //undefined var a = 1; //執行順序 var a; console.log(a); a = 1; 函式宣告提升 通過functi ......

    uj5u.com 2023-04-21 08:23:41 more
  • JavaScript 簡寫語法

    JavaScript 簡寫語法 1、簡寫的閉包自執行函式(Immediately Invoked Function Expression (IIFE)) 使用括號將函式定義包裹起來,再在末尾加上另一對括號,即可創建一個自執行函式。例如: (() => { console.log("Hello, wo ......

    uj5u.com 2023-04-21 08:23:35 more
  • 探索FSM (有限狀態機)應用

    我們是袋鼠云數堆疊 UED 團隊,致力于打造優秀的一站式資料中臺產品。我們始終保持工匠精神,探索前端道路,為社區積累并傳播經驗價值。。 本文作者:木杪 有限狀態機(FSM) 是計算機科學中的一種數學模型,可用于表示和控制系統的行為。它由一組狀態以及定義在這些狀態上的轉換函陣列成。FSM 被廣泛用于計算 ......

    uj5u.com 2023-04-21 08:21:55 more
  • Vue3 watch 監聽物件陣列中物件的特定屬性

    Vue3 watch 監聽物件陣列中物件的特定屬性 在 Vue 3 中,可以使用 watch 函式來監聽物件陣列中物件的特定屬性。可以通過在回呼函式中遍歷陣列來檢查物件的特定屬性是否發生變化,并在變化發生時執行相應的操作。 一、監聽物件的特定屬性 例如,假設有一個名為 items 的物件陣列,其中每 ......

    uj5u.com 2023-04-21 08:21:43 more
  • Module not found: Error: Package path 找不到模塊

    [1] ERROR in ./src/node_modules/react-bootstrap/esm/AbstractModalHeader.js 3:0-63[1] Module not found: Error: Package path ./useEventCallback is not e ......

    uj5u.com 2023-04-21 08:21:39 more