go-restful框架
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的读入器和输出器
三个重要数据结构
1. 初始化
路径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)
go-restful定义了Container WebService和Route三个重要数据结构。
- Route 表示一条路由,包含 URL/HTTP method/输入输出类型/回调处理函数RouteFunction
- WebService 表示一个服务,由多个Route组成,他们共享同一个Root Path。这些Route对象负责分发即将到来的HTTP请求到相应的函数调用。一般来说,WebService有一个root根路径(例如:/users),还为路由定义了常见的MIME类型。WebService必须添加到某个容器,才能从服务器处理HTTP请求。
- Container 表示一个服务器,由多个WebService和一个 http.ServerMux 组成,使用RouteSelector进行分发
最简单的使用实例,向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)