虽然,当前go语言的rest框架比较多,其中比较有名的有beego, gin等。但是这些框架相对来说都有点太重,而Kubernetes中使用的go-restful框架是一个轻量级的框架,能够满足大多数restful程序开发中的需求,本文对项目中使用go-restful框架中使用到的基本概念和使用方式做了简单的整理,如有不当之处,请不吝赐教。
基本概念
go-restful 框架中最基础的几个概念包括: route, webservice, container。
route
route是http server的基本概念,是指一条http请求的URL, 根据此URL来确定那个函数为其服务。 go-restful中的route也是一样的,不过代码实现的时候更准确的说法是注册路由。
webservice
webservice实际上是一组route的集合。这组route拥有相同的rootpath或者base path,拥有相同的输入输出格式,基本一致的请求数据类型等一些通用的属性,举例说明:User为例,webservice是以/user/为基础路径的一个route集合,其下列的请求都是请求user相关操作的route。
换一种说法是将一组相关性非常强的request URL封装成为一个webserviice。举个例子来说明我们在公司开发过程中有项目信息和用户信息; 这样项目可以作为一个webservice, 用户可以作为另一个webservice。webservice只是一组route的集合,其必须加入到container中才能够生效。Container
Container 在http的角度就是一个Server,其包含一组webservice, 一个serveMUx,以及对应的routeselect负责请求派发。
三者之间的关系
一个container实际上是对外提供的一个(从http的基本角度看)http Server; 一个container里面可以有很多个webservice, 一个webservice可以看做是一组对象的服务,是一个种类的服务请求的一个合集或者看成是子服务; 一个 route则是单个请求的路由,一个webservice包括一组route,这一组路由有相同的base路径。其三者的相互关系如下图:
示例程序
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") }