日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
后端有微服務(wù),那前端呢?初探微前端的世界

?前言

最近筆者在工作上一直聽(tīng)到后端工程師們?cè)谡務(wù)?Microservices(微服務(wù)) 的架構(gòu)設(shè)計(jì),聽(tīng)到的當(dāng)下立馬去查詢(xún)才知道原來(lái) Microservices 這麼潮,身為前端工程師的我當(dāng)然也希望前端也可以有這麼新穎的架構(gòu),于是這篇文章就要來(lái)跟讀者介紹 Micro Frontends(微前端)。

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)瑞金,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18982081108

什麼是 Microservices?

在開(kāi)始進(jìn)入本篇文章主題之前要先跟讀者們介紹什麼是 Microservices。

Microservices 是一種軟件架構(gòu),專(zhuān)注開(kāi)發(fā)在每一個(gè)小型功能或者服務(wù)上,最后再利用模組化的方式組合出一個(gè)大型的應(yīng)用程式。

如果讀者是前端工程師的話(huà)可能會(huì)覺(jué)得上面的敘述很像是 ES6 module 的架構(gòu),開(kāi)發(fā)者只需要專(zhuān)注在每個(gè) module 上的開(kāi)發(fā),最后再利用 Bundler 打包這些 module 形成一個(gè)完整的頁(yè)面甚至是應(yīng)用程序,像下圖這樣。

不過(guò)后端跟前端完全不一樣,后端是藉由一個(gè)又一個(gè)的 request? 來(lái) real time 的執(zhí)行相關(guān)的代碼,所以在 Microservices 的架構(gòu)中,想要讓一個(gè)又一個(gè)的服務(wù)能互相溝通,這時(shí)候就是要仰賴(lài)各個(gè) API 了。

但這時(shí)候會(huì)有一個(gè)很大的問(wèn)題,假如這三個(gè) Service 對(duì)于前端來(lái)講有高度相依性,以上圖為例:一個(gè)完整的購(gòu)物網(wǎng)站必須要先讓使用者登入后才可以進(jìn)行購(gòu)買(mǎi)商品以及去購(gòu)物車(chē)結(jié)帳,這時(shí)候在 Client 端就必須要分別打三次 API 并且互相等待才可以完成這整個(gè)流程,甚至假如剛好不小心有一個(gè) Service 壞了需要重新啟動(dòng),這時(shí)候可能會(huì)先產(chǎn)生一個(gè)過(guò)渡期的 API 避免 Client 端打到有問(wèn)題的 Service,可是 Client 端也不可能每次都會(huì)去記住這個(gè)新產(chǎn)生的 API,所以這勢(shì)必會(huì)造成一個(gè)很大問(wèn)題。

這時(shí)候其實(shí)可以在這些 Services 上添加一個(gè) API Gateway,對(duì)于 Client 端來(lái)說(shuō)我只需要對(duì)到一個(gè) Gateway 就好,對(duì)于這個(gè) Gateway 來(lái)說(shuō)我一樣是去呼叫各個(gè) Service 并且把資源都處理完后再回傳給前端。

如果有讀者本身是 SRE 熟悉 Docker 或者 K8s 這種用來(lái)自動(dòng)部屬容器化應(yīng)用程式的平臺(tái),對(duì)于上面這張圖應(yīng)該更熟悉了!像 K8s 就有類(lèi)似 API Gateway 的 Ingress 而 Docker 則有 routing mesh。

不過(guò)光有 API Gateway 其實(shí)還沒(méi)辦法凸顯 Microservices 的特色,在 Microservices 的架構(gòu)中其實(shí)每個(gè) Service 都可以有自己的 DB,目的就是為了不要讓每個(gè) Service 之間會(huì)互相關(guān)聯(lián)。

但這樣做其實(shí)有幾個(gè)缺點(diǎn)

很難保證數(shù)據(jù)的一致性

以上圖為例,假如今天有一個(gè) member 被注銷(xiāo)帳號(hào),但這個(gè) member 在被注銷(xiāo)帳號(hào)之前在** shopping cart** 這個(gè) Service 中有待結(jié)帳商品,這時(shí)候就會(huì)出現(xiàn) member 數(shù)據(jù)不一致的問(wèn)題。

DB 數(shù)據(jù)遺失

當(dāng)某一個(gè) Service 壞了需要重啟,這時(shí)候 DB 的數(shù)據(jù)有可能就會(huì)遺失導(dǎo)致后續(xù)的數(shù)據(jù)出現(xiàn)錯(cuò)誤。

為了改善這些缺點(diǎn)這時(shí)候就可以將這些 Service 的 DB 設(shè)計(jì)成可棄性,換句話(huà)說(shuō)就是這些 DB 只是用來(lái)作為短期的數(shù)據(jù)存取而已,背后還有一個(gè)共用的大數(shù)據(jù)庫(kù)去更新這些數(shù)據(jù),通常都會(huì)利用 Redis 這種 cache DB 來(lái)進(jìn)行設(shè)計(jì)。

為什麼需要 Microservices?

Microservices 的好處就是可以專(zhuān)注開(kāi)發(fā)在每個(gè)小服務(wù)上,舉例來(lái)說(shuō)以一個(gè)購(gòu)票網(wǎng)站可能會(huì)在短時(shí)間內(nèi)涌入大量的流量,這時(shí)候 race condition 就顯得相當(dāng)重要,這時(shí)候就可以利用 Go 語(yǔ)言進(jìn)行開(kāi)發(fā),亦或者是要開(kāi)發(fā)一個(gè)以效能為主的服務(wù),這時(shí)候就可以用 Rust 進(jìn)行開(kāi)發(fā)。

