1.04 Web框架概览-Iris框架分析
PART1. 基本使用
package iris
import (
"github.com/kataras/iris/v12"
"testing"
)
func TestHelloWorld(t *testing.T) {
app := iris.New()
app.Get("/", func(ctx iris.Context) {
_, _ = ctx.HTML("Hello <strong>%s</strong>!", "World")
})
_ = app.Listen(":8083")
}和GIN相同,注册路由时可以使用匿名函数,也可以使用handleFunc.
PART2. Application
上述示例中的iris.New(),实际上返回的是一个Application实例:
这个Application就是Iris中的核心抽象,它代表的是"应用".从语义上来讲Application更接近Beego中的HttpServer和GIN中的Engine.这一点从例子中的app.Listen(":8083")这行代码就能看出来.它提供了:
生命周期控制功能:例如
Application.Run()/Application.Shutdown()等方法注册路由的API:例如
Application中的APIBuilder字段(该字段的类型为*router.APIBuilder),该字段有APIBuilder.Get()/APIBuilder.Post()等方法
一种观点认为:Application这个名字不是很合适,因为有一些应用会监听多个端口,不同的端口提供不同的功能(这个之前的笔记里有写到),也就是常说的多Server应用.相比之下,HttpServer或Engine更合适一些.
PART3. 路由相关功能
Iris的设计非常复杂.在Beego和Gin里面能够明显看到路由树的痕迹(Beego中的ControllerRegister和GIN中的methodTrees),但是在Iris里面就很难看出来.
Iris中和处理路由相关的有3个抽象:Route、APIBuilder、repository
3.1 Route
Route:直接代表了已经注册的路由.在Beego和GIN中,对应的是路由树中的节点(例如GIN中的gin.node)
3.2 APIBuilder
APIBuilder:创建Route的Builder模式,Party也是它创建的.
3.3 repository
repository:存储了所有的Routes,有点接近GIN的methodTrees的概念
讲师观点:过于复杂,职责不清晰,难以划定每个结构体的职责边界.不符合一般人的直觉,新人学习和维护门槛高,不要学.
PART4. Context抽象
Context也是表示一个请求的上下文.它本身也提供了各种处理请求和响应的方法.基本上和Beego、GIN的Context没啥区别.比较有特色的一点是:Iris的Context支持请求级别的添加Handler,即AddHandler()方法.有点像GIN中IRoutes接口中定义的Handle()方法,可以看到二者AOP的粒度是不同的,Iris是在方法级别上控制,而GIN是在Server级别控制.
PART5. 抽象总结

Route & Party & APIBuilder:解决路由相关(路由注册/路由匹配等)的问题
Application:解决HTTPServer的问题
Context:解决请求的上下文问题
Handler:具体的业务逻辑代码
Last updated