路由匹配规则

  • 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 …)都有自己的一颗树

image.png
其实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

资源池。减少开销

image.png