Express APP
黑山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,黑山網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為黑山上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的黑山做網(wǎng)站的公司定做!
作為一個(gè)Node.js開發(fā)者,相信大家都可能會(huì)使用Express框架,無論是構(gòu)建后端服務(wù),或是搭建一個(gè)前端的開發(fā)態(tài)服務(wù)器,Express都是一個(gè)很流行的選擇。構(gòu)建Express是極為容易的,添加一些路由規(guī)則和對(duì)應(yīng)的處理函數(shù),再選擇一些中間件,一個(gè)應(yīng)用就誕生了。
一個(gè)使用傳統(tǒng)托管方法的簡單 Express.js App —— 響應(yīng)單次請(qǐng)求的過程。
下列代碼展示了一個(gè)最簡單的 Express App:
'use strict'
const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('Hello world!'))
module.exports = app
這就完成了一個(gè) Express App。若使用瀏覽器訪問http://localhost:3000,你便可以在打開的網(wǎng)頁中看到“Hello world!” 信息。
應(yīng)用部署
麻煩的問題來了:如何才能將你構(gòu)建的 Express App 展示給你的朋友或者家人?如何才能讓每個(gè)人都能訪問到它?
應(yīng)用部署是一個(gè)耗時(shí)且痛苦的過程,但現(xiàn)在我們就假定你已經(jīng)很快、很好地完成了部署的工作。你的應(yīng)用已經(jīng)能被所有人訪問了,并且之后也運(yùn)轉(zhuǎn)良好。就這樣直到一天,突然有一大批用戶涌入開始使用你的應(yīng)用。你的服務(wù)器開始變得疲憊不堪,不過仍然還能工作。
一個(gè)使用傳統(tǒng)托管方法的簡單 Express.js App —— 處于較大負(fù)載下。
就這樣持續(xù)了一段時(shí)間后,它終于宕機(jī)了。
一個(gè)使用傳統(tǒng)托管方法的簡單 Express.js App —— 因?yàn)檫^多用戶訪問導(dǎo)致應(yīng)用掛掉
一大批用戶因?yàn)閼?yīng)用無法訪問而變得不開心(無論他們是否為此應(yīng)用付費(fèi))。你對(duì)此感到絕望,并開始在 Google 上尋求解決方法。如果在云上部署可以改善現(xiàn)狀嗎?
在云上部署應(yīng)該就可以解決應(yīng)用規(guī)模伸縮的問題了,對(duì)吧?
此時(shí)你遇到了一個(gè)惱人的朋友,她又在給你談?wù)?Serverless(無服務(wù)器)技術(shù)的種種。
Try serverless
讓你的 Express App Serverless 化
在過去的文章《5分鐘serverless實(shí)踐|構(gòu)建無服務(wù)器圖圖片鑒黃Web應(yīng)用》中,你已經(jīng)知道了 Serverless API 是由 API Gateway 和 FunctionGraph 組成的?,F(xiàn)在需要考慮的是如何讓你的 Express App Serveless 化。就像 Matt Damon 出演的電影《縮小人生》中描繪的橋段,Serverless 在未來也具有無限的潛力和可能性。
如何才能讓你的 Express App 無縫接入 FunctionGraph
讓我們向它請(qǐng)教一番!在集成到FunctionGraph之前,你的代碼需要稍微調(diào)整一下。你需要 export 你的 app,而不是調(diào)用 app.listen 去啟動(dòng)它。你的 app.js 內(nèi)容應(yīng)該類似下列代碼:
'use strict'
const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('Hello world!'))
module.exports = app
這樣修改后你可能無法在本地啟動(dòng) Express 服務(wù)器了,不過你可以通過額外添加 app.local.js 文件進(jìn)行解決:
'use strict'
const app = require('./app')
const port = process.env.PORT || 3000
app.listen(port, () =>
console.log(`Server is listening on port ${port}.`)
)
之后像啟動(dòng)本地服務(wù)器執(zhí)行下面的命令就可以了:
node app.local.js
為了讓應(yīng)用的API能更好地使用API網(wǎng)關(guān)進(jìn)行管理,你還需要確保你的所有API擁有一個(gè)共同的root_path?,F(xiàn)在,進(jìn)入FunctionGraph頁面創(chuàng)建一個(gè)函數(shù),函數(shù)名為api的root_path,將本地Express工程打包上傳,作為函數(shù)的代碼。然后再為函數(shù)創(chuàng)建一個(gè)入口文件,可以點(diǎn)擊在線編輯器上File -> New File Template -> Node.js Express Server快速創(chuàng)建,入口文件代碼如下:
const fgsExpress= require('fgs-express');
const app = require('./app'); // Your Express app entry
const server = fgsExpress.createServer(app);
exports.handler = (event, context, callback) => {
fgsExpress.proxy(server, event, context, callback);
}
fgs-express三方件會(huì)包裝你的app,轉(zhuǎn)發(fā)apig和app之間的請(qǐng)求。至此,你的Serverless化的Express APP就上線了,在瀏覽器中打開響應(yīng)信息中返回的鏈接,若網(wǎng)頁展示出 “Hello world!” 那么證明應(yīng)用已經(jīng)成功部署起來了!
Serverless Express App
優(yōu)勢(shì)
將你的應(yīng)用 Serverless 化后,你不再畏懼用戶群體的進(jìn)一步擴(kuò)大,應(yīng)用會(huì)始終保持為可用狀態(tài)。這并不是言過其實(shí),因?yàn)樵谀J(rèn)情況下 FunctionGraph 可通過彈性伸縮最高支持100個(gè) function 并發(fā)執(zhí)行。當(dāng) API Gateway 接收到請(qǐng)求后,新的 function 會(huì)在短時(shí)間內(nèi)處于可用狀態(tài)。
在高負(fù)載下的 Serverless Express.js App
這并不是你接入 Serverless 后唯一的收益。在保證應(yīng)用不會(huì)因?yàn)楦哓?fù)載宕機(jī)的前提下,你同樣削減了不少應(yīng)用的運(yùn)行開銷。使用 FunctionGraph,你僅需按你應(yīng)用的實(shí)際訪問量付費(fèi)。同樣,F(xiàn)unctionGraph的免費(fèi)試用計(jì)劃還將給予你每應(yīng)用每月一百萬的免費(fèi)流量(按訪問次數(shù)計(jì)算)。
你的 Serverless App 真是太替你省錢了
更炫酷的Demo
在真實(shí)的項(xiàng)目中,是否真的能夠快速集成?下面我們來實(shí)際操作一波,在Github上找一個(gè)實(shí)際的Express項(xiàng)目,讓它Serverless化,快速上線。
canfoo / react-taopiaopiao
這是一個(gè)基于Express和React構(gòu)建的仿淘票票APP,其中包括對(duì)前、后端請(qǐng)求的處理,無需關(guān)注細(xì)節(jié),我們將其Api的root_path設(shè)置為express-demo,然后將項(xiàng)目壓縮成zip包,將其作為代碼創(chuàng)建一個(gè)名為express-demo的函數(shù)。創(chuàng)建完成后為函數(shù)添加一個(gè)入口文件,并創(chuàng)建一個(gè)apig觸發(fā)器,即完成構(gòu)建了。Apig觸發(fā)器中顯示的url即為Express程序的Api訪問地址根路徑。
現(xiàn)在,讓我們拭目以待吧,將此url生成一個(gè)二維碼,掏出手機(jī),讓大家在世界各地訪問你APP吧。
愛情需要磨合——缺陷
即使Servlerss Express APP聽起來超贊,也會(huì)有一些缺陷。
下面是 Serverless Express App 一些最 “致命” 的短板:
1、Websockets 無法在 FunctionGraph 中使用。這是因?yàn)樵?Functiongraph 中,若應(yīng)用沒有任何的訪問,那么你的服務(wù)器在客觀上也是不存在的。
2、上傳文件到文件系統(tǒng)同樣是無法工作的,除非你的上傳目錄是 /tmp 文件夾。這是因?yàn)?FunctionGraph 對(duì)文件系統(tǒng)是只讀的,即使你將文件上傳到了 /tmp 文件夾,它們也只會(huì)在 function 處于 “工作態(tài)” 時(shí)存在。為確保你應(yīng)用中的上傳功能運(yùn)轉(zhuǎn)正常,你應(yīng)當(dāng)把文件上傳并保存到 OBS 上。
3、執(zhí)行限制也將影響你的 Serverless Express App 功能。例如 FunctionGraph 最大執(zhí)行時(shí)間不能超過 5 分鐘等。
這僅僅算是你的應(yīng)用與 FunctionGraph 之間關(guān)于 Serverless 愛情故事的一個(gè)序章,期待盡快涌現(xiàn)更多的愛情故事!
生活需要愛——感謝
本文Express介紹部分大量借鑒以下文章:
(英文原文) Express.js and AWS Lambda?—?a serverless love story(作者:Slobodan Stojanovi?)
(譯文) Express.js 與 AWS Lambda——一場(chǎng)關(guān)于Serverless的浪漫愛情故事(譯者:劉嘉一)
掃碼免費(fèi)體驗(yàn)函數(shù)工作流FunctionGraph~