深刻理解gin framework(二)

gin flow 分析

  • Handler是如何注册和传递的?路由是如何解析的?http方法又是如何处理,使其知足RESTful规范的?这些细节都须要深刻到代码层面来分析

辅助功能

  • 既然是框架,天然会处理各类项目中共性的问题,好比说404 Not Found。这部分框架的功能不是分析的重点。

启动http服务

  • 深刻理解gin framework(一)的例子中,由r.Run(":14000")启动http服务。这里只能传入空值或者一个地址,不然会报错。源码以下,空值时默认端口为8080.

    clipboard.png

  • 启动http server的Run函数,TLS类似,只不过是加了个证书。其实仍是把address传给官方标准包http的ListenAndServe函数,此处的engine struct只须要实现Handler接口,也就是实现ServeHTTP函数便可。

    clipboard.png

    clipboard.png

  • engine struct中的pool就是sync.Pool,代码中能够看出来,每处理一个http请求,都会从链接池里边取出一个Context,把请求参数传递给这个Context,处理完以后,再把这个Context放回去。

处理http请求

  • 从上边的源码能够看出来,全部的http请求都会走到handleHTTPRequest函数中去处理。
  • handleHTTPRequest处理的第一步是初始化Context的参数,前面有说到,Context结构体封装了处理http请求的全部数据。初始化参数就是将Context里面的数据更新为这次http请求的数据,方便接下来对Context进行处理。
  • 想要理解接下来handleHTTPRequest的处理逻辑,须要先岔开到tree.go文件当中去。git

    • 肯定某次http请求怎么处理,须要明确审什么?三件事情,path,method,handler!
    • 在tree文件当中,以基数树的结构存储了path,及其该path对应的handler。
      clipboard.png
    • 当新的http请求过来的时候,调用getValue就能够找到对应path的handler。为何没有对应的get,post方法呢?由于每一个http方法本身一棵树~
      clipboard.png
  • OK。回到handleHTTPRequest函数中来。找到handler以后,把Context交给这个handler就好了,handler为何可以处理Context呢?是由于这个:
    clipboard.png

番外:注册handler

  • 回到咱们的例子

    clipboard.png
    clipboard.png
    clipboard.png

  • gin.Default()返回了一个Engine,这个engine继承了RouteGroup,而RouteGroup实现了IRouter接口(Get(),Post()...),因此r.Group("/api")其实调用的是RouteGroup函数
    clipboard.png
  • 在Group里边会整合handlers,计算并记录绝对路径。分组以后返回RouteGroup对象,此时,继续调用POST()函数,将handlerFunc和路径注册到对应的tree当中。具体以下:
    clipboard.png
    clipboard.png
    clipboard.png
    clipboard.png
  • 至此,会生成POST方法对应的tree,当有POST请求进入服务器时,找到POST tree,而后根据path找到对应的handler。再把已经初始化的Context交给相应的handler来处理。
相关文章
相关标签/搜索