Gin 源码学习笔记

一些名词:
  • REST: 表述性状态转移
  • RESTful架构 :符合REST的约束条件和原则
  • 资源与URI:任何事物,有被引用到的必要,就是资源
  • URI:资源的地址或名称,资源必须有URI
  • 统一资源接口:无论怎么的资源,都是通过使用相同的接口进行访问:
  • 幂等:一个方法的任意多次执行所产生的影响与一次执行的影响相同
  • 采用标准HTTP方法:GET、POST、PUT、DELETE

http标准包 :golang开发web框架的原材料;
重要部件:Server(服务器对象)、Conn(connection对象)、Handler(路由器)
编程逻辑:新建路由规则(实现Handler接口的ServerHTTP方法),启动server,建立http连接

【注】实现某接口:若某个类型提供了某接口中所定义的所有方法,则可以说:某类型实现了某接口

gin如何整合http包:

在engine中实现了ServerHTTP方法。根本上来说,是gin实现了一个功能强大的Handler
所有请求由ServeHTTP方法中的handleHTTPRequest进行处理,然后分发。

运行流程:
r := gin.Default() 

初始化并返回了一个Engine对象

router := engine.Group("/v1")

返回了一个RouterGroup对象,RouterGroup对象中包含了一个Engine对象

router.Use(casbins.AuthCheck())

向之前的RouterGroup对象的Handlers字段添加了中间件提供的方法

router.GET("/reload", Reload)

↑ 调用 ↓

group.handle("GET", relativePath, handlers)

↑ 调用 ↓

group.engine.addRoute(httpMethod, absolutePath, handlers)

↑ 调用 ↓

root.addRoute(path, handlers)

最后向engine.trees字段中添加一个节点,完成路由的注册

r.Run()

↑ 调用 ↓

http.ListenAndServe(address, engine)

【疑问】
在http包的使用时,路由最后被注册到了DefaultServeMux.m字段中,并且在收到请求时也从这里查找路由。而gin则是把路由存放到了他的engine.trees字段中,那么收到请求时,系统怎么知道去哪里寻找路由呢?

【猜测】
DefaultServeMux和engine本质上都是个handler,源码中有写到,若没有传入handler时,则使用DefaultServeMux。那也就是说在开始的时候。engine是作为handler被注册了的,系统收到一个请求后,发现有一个注册的handler,那么就使用了这个handler而不再使用DefaultServeMux。路由的寻找使用的方法应该是实现了某接口(这个接口也被DefaultServeMux实现了),这样就能保证虽调用的方法名一致,但由于内部实现不同,所以可以从engine.trees中读取路由。

【解决】
带着问题读源码效果好多了,默认使用的ServeMux和gin所使用的engine都实现了Handler接口的ServeHTTP方法。在后者的ServeHTTP方法中调用了handleHTTPRequest方法,其中发现了engine.trees的身影。

Gin 源码学习笔记_第1张图片

你可能感兴趣的:(学习笔记,学习笔记,Gin)