1. Iris是一个通过GO编写的快速的,简单的,但是功能齐全和非常有效率的web框架
  2. Iris为你下一个网站或者API提供一个精美的、使用简单的基础
  3. Iris为使用者提供了一个完整且体面地支持

安装Iris

Iris是一个跨平台的软件

  1. //安装
  2. //go get github.com/kataras/iris/v12@latest
  3. package main
  4. import "github.com/kataras/iris/v12"
  5. func main() {
  6. app := iris.Default()
  7. app.Use(myMiddleware)
  8. app.Handle("GET", "/ping", func(context iris.Context) {
  9. context.JSON(iris.Map{"message": "pong"})
  10. })
  11. //监听端口
  12. app.Run(iris.Addr(":8080"))
  13. }
  14. //中间件
  15. func myMiddleware(ctx iris.Context) {
  16. ctx.Application().Logger().Infof("Runs before %s", ctx.Path())
  17. ctx.Next()
  18. }

如果想使用类似Gin的Air插件可以安装 rizla 工具 riazla main.go 代替 go run main.go

Host

你可以开启服务监听任何net.Listener或者http.Server类型的实例。初始化服务器的方法应该在最后传递给Run函数。

Go开发者最常用的方法是通过传递一个形如hostname:ip形式的网络地址来开启一个服务。Iris中我们使用iris.Addr,它是一个iris.Runner类型

  1. app.Run(iris.Addr(":8080"))
  2. //有时候你在你的应用程序的其他地方创建一个标准库net/http服务器。并且你想使用它作为你的iris web程序提供服务
  3. app.Run(iris.Server(&http.Server{Addr:":8080"}))
  4. //最高级的用法是创建一个自定义的或者标准的`net/Listener`然后传递给app.Run
  5. l,err:=net.Listen("tcp4",":8080")
  6. if err!=nil{
  7. panic(err)
  8. }
  9. app.Run(iris.Listener(l))

HTTP/2和安全

如果你有文件密钥,你可以使用iris.TLS基于这些验证密钥开启https服务

  1. app.Run(iris.TLS("127.0.0.1:443","mycert.cert","mykey.key"))
  2. //当你的应用准备部署生产的时候。可以使用iris.AutoTLS方法。它通过https://letsencrypt.org免费提供的证书开启一个安全服务
  3. app.Run(iris.AutoTLS(":443", "example.com", "admin@example.com"))

任意iris.Runner

