如何搭建轻量web服务器调用外部程序处理REST请求
推荐方案及示例
结合你的场景需求,以下两个方案都能满足轻量、低资源、易部署的要求,你可以根据自己是否愿意写少量代码选择:
方案1:单文件Go自定义服务(优先推荐)
这个方案不需要额外依赖,编译后仅一个几MB大小的二进制文件,运行时内存占用稳定在10MB以内,完全适配K8s部署,逻辑可以完全自定义,处理二进制传输也非常方便。
极简实现示例
以下代码实现了两个接口,分别对应备份(GET请求返回备份二进制)和恢复(POST请求传入备份文件执行恢复),你可以根据自己的实际二进制路径扩展其他接口:
package main import ( "io" "net/http" "os/exec" ) func main() { // 备份接口:GET请求触发,返回备份文件二进制流 http.HandleFunc("/api/backup", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { w.WriteHeader(http.StatusMethodNotAllowed) return } cmd := exec.Command("/usr/local/bin/your-backup-binary") stdout, err := cmd.StdoutPipe() if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } if err := cmd.Start(); err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } w.Header().Set("Content-Type", "application/octet-stream") io.Copy(w, stdout) cmd.Wait() }) // 恢复接口:POST请求传入备份文件,执行恢复逻辑 http.HandleFunc("/api/restore", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { w.WriteHeader(http.StatusMethodNotAllowed) return } cmd := exec.Command("/usr/local/bin/your-restore-binary") stdin, err := cmd.StdinPipe() if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } go func() { defer stdin.Close() io.Copy(stdin, r.Body) }() output, err := cmd.CombinedOutput() if err != nil { w.WriteHeader(http.StatusInternalServerError) } w.Write(output) }) // 监听8080端口 http.ListenAndServe(":8080", nil) }
部署方法
执行命令CGO_ENABLED=0 GOOS=linux go build -o ops-webhook main.go编译得到单文件可执行程序,直接运行即可。K8s部署时可以用scratch作为基础镜像打包,或者直接挂载到普通Alpine镜像中,同时挂载你需要调用的维护二进制的存储卷即可。
方案2:lighttpd + CGI(零代码方案)
如果你不想写代码,直接用lighttpd的CGI模块就能实现需求,lighttpd本身运行内存占用仅5MB左右,配置比nginx简单很多。
配置示例
- 安装lighttpd并启用mod_cgi模块
- 编辑lighttpd配置文件
lighttpd.conf:
server.port = 8080 server.document-root = "/opt/ops-bin" server.modules += ("mod_cgi") # 所有请求直接映射到/opt/ops-bin下的可执行文件 $HTTP["url"] =~ "^/*" { cgi.assign = ( "" => "" ) }
- 把你所有的维护二进制放到
/opt/ops-bin目录,赋予执行权限。
使用方法
比如你有个名为cleanup的清理二进制,直接发送GET或POST请求到http://服务地址/cleanup就会自动执行该二进制,POST请求的body会直接作为stdin传给二进制,二进制的stdout会直接作为响应返回给客户端,完全满足双向二进制传输的需求。
定期执行需求处理
你不需要在这个web服务里加定时器逻辑,直接用K8s自带的CronJob资源,按设定的周期调用对应接口或者直接执行二进制即可,和按需触发的逻辑完全解耦。
内容的提问来源于stack exchange,提问作者akagixxer
相关产品推荐
相关产品推荐

