javas設計模式精講html29中間件_第1頁
javas設計模式精講html29中間件_第2頁
javas設計模式精講html29中間件_第3頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、29 中間件新時間 2019-08-26 15 43 20沒有智慧的頭腦,就像沒有蠟燭的燈籠中間件 (M dd eware),又稱中介層,是提供系統(tǒng)軟件和應用軟件之間連接的軟件,以便于軟件各部件之間的溝通,特別是應用軟件對于系統(tǒng)軟件的集中的邏輯。中間件在企業(yè)架構中表示各種軟件套件,有助于抽象底層機制, 比如操作系統(tǒng) API、網(wǎng)絡通信、內存 ,開發(fā)者只需要關注應用中的業(yè)務模塊。從更廣義的角度來看,中間件也可以定義為 底層服務和應用的軟件層。后文我們主要使用 Node.js 里最近很熱門的框架 Koa2 里的中間件概念為例,并且自 實現(xiàn)一個中間件來加深理解。1. 什 中間件在 Express、Ko

2、a2 中,中間件代表一系列以管道形式被連接起來,以處理 HTTP 請求和響應的函數(shù)。換句話說, 中間件其實就是一個函數(shù),一個執(zhí)行特定邏輯的函數(shù)。前端中類似的概念還有 器、Vue 中的過濾器、中的路由守衛(wèi)等。工作原理就是進入具體業(yè)務之前,先對其進行預處理(在這一點 有點類似于裝飾器模式),或者在進行業(yè)務之后,對其進行后處理。示意圖如下:ervue-rout注意: 本文可能用到一些 ES6 的語法 et/const、箭頭函數(shù)、async/awa t 等,如果還沒接觸過可以點擊稍加學習 當接受到一個請求,對這個請求的處理過程可以看作是一個串聯(lián)的管道,比如對于每個請求,我們都想 一些相同的邏輯比如權限

3、驗證、數(shù)據(jù)過濾、日志統(tǒng)計、參數(shù)驗證、異常處理等功能。對于開發(fā)者而言,自然不希望對于每 個請求都特殊處理,因此引入中間件來簡化和 這些基礎設施與業(yè)務邏輯之間的細節(jié),讓開發(fā)者能夠關注在業(yè)務的開發(fā) ,以達到提升開發(fā)效率的目的。2. Koa 里的中間件2.1 Koa2 里的中間件使用Koa2 中的中間件形式為:app use(async function middleware(context next)/ 前處理await next() / 下 個中間件/ 后處理)其中第一個參數(shù) context 作為 下文封裝了 request 和 response 信息,我們可以通過它來和; next 是下一個中間

4、件,當一個中間件處理完畢,調用 next() 就可以執(zhí)行下一個中間件,下一個中間件處理完再使用 next() ,從而實現(xiàn)中間件的管道化,對消息的依次處理。一般中間件模式都約定有個 use 方法來 中間件,Koa2 也是如此。千言萬語不及一行代碼,這里寫一個簡單的中間件:const koa = require('koa') const app = new koa()app use(ctx next) => / 沒錯,這就是中間件console log('in 中間件1')app listen(10001)/ 輸出: in 中間件1Koa2 中的中間件有多種類

5、型:1. 應用級中間件;2. 路由級中間件;3. 錯誤處理中間件;4. 第 中間件;除了使用第 中間件比如 koa-router 、 koa-bodyparser 、 koa-stat c 、 koa- ogger 等提供一些通用的路由、序列化、反序列化、日志 等功能外,我們還可以編寫自 的應用級中間件,來完成業(yè)務相關的邏輯。通過引入各種功能各異的中間件,可以完成很多業(yè)務相關的功能:1. request 和 response 的 和處理;2. 生成 日志;3. 管理 sess on 、 cook e 等;onseresprequest4. 提供防護;2.2 洋蔥模型在使用多個中間件時, 一張著

6、名的洋蔥模型圖:正如 面的洋蔥圖所示,請求在進入業(yè)務邏輯時,會依次經(jīng)過一系列中間件,對數(shù)據(jù)進行有序處理,業(yè)務邏輯之后,又像棧的先入后出一樣,倒序經(jīng)過之前的中間件。洋蔥模型 當應用主要邏輯之后進行一些后處理,再將響應返回給用戶。使用如下:const Koa = require('koa') const app = new Koa()/ 中間件1app use(async (ctx next) => console log('in 中間件1') await next()console log('out 中間件1')/ 中間件2app use(a

7、sync (ctx next) => console log('in 中間件2') await next()console log('out 中間件2')/ responseapp use(async ctx => ctx body = 'Hello World' )app listen(10001)console log('app started at port http /localhost 10001')/ 輸出: in 中間件1/ 輸出: in 中間件2/ 輸出: out 中間件2/ 輸出: out 中間件1我

8、們可以引入 setT meout 來模擬異步請求的過程:const Koa = require('koa') const app = new Koa()/ 中間件1app use(async (ctx next) => console log('in 中間件1') await next()console log('out 中間件1')/ 中間件2app use(async (ctx next) => console log('in 中間件2')await new Promise(resolve reject) =>

9、; ctx zjj start2 = Date now()setTimeout() => resolve() 1000 + Math random() * 1000)await next()const duration = Date now() - ctx zjj start2 console log('out 中間件2 耗時:' + duration + 'ms')/ 中間件3app use(async (ctx next) => console log('in 中間件3')await new Promise(resolve rej

10、ect) => ctx zjj start3 = Date now()setTimeout() => resolve() 1000 + Math random() * 1000)await next()const duration = Date now() - ctx zjj start3 console log('out 中間件3 耗時:' + duration + 'ms')/ responseapp use(async ctx => console log(' 業(yè)務邏輯處理過程 ')app listen(10001)console log('app started at port http

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論