虽然,当前go语言的rest框架比较多,其中比较有名的有beego, gin等。但是这些框架相对来说都有点太重,而Kubernetes中使用的go-restful框架是一个轻量级的框架,能够满足大多数restful程序开发中的需求,本文对项目中使用go-restful框架中使用到的基本概念和使用方式做了简单的整理,如有不当之处,请不吝赐教。
go-restful 框架中最基础的几个概念包括: route, webservice, container。
route是http server的基本概念,是指一条http请求的URL, 根据此URL来确定那个函数为其服务。 go-restful中的route也是一样的,不过代码实现的时候跟准确的说法是注册路由。
webservice实际上是一组route的集合。这组route拥有相同的rootpath或者base path,拥有相同的输入输出格式,基本一致的请求数据类型等一些通用的属性,举例说明:User为例,webservice是以/user/为基础路径的一个route集合,其下列的请求都是请求user相关操作的route。
换一种说法是将一组相关性非常强的request URL封装成为一个webserviice。举个例子来说明我们在公司开发过程中有项目信息和用户信息; 这样项目可以作为一个webservice, 用户可以作为另一个webservice。webservice只是一组route的集合,其必须加入到container中才能够生效。
Container 在http的角度就是一个Server,其包含一组webservice, 一个serveMUx,以及对应的routeselect负责请求派发。
package main
import (
"fmt"
"github.com/emicklei/go-restful"
"k8s.io/klog"
"net/http"
"io"
"time"
)
// webserver监听的端口号
var listenPort string
func main() {
// 初始化log
klog.InitFlags(nil)
// 此处仅为示例,正常情况下请从配置文件或通过参数设置
listenPort = 8080
// 创建container,并注册路由
container := restful.NewContainer()
register(container)
// 创建webserver,并监听
server := newWebserver()
if err := server.ListenAndServe(); err != nil {
if err == http.ErrServerClosed {
klog.Fatalf("Http Server closed under request: %v\n", err)
} else {
klog.Fatalf("Could not listen on %s: %v\n", listenPort, err)
}
}
}
// 创建一个webserver
func newWebserver() *http.Server {
return &http.Server{
Addr: listenAddr,
Handler: container,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 15 * time.Second,
}
}
// 注册路由
func register(container *restful.Container) {
ws := new(restful.WebService)
ws.Route(ws.GET("/hello").To(hello))
container.Add(ws)
}
// 处理函数
func hello(req *restful.Request, resp *restful.Response) {
io.WriteString(resp, "world")
}