gin:一个快速的http web framework,基于httprouter封装的,包含了日志处理、错误返回、验证处理、数据格式返回、文件上传、websocket支持、clientip支持、cookie支持。
服务入口:gin.go engine.ServeHTTP(),这个会调用Next方法,第一个调用的就是日志middleware,Next中会调用具体的handlers,这个过程会递归调用Next,每次调用,循环只执行一次。
注册路由:routergroup.go 各种method方法,注册路由的时候会把handlers追加到middleware后,然后加入到树节点中。
Context是最重要的一个对象,在gin.New()时engine.pool.New allocateContext 初始化。
RouterGroup是组织路由的,一个RouterGroup关联一个handlers(slice),middleware和handler会放入handlers,然后调用Next遍历所有handler。日志handler会放入第一个,真正的handler会被放入到最后处理,这个主要为了日志middleware记录真实时间,在日志middleware调用Next遍历。
也就说:handler从日志middleware开始,到真正的handler处理结束。注册路由前,需要先注册middleware。日志Middleware:必须调用Next,不然记录的时间不对。通过middleware可以灵活的集成其他工具和功能,并把middleware抽象成HandlerFunc。gin的请求处理时间:从handler调用到返回数据的时间,并不包含路由查找时间,还有之前预处理(启动goroutine前)的时间,所以请求处理时间会远远低于请求端记录的请求响应时间。
bind是用于解析提交的数据(将数据绑定到struct结构),比如解析json,xml,query string等分为MustBindWith和ShouldBindWith,唯一的区别是前者会返回错误状态码,而后者需要自己返回状态码,后者更加灵活。输入认证数据后(header),请求才发送过去。Keys的数据主要在middleware中设置,方便在handler中使用。
标签:调用,框架,middleware,Next,golang,handler,gin,日志 From: https://blog.51cto.com/liuping0906/6131246