路由匹配规则
Gin
的路由采用的是httprouter
,所以它的路由参数的定义和httprouter
也是一样的。- 路由是单一的,不能有重复
gin的http是怎么实现
Run方法最终会调用内置http库的ListenAndServe方法来监听端口,如果不传参数默认监听80端口,也可以通过参数来变更地址和端口。会先去用内置的函数Listen监听一个tcp链接端口,然后会在serve方法里面去accept,源码里面有一个for死循环,每一个http请求过来也都会开启一个goroutine,这是也是IO多路复用的一个典型例子
- request数据是如何流转的
- 首先需要建立起来TCP连接, 也就是socket.注册路由
- ln, err := net.Listen(“tcp”, addr)做了初试化了socket, bind, listen的操作.
- rw, e := l.Accept()进行accept, 等待客户端进行连接 go c.serve(ctx) 启动新的goroutine来处理本次请求. 同时主goroutine继续等待客户端连接, 进行高并发操作 h, _ := mux.Handler(r) 获取注册的路由, 然后拿到这个路由的handler, 然后将处理结果返回给客户端
- gin框架到底扮演了什么角色
- 请求从gin流入net/http, 最后又是如何回到gin中
- gin的context为何能承担起来复杂的需求
- gin的路由算法
- gin的中间件是什么
- gin的Engine具体是个什么东西
- gin框架的Engine最重要的函数就是func (engine Engine) ServeHTTP(w http.ResponseWriter, req http.Request). Engine实现了Handler(server.go#L84-86), 让net/http请求数据最终流回到gin中, 从gin的route tree中取到相关的中间件及handler, 来处理客户端的request
- 在整个gin框架中最重要的一个struct就是Engine, 它包含路由, 中间件, 相关配置信息等. Engine的代码主要就在gin.go中
- 在整个gin框架中最重要的一个struct就是Engine, 它包含路由, 中间件, 相关配置信息等. Engine的代码主要就在gin.go中
- net/http的requeset, response都提供了哪些有用的东西
gin路由树
gin的路由树算法是一棵前缀树. 不过并不是只有一颗树, 而是每种方法(POST, GET …)都有自己的一颗树
其实gin的实现不像一个真正的树, children []*node所有的孩子都放在这个数组里面, 利用indices, priority变相实现一棵树
当服务端收到客户端的请求时, 根据path去trees匹配到相关的路由, 拿到相关的处理handlers
gin 启动过程
(1)首先生成一个gin.Default
(2)设置路由r.GET…
(3)启动listen and serve
gin
框架启动的时候,也是基于 http.ListenAndServe(addr string, handler Handler)
这个方法的,与原生的 http
库的区别就是,ListenAndServe(addr string, handler Handler)
这个方法的第二个参数,传入的是 engine
,
比如它的savehttp方法,会先从从池里获取资源处理请求,重置资源的 ResponseWriter,赋值请求给 context
将资源信息给到 handler 进一步处理,请求处理结束,将资源放回池子
gin engine
重点,将 engine 重新赋值给路由组对象中的 engine
资源池。减少开销