FaaS 是 Function as a Service 的簡稱趾牧,是構(gòu)建 Serverless 的一種框架故响。
那么 FaaS 做了什么事情呢傀广?簡單來講 FaaS 將 HTTP 請求轉(zhuǎn)發(fā)到可執(zhí)行命令,然后將命令的執(zhí)行結(jié)果轉(zhuǎn)發(fā)給 HTTP Response彩届。
有了這么一條業(yè)務(wù)邏輯我們就可以構(gòu)建自己的 FaaS 服務(wù)器伪冰。
首先定義可執(zhí)行命令的數(shù)據(jù)結(jié)構(gòu):
data Proc = Proc { procFuncName :: String
, procName :: String
, procArgv :: [String]
}
-
procFuncName
為 HTTP 請求的函數(shù)名字 -
procName
為可執(zhí)行的命令 -
procArgv
為可執(zhí)行命令的參數(shù)
執(zhí)行命令使用 System.Process.ByteString.Lazy
里面的 readProcessWithExitCode
runProc :: Proc -> ByteString -> IO (Either ByteString ByteString)
runProc (Proc { procName = name, procArgv = argv}) wb = do
(code, out, err) <- readProcessWithExitCode name argv wb
case code of
ExitSuccess -> return (Right out)
ExitFailure _ -> return (Left err)
使用 Web.Scotty
來構(gòu)建 web
服務(wù)器
processHandler :: (String -> Maybe Proc) -> ActionM ()
processHandler getProc = do
func <- param "func"
case (getProc func) of
Nothing -> do
status status404
raw LB.empty
Just proc -> do
wb <- body
result <- liftIO $ runProc proc wb
case result of
Left err -> do
status status500
raw err
Right out -> raw out
catProc :: Proc
catProc = Proc { procFuncName = "cat"
, procName = "cat"
, procArgv = []
}
getProcByFuncName :: String -> Maybe Proc
getProcByFuncName "cat" = Just catProc
getProcByFuncName _ = Nothing
main = scotty 3000 $ do
post "/function/:func" $ processHandler getProcByFuncName
到這里 FaaS 服務(wù)器已經(jīng)完成。
FaaS 服務(wù)器就這么簡單樟蠕,在生產(chǎn)環(huán)境上我們還需要做一些事情贮聂,比如 函數(shù)可以配置。
完整的代碼參見 func