Go的Iris框架快速入门

477 阅读2分钟

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语言框架