github: https://github.com/emicklei/go-restful
REST 基本设计原则是创建、读取、更新和删除(CRUD)操作和HTTP方法之间建立起一对一的映射。根据该映射:
GET = 检索资源
POST = 创建,使用某种服务器端的算法将内容发送到服务器以创建指定资源或资源的集合
PUT = 创建,如果发送指定URI的完整内容
PUT = 更新,如果要更新指定URI的完整内容
DELETE = 删除,如果要请求服务器删除指定的资源
PATCH = 更新,更新某个资源的部分内容
OPTIONS = 获取请求URI相关的通信选项的信息
路由请求:支持函数映射到路径参数(如{id})
路由可配置
(默认)快速路由算法,允许URL路径上出现静态元素、正则表达式、动态参数。比如 /meetings/{id} 或者 /static/{subpath:*}
JSR311规范实现的路由算法
提供了Request API 用于从 JSON/XML 读取结构和访问各种参数(路径参数、查询参数、头部参数)
提供了Response API用于将结构(struct)写入到JSON/XML以及设置头部
支持使用 EntityReaderWriter 注册的自定义编码
支持在服务级或路由级对请求到响应流的过滤和拦截
支持使用属性来定义请求范围的变量
容器Container支持不同HTTP端点上的WebService
请求和响应的有效负载上的内容编码(gzip,deflate)
(使用过滤器)自动响应OPTIONS请求
(使用过滤器)自动处理CORS请求
支持Swagger UI编写的API文档声明(阅读go-restful-openapi和go-restful-swagger12)
针对HTTP 500状态码的恐慌恢复,使用RecoverHandler(…)自定义处理
路由错误产生HTTP 404/405/406/415等错误,使用ServiceErrorHandler(…)自定义处理
可配置的日志跟踪
使用CompressorProvider注册自定义gzip/deflate的读入器和输出器
路径pkg/kubelet/kubelet.go中函数NewMainKubelet
klet.livenessManager = proberesults.NewManager()
// NewManager creates and returns an empty results manager.
func NewManager() Manager {
return &manager{
cache: make(map[kubecontainer.ContainerID]Result),
updates: make(chan Update, 20),
}
}
runtime, err := kuberuntime.NewKubeGenericRuntimeManager(
kubecontainer.FilterEventRecorder(kubeDeps.Recorder),
klet.livenessManager,
seccompProfileRoot,
containerRefManager,
machineInfo,
klet,
kubeDeps.OSInterface,
klet,
httpClient,
imageBackOff,
kubeCfg.SerializeImagePulls,
float32(kubeCfg.RegistryPullQPS),
int(kubeCfg.RegistryBurst),
kubeCfg.CPUCFSQuota,
kubeCfg.CPUCFSQuotaPeriod,
runtimeService,
imageService,
kubeDeps.ContainerManager.InternalContainerLifecycle(),
legacyLogProvider,
klet.runtimeClassManager,
)
klet.probeManager = prober.NewManager(
klet.statusManager,
klet.livenessManager,
klet.runner,
containerRefManager,
kubeDeps.Recorder)
最简单的使用实例,向WebService注册路由,将WebService添加到Container中,由Container负责分发。
ws := new(restful.WebService)
ws.Path("/users")
ws.Route(ws.GET("/").To(u.findAllUsers).
Doc("get all users").
Metadata(restfulspec.KeyOpenAPITags, tags).
Writes([]User{}).
Returns(200, "OK", []User{}))
container := restful.NewContainer().Add(ws)
http.ListenAndServe(":8080", container)