上面也提到 Microservices 必須要仰賴(lài) API 之間的溝通,所以通常在企業(yè)等級(jí)的產(chǎn)品上都會(huì)有拆分模組販?zhǔn)鄣男枨?,假如這時(shí)候就是利用 Microservices 架構(gòu)進(jìn)行開(kāi)發(fā)的話(huà)就很好拆分每個(gè)服務(wù)了。

這些都是使用 Microservices 后所能帶來(lái)的好處,所以假如讀者今天需要開(kāi)發(fā)一個(gè)非常複查且龐大的平臺(tái),這時(shí)候不妨可以利用 Microservices 的架構(gòu)進(jìn)行開(kāi)發(fā)喔!

Monolithic Architecture(單體式架構(gòu))

講完了 Microservices 后相信讀者應(yīng)該對(duì)于這種架構(gòu)有了初步的認(rèn)識(shí),與 Microservices 不一樣的架構(gòu)就是 Monolithic Architecture(單體式架構(gòu))。

一般來(lái)說(shuō)我們正常開(kāi)發(fā)都是使用 Monolithic Architecture,在 Monolithic Architecture 的架構(gòu)中都會(huì)把平臺(tái)中所有內(nèi)容都包裝起來(lái),像下圖這樣:

這種架構(gòu)不是不好,但假如今天想要拆分或者擴(kuò)充平臺(tái)上的 Service 其實(shí)都會(huì)比較麻煩一些,而且也會(huì)怕?tīng)恳话l(fā)而動(dòng)全身,甚至所有的 Service 背后都會(huì)連到同一個(gè) DB,這樣極有可能會(huì)讓 DB connection 同時(shí)連線(xiàn)過(guò)高導(dǎo)致 request 一直發(fā)送失敗,所以這也是 Microservices 想要解決的其中一個(gè)痛點(diǎn)。

什麼是 Micro Frontends(微前端)?

Micro Frontends 可以想像成前端版的 Microservices,在后端的世界中強(qiáng)調(diào)一個(gè)又一個(gè) Service 而在前端的世界中則是強(qiáng)調(diào)一個(gè)又一個(gè)的 modules?,如何將網(wǎng)頁(yè)中每一個(gè) module 有效的拆分就是 Micro Frontends 要做的工作。

Micro Frontends 的實(shí)現(xiàn)方式

接下來(lái)要跟讀者介紹的是 Micro Frontends 的實(shí)現(xiàn)方式,其實(shí) Micro Frontends 有蠻多種實(shí)現(xiàn)方式的:

iframe

透過(guò) iframe? 的特性讓每個(gè)被載入的區(qū)塊頁(yè)面都可以獨(dú)立運(yùn)行,假如需要有數(shù)據(jù)上的溝通也可以利用 window.postMessage 來(lái)完成,但這樣做會(huì)有非常多的缺點(diǎn),像是有可能載入同樣的代碼、UI 難以控制、甚至可能會(huì)有潛在的安全風(fēng)險(xiǎn),所以筆者還是建議讀者不要用此方式來(lái)進(jìn)行 Micro Frontends 的實(shí)現(xiàn)方式。

Client side 利用 JavaScript 載入 module

這個(gè)方法簡(jiǎn)單又粗暴,就是利用 JavaScript create 出 script tag? 后,接著再用 script tag 去載入相關(guān)的 module,最后再將其內(nèi)容塞進(jìn)去對(duì)應(yīng)的 div? 內(nèi),但缺點(diǎn)就是無(wú)法使用 SSR,整體寫(xiě)法會(huì)像下圖這樣。

Web Components

Web Components 可以說(shuō)是最多人拿來(lái)討論的 Micro Frontends 的實(shí)現(xiàn)方式了,雖然我們?cè)诂F(xiàn)今的網(wǎng)頁(yè)架構(gòu)中可以自由地 import 大佬們寫(xiě)好的組件,但難免都會(huì)遇到以下幾個(gè)問(wèn)題:

  • 組相依性的問(wèn)題:需要安裝只有該組件才會(huì)使用的 library,這會(huì)造成整個(gè) node_modules 相當(dāng)龐大。
  • Scope 問(wèn)題:前端為了樣式上的變化通常都會(huì)有藉由許多的 className? 來(lái)進(jìn)行樣式上的改動(dòng),但有可能因?yàn)樵摻M件也有撰寫(xiě)一樣的 className 導(dǎo)致很多時(shí)候都需要各種 override,長(zhǎng)期下來(lái)也會(huì)是一種項(xiàng)目維護(hù)上的負(fù)擔(dān)。
  • 版本相容性問(wèn)題:只要框架進(jìn)行大改版,基本上就很容易出現(xiàn)組件無(wú)法兼容新版本的狀況,這時(shí)候只能組件作者升級(jí)版本之后才能再次使用,相信這個(gè)狀況也是許多開(kāi)發(fā)者都會(huì)面臨到的困境。

因此 Web Components 的出現(xiàn)就是希望可以解決上述的問(wèn)題,而 Web Components 一共由以下三種元素組成:

Custom elements

自訂一個(gè)語(yǔ)意化標(biāo)簽來(lái)引用 components,并且利用 JavaScript 來(lái)建立 custom elements、shadow DOM、HTML templates 三者之間的關(guān)聯(lián),這種自定義標(biāo)簽會(huì)像這樣: 。

Shadow DOM

Shadow DOM 簡(jiǎn)單來(lái)說(shuō)就是在現(xiàn)有的 DOM tree 中產(chǎn)生出一個(gè)完全獨(dú)立于其他元素的 sub DOM tree,藉由此方法就可以讓 sub DOM tree 自己獨(dú)立運(yùn)作并且不會(huì)干擾到其他 DOM tree 上的元素。

HTML templates

利用