本篇文章并不是教你怎么用阿里云、谷歌云等等云框架的FaaS服務,而是教你如何從0開始打造一個自己的FaaS服務,
受限于人力及成本原因,現在的FaaS服務基本上可以說是“大廠玩物”,而網上鮮有相關代碼的實作,因此我才打算寫一篇文章,和大家分享如何從0開始打造一個Nodejs的FaaS服務,
本篇文章中的專案tiny-node-faas已經上線并開源至GitHub,歡迎各位使用,
訪問鏈接:http://www.shadowingszy.top/tiny-node-faas/index.html
原始碼地址:https://github.com/shadowings-zy/tiny-node-faas
一、背景及相關概念介紹
1-1、Serverless

Serverless,直譯就是無服務器,是指構建和運行不需要服務器管理的應用程式的概念,Serverless能夠按需提供后端服務,用戶可以直接撰寫和部署代碼,而不必擔心底層基礎架構,
簡單來說,如何判斷一個服務是不是Serverless的呢?如果你在開發這個服務的時候,完全不知道“服務器多少”、“容器環境”等等和基礎架構相關的東西的時候,那么這個服務就是Serverless的,
1-2、FaaS
FaaS是Function as a Service的縮寫,可以簡單理解為功能服務化,FaaS提供了一種服務碎片化的軟體架構范式,FaaS可以讓研發只需要關注業務代碼邏輯,不再關注技術架構,
舉個例子吧,如果我們要使用koa框架寫一個hello world服務,我們得這樣寫:
const Koa = require('koa');
const app = new Koa();
const handler = async (ctx) => {
ctx.body = 'hello world'
}
app.use(handler);
app.listen(8080,() => {
console.log('8080埠已啟動')
});
而如果使用FaaS服務,我們只需要關注下面這部分,其余的作業,比如服務創建、冷啟動、負載均衡等等都由FaaS的提供方做了,
const handler = async (ctx) => {
ctx.body = 'hello world'
}
1-3、為什么要做Nodejs的FaaS服務
之所以做Nodejs的FaaS服務,是因為有越來越多的開發者,以及越來越多的后臺服務,選擇使用Nodejs,
這其中當然有Nodejs本身“單執行緒異步非阻塞”的特性帶給我們的簡單直接的編程體驗,也有一部分原因在于“前端全堆疊化”趨勢會促使一部分前端工程師寫后端代碼邏輯,
而更值得關注的是,由于技術方向不同,不少前端開發工程師對運維、服務器的相關知識比較薄弱,因此為他們提供一個Nodejs的FaaS服務,能讓其從運維中脫離出來,使開發者更聚焦于業務代碼邏輯,是非常有前景的事情,
二、代碼實作
2-1、vm模塊
“如何實作Nodejs的FaaS服務”,這個問題可以換成下面這個問題:
如何才能在Nodejs中新建一個sandbox并在這個sandbox中執行指定的代碼,并拿到回傳值呢?
Nodejs實際上已經提供了這樣一個模塊——vm模塊,下面是檔案:
https://nodejs.org/api/vm.html
使用起來也很簡單:
const vm = require('vm');
const code = 'console.log("hello world!")'
const sandbox = { console };
vm.createContext(sandbox);
const data = vm.runInNewContext(code, sandbox);
通過vm模塊,我們就能在一個新的sandbox中執行JavaScript代碼并拿到回傳值了
2-2、整體架構

如圖所示,tiny-node-faas由四部分組成:
1、管理平臺前端
2、函式管理功能
3、函式存盤功能
4、函式執行功能
2、3、4三者則是FaaS服務中最重要的三個組成部分,
2-3、核心代碼
const vm = require('vm')
const runFunction = async (code) => {
let timer = null
const result = await new Promise((resolve, reject) => {
const sandbox = {
require,
console
}
try {
timer = setTimeout(() => {
reject(new Error('Execute function time out'))
}, 10000)
vm.createContext(sandbox)
const data = vm.runInNewContext(code, sandbox)
resolve(data)
} catch (error) {
reject(error)
}
}).catch((err) => {
return err instanceof Error ? err : new Error(err.stack)
})
if (timer) {
clearTimeout(timer)
timer = null
}
return result
}
上面代碼中的runFunction方法就是最核心的執行FaaS函式的方法,我們只需要傳入code,即需要運行的代碼,這個方法就會新建一個sandbox并運行代碼,然后會將運行結果回傳出來,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/261366.html
標籤:其他
