技术 | 用 20 行 Haskell 写 FaaS 服务器
2020-06-17
FaaS 是 Function as a Service 的简称,是构建 Serverless 的一种框架。
那么 FaaS 做了什么事情呢?简单来讲 FaaS 将 HTTP 请求转发到可执行命令,然后将命令的执行结果转发给 HTTP Response。
有了这么一条业务逻辑我们就可以构建自己的 FaaS 服务器。
首先定义可执行命令的数据结构:
data Proc = Proc { procFuncName :: String
procName :: String
,
procArgv :: [String]
,
}
procFuncName
为 HTTP 请求的函数名字procName
为可执行的命令procArgv
为可执行命令的参数
执行命令使用 System.Process.ByteString.Lazy
里面的 readProcessWithExitCode
runProc :: Proc -> ByteString -> IO (Either ByteString ByteString)
Proc { procName = name, procArgv = argv}) wb = do
runProc (
<- readProcessWithExitCode name argv wb
(code, out, err)
case code of
ExitSuccess -> return (Right out)
ExitFailure _ -> return (Left err)
使用 Web.Scotty
来构建 web
服务器
processHandler :: (String -> Maybe Proc) -> ActionM ()
= do
processHandler getProc
<- param "func"
func
case (getProc func) of
Nothing -> do
status status404
raw LB.empty
Just proc -> do
<- body
wb
<- liftIO $ runProc proc wb
result
case result of
Left err -> do
status status500
raw err
Right out -> raw out
catProc :: Proc
= Proc { procFuncName = "cat"
catProc
= "cat"
, procName
= []
, procArgv
}
getProcByFuncName :: String -> Maybe Proc
"cat" = Just catProc
getProcByFuncName
= Nothing
getProcByFuncName _
= scotty 3000 $ do
main
"/function/:func" $ processHandler getProcByFuncName post
到这里 FaaS 服务器已经完成。
FaaS 服务器就这么简单,在生产环境上我们还需要做一些事情,比如 函数可以配置。
完整的代码参见 func
更多文章可以查看简书:https://www.jianshu.com/p/63804299f99e