使用Egg.js作一個簡易的api網關

網關提供了什麼?

  1. 統一登陸
  2. 反向代理
  3. web服務器
  4. 接口攔截

以上是我根據項目需求已經實現了的功能,後續還能夠擴展一些其餘功能: 灰色發佈等。webpack

背景

開發環境時防止跨域會在webpack中添加proxyTable配置,這個配置只在開發環境生效。等到了生產環境會單獨啓一個Express服務提供web靜態資源和proxyTable。git

也就是說,每一個應用都會有一個Express服務,當應用多了之後不利於管理,部署麻煩。github

至於爲何不用Nginx,別問我,咱也不知道- . -web

由於生產環境都是經理來部署的,而後他就嫌這個太麻煩,因而就提出要作一個網關。c#

我是如何實現的

egg服務的中間件跨域

cors Middleware

egg-cors插件內置中間件,該中間件用於支持處理跨域請求一個請求解析的過程服務器

static Middleware

egg-static插件內置中間件,該中間件用於對外提供靜態資源cookie

multiApplicationStatic Middleware

egg-multi-application-static針對多應用映射不一樣的靜態資源路徑。使用koa-static插件實現,並將封裝爲插件app

  • prefix 域名
  • dir 靜態入口路徑

源碼解析

  1. 遍歷配置項cors

  2. 取出來源域名與配置項的prefix對比

    知足:則取出配置項的dir生成一個提供靜態資源服務的中間件並返回。

    不知足:返回next()

  3. 利用compose工具函數造成洋蔥圈式的調用並返回

bodyParser Middleware

會解析請求體中的參數並添加到request對象中,當通過該插件解析後的請求再作proxy時可能會丟失post參數,因此這裏要過濾一下:

若是訪問路徑是網關本身路由的話則解析,不然跳過

須要注意該中間件的順序,當post請求被該中間件處理後,再作proxy可能會丟失參數

securities Middleware

egg-security預防與處理XSS(跨站腳本攻擊)。

permissions Middleware

驗證token及刷新token。

源碼解析

  • 有token
    1. 驗證token是否有效,無效則返回401
    2. 請求路徑爲/gateway/login/時直接跳回refererS地址或者提示已登陸,refererS不存在
    3. 更新cookie.refererS有效時間
    4. 更新cookie.token有效時間
  • 無token
    1. 來源域是否已註冊,未註冊則返回401Application not register!
    2. 請求路徑爲/gateway/login時則設置cookie.refererS
    3. 請求路徑是否須要登陸,須要則返回401Request path not authorized!
  • 上面流程無return時則return next()函數

proxy Middleware

針對config.proxy中配置的域名及路徑進行反向代理。

先判斷請求來源的域名是否在config.proxy中,若條件知足則取出該域名下的配置,配合http-proxy-middlewarekoa-connect插件進行代理與響應。

一個請求解析的過程

  1. 進入multiApplicantionStatic中間件,判斷是否爲靜態資源
  2. 進入 permissions中間件, 驗證token是否合法
  3. 進入proxy中間件, 根據config的配置進行轉發請求
  4. 交由egg-router處理

PS

大佬請輕噴, 直接從筆記裏copy的,可能就我本身能看懂 - -。

相關文章
相關標籤/搜索