1、关于
Iris是基于Go编写的一个快速,简单但功能齐全且非常高效的Web框架。
Iris具有以下特性:
- 专注于高性能
- 健壮的静态路由支持和通配符子域名支持
- 带有GC,内存和redis提供支持的会话
- 视图系统支持超过5以上的模板,完全兼容html/template
- 支持定制事件的高可扩展性Websocket Api
- 强大的中间件和插件生态系统
- 能定制Http错误
- 源码修改后自动加载(热编译)
2、安装
要求Go最低版本是1.8
go get -u github.com/kataras/iris
如果出现如下情况:
可删除报错路径中的 kataras 目录并,执行:
go get github.com/kataras/iris/v12@latest
3、快速开始
1、新建一个项目文件夹iris-demo
,然后进入该文件目录下
mkdir iris-demo && cd iris-demo
2、然后利用go mod init
初始化该项目。
go mod init iris-demo
3、创建server.go
package main
import (
"github.com/kataras/iris/v12"
)
func main() {
//初始化iris.Application
app := iris.Default()
//创建Router
app.Handle("GET", "/", func(c iris.Context) {
c.WriteString("Hello World!")
})
app.Get("/ping", func(c iris.Context) {
c.JSON(iris.Map{"message": "pong"})
})
//启动http server
app.Run(iris.Addr(":9999"))
}
4、启动服务
go run server.go
6、浏览器访问http://127.0.0.1:9999,就能成功的看到我们的 Hello,World! 输出到屏幕上。
4、Iris生命周期
3.1、初始化iris.Application
// Application 首先看看我们的iris Application结构体组成
type Application struct {
// 我们的路由都注册到了 APIBuilder
*router.APIBuilder
// *router.Router 实现了ServeHTTP方法 并且最终赋值给了&http.server{}.Handler
*router.Router
// 请求上下文池子
ContextPool *context.Pool
// 配置项
config *Configuration
// 日志
logger *golog.Logger
// 视图
view view.View
// 执行一次的once
once sync.Once
// 互斥锁
mu sync.Mutex
Hosts []*host.Supervisor
hostConfigurators []host.Configurator
}
// 创建了一个iris应用实例
// 为什么不直接New呢?
// 因为Default里面注册了两个handle
// 1. recover panic的方法,
// 2. 请求日志
app := iris.Default()
func Default() *Application {
app := New()
// 合成复用*APIBuilder的Use
app.Use(recover.New())
// 合成复用*APIBuilder的Use
app.Use(requestLogger.New())
return app
}
// app := New() 得到的结构体
app := &Application{
config: &config,
logger: golog.Default,
// 很关键:我们的路由都注册到了 APIBuilder
APIBuilder: router.NewAPIBuilder(),
// 很关键:*router.Router 实现了ServeHTTP方法 并且最终赋值给了&http.server{}.Handler
Router: router.NewRouter(),
}
// 注册api请求的中间件
func (api *APIBuilder) Use(handlers ...context.Handler) {
api.middleware = append(api.middleware, handlers...)
}
- 创建一个iris.Application
- 创建 APIBuilder(app.Get()等方法的路由都是注册到这里)
- 创建Router(每个http请求都是通过router处理的)
3.2、注册路由到app.APIBuilder
// APIBuilder
api := &APIBuilder{
macros: macro.Defaults,
errorCodeHandlers: defaultErrorCodeHandlers(),
reporter: errors.NewReporter(),
relativePath: "/",
// 最终的我们定义的路由都是注册到了这里
routes: new(repository),
}
// repository的结构
type repository struct {
routes []*Route
}
3.3、初始化一个http.Server
// 赋值http服务的ip+port
iris.Addr(":9999")
//创建http.Server并启动服务的匿名方法
func Addr(addr string, hostConfigs ...host.Configurator) Runner {
return func(app *Application) error {
return app.NewHost(&http.Server{Addr: addr}).
Configure(hostConfigs...).
ListenAndServe()
}
}
// app.NewHost(&http.Server{Addr: addr})
// 就是这里赋值app.Router给http.Server的Handler的
if srv.Handler == nil {
srv.Handler = app.Router
}
// 启动服务
su.Server.Serve(l)
// accept请求
l.Accept()
// 启动一个goroutine处理请求
go c.serve(ctx)
serverHandler{c.server}.ServeHTTP(w, w.req)
3.4、构建路由handler&启动http server
- 注册app.APIBuilder到app.Router.routesProvider
- 注册app.APIBuilder.routes的路由到app.Router.requestHandler
- 启动http server
流程图如下:
本文正在参加技术专题18期-聊聊Go语言框架