有时你想要监听一些特定的东西,并且这些东西不是net.Listener类型的,你能够通过iris.Raw方法做到

  1. app.Run(iris.Raw(&http.Server{Addr:"8080"}.ListenAndServe)

host配置

形如上面的监听方式都可以在最后接受一个func(*iris.Supervisor)的可变参数。通过函数传递用来为特定的host添加配置其

  1. app.run(iris.Addr(":8080"),func(h *iris.Supervisor){
  2. //当服务器关闭的时候触发回调函数
  3. h.RegisterOnShutdown(func(){
  4. printLn("server terminated")
  5. })
  6. })

你甚至可以在app.Run之前配置,但是不同的是,这个host配置器将会在所有的主机上执行

  1. app:=iris.New()
  2. app.ConfigureHost(func(h *iris.Supervisor){
  3. h.RegisterOnShutdown(func(){
  4. println("server terminated")
  5. })
  6. })
  7. app.Run(iris.Addr(":8080"))
  8. //当run方法运行之后,通过Application#Hosts 字段提供的所有hosts你得应用服务都可以访问。但是最常用的场景可能出现在,运行app.Run之前访问hosts。有2种方法来获得访问hosts的监管。
  9. 上面的一种是采用app.ConfigureHost方法来配置所有的程序的hosts。还有一种更加适合简单场景。用app.NewHost来创建一个新的host,然后用它的serve或者Listen函数。通过iris.Raw启动服务
  10. import net/http
  11. h:=app.NewHost(&http.Server{Addr:":8080"}
  12. h.RegisterOnShutdown(func(){
  13. println("server terminated")
  14. })
  15. app.Run(iris.Raw(h.ListenAndServe))

多个主机

你可以使用多个hosts来启动你的iris程序,iris.Router兼容net/http/Handler函数,因此我们可以理解为,它可以被适用于任何net/http服务器,然而,通过使用app.NewHost是一个更加简单的方法,它也会复制所有的hosts配置器,并在app.Shutdwon时关闭所有依附在特定web服务的主机host,app:=iris.New();app.Get(“/“,indexHandler)

```go import ( “github.com/kataras/iris/v12” “net/http” )

func main() { app := iris.Default() app.Handle(“GET”, “/ping”, func(context iris.Context) { context.JSON(iris.Map{“message”: “pong”}) }) //监听端口 go app.Run(iris.Addr(“:8080”)) app.NewHost(&http.Server{Addr: “:9090”}).ListenAndServe() } curl 127.0.0.1:8080/ping curl 127.0.0.1:9090/ping

  1. > > <a name="1efaf99d"></a>
  2. #### 优雅的关闭
  3. > 为了手动地管理app被中断时需要做的事情,我们需要通过WithoutInterruptHandler选项禁用默认地行为,然后注册一个新的中断处理器
  4. > ```go
  5. package main
  6. import (
  7. "context"
  8. "time"
  9. "github.com/kataras/iris/v12"
  10. )
  11. func main() {
  12. app := iris.New()
  13. // 注册新地中断器 程序终端地时候进行执行
  14. iris.RegisterOnInterrupt(func() {
  15. timeout := 5 * time.Second
  16. ctx, cancel := context.WithTimeout(context.Background(), timeout)
  17. defer cancel()
  18. // close all hosts
  19. app.Shutdown(ctx)
  20. })
  21. app.Get("/", func(ctx iris.Context) {
  22. ctx.HTML(" <h1>hi, I just exist in order to see if the server is closed</h1>")
  23. })
  24. //禁用默认地中断器
  25. app.Run(iris.Addr(":8080"), iris.WithoutInterruptHandler)
  26. }

带有TLS地自动公共域名

Iris提供了ngrok的集成。ngrok用于未开发者提供一个公共域名,便于你向你的同事展示工作进度等。

1.下载ngrok,并且配置环境变量

2.简单传递withTunneling选项到app.Run中,示例如下

  1. app.Run(iris.Addr(":8080"), iris.WithConfiguration(
  2. iris.Configuration{
  3. Tunneling: iris.TunnelingConfiguration{
  4. AuthToken: "my-ngrok-auth-client-token",
  5. Bin: "/bin/path/for/ngrok",
  6. Region: "eu",
  7. WebInterface: "127.0.0.1:4040",
  8. Tunnels: []iris.Tunnel{
  9. {
  10. Name: "MyApp",
  11. Addr: ":8080",
  12. },
  13. },
  14. },
  15. }))

app.Run的第二个参数

前面章节的app.Run方法传入第一个参数,第二个参数是可选的、可变长的,接受一个或者多个iris.Configurator。一个iris.Configuratorfunc(app *ris.Application)类型的函数。自定义的iris.Configurator能够改你的*iris.Application

每个核心的配置字段都有一个内建的iris.Configurator。例如iris.WithoutStartupLog,iris.WithCharset("UTF-8"),iris.WithOptimizationsiris.WithConfiguration(iris.Congiguration{...}) 函数.每个模块、都有各自的配置项和选项。

使用配置

唯一的配置结构体是iris.Configuration。所有的iris.Configuration字段的默认值都是最常用的。iris在app.Run运行之前不需要任何配置。但是你想要使用自定义的iris.Configurator。你可以把你得配置器传给app.Configure方法

```go package main

import ( “github.com/kataras/iris/v12” )

func main() { application := iris.Default() //根绝配置项配置 //configuration := iris.WithConfiguration(iris.Configuration{ // Charset: “UTF-8”, // DisableStartupLog: false, // EnableOptimizations: true, //}) //从YAML加载 //configuration := iris.WithConfiguration(iris.YAML(“iris.yml”)) //从TOML加载 //configuration := iris.WithConfiguration(iris.TOML(“./iris.tml”)) //application.Run(iris.Addr(“:8080”), configuration) //使用函数的方式传递 application.Run(iris.Addr(“:8080”), iris.WithoutInterruptHandler, iris.WithoutServerError(iris.ErrServerClosed), iris.WithoutBodyConsumptionOnUnmarshal, iris.WithoutAutoFireStatusCode, iris.WithOptimizations, iris.WithTimeFormat(“Mon, 01 Jan 2006 15:04:05 GMT”), ) //当你想要改变一些iris.Configuration的字段的时候这是一个很好的做法。 }

  1. > > <a name="fba346d3"></a>
  2. #### 自定义值
  3. > `iris.Configuration`包含一个名为`Other map[string]interface`的字段,它可以接受任何自定义的`key:value`选项,因此你可以依据需求使用这个字段来传递程序需要的指定的值。
  4. > ```go
  5. app.Run(iris.Addr(":8080"),
  6. iris.WithOtherValue("ServerName","serverName"),
  7. iris.WithOtherValue("ServerOwner","admin@example.com"),
  8. )

从Context中访问配置

在一个处理器中,通过下面的方式访问这些字段

  1. ctx.Application().ConfigurationReadOnly()