5.04 Context-Echo和Iris的Context设计分析
PART1. Echo Context设计分析
1.1 Echo Context的设计
Echo的Context
被设计为接口,这一点和Beego、Gin都不太一样,但实际上,它只有1个实现context
.
这意味着其他人也可以提供Context
接口的不同实现,但实际上也并没有什么人去实现它.
从方法定义上来看,Echo的context
和Beego、Gin的都差不多,也是维护来自各部分的输入和输出.
可以看到,和Gin的Context
设计一样,Echo的Context
也是自行封装了一个Response,但是使用了原生的http.Request
.
context.logger
:这意味着Echo把日志输出定义在了context级别上.有一种观点认为日志输出应该定义在Server上,而非Context上context.lock
:有一种观点认为Context没有必要实现线程安全.因为正常情况下1个请求打到Server端,就应该只有1个Context去处理这个请求(因为Server端的基本模型是每收到1个请求,就有1个goroutine去处理这个请求,因此应该只有1个Context).如果在中间件使用者定义的HandleFunc内部,中间件使用者自己又启动了一些goroutine,那么应该让中间件使用者自己去在他创建的这些goroutine之间确保这个Context的线程安全,而非由中间件研发者替他对Context的线程安全做出保证
1.2 Echo 处理输入
echo.context
中从不同部位读取指定数据的方法
1.3 Echo 处理输出
echo.context
中处理各种格式输出的方法.包括渲染页面的方法(context.Render
)
PART2. Iris Context设计分析
2.1 Iris Context的设计
Iris的Context
也是设计为接口,也是有一个默认的实现Context
结构体.
这意味着其他人也可以提供Context
接口的不同实现,但实际上也并没有什么人去实现它.
从抽象层级上来讲,确实这种设计比Beego和Gin的抽象层级更高.但在这个场景下的前提是:真的需要Context
接口的多个实现.很明显这个场景下是没这个需求的.
注:截止编写笔记的日期(2023.11.15),Iris不再是这种设计,而是直接使用Context
结构体,该结构体实现了多个接口.
2.2 Iris 处理输入
context.Context
中处理各部分输入的方法
2.3 Iris 处理输出
context.Context
中处理各种格式输出的方法
Last updated