在 Iris 里面,提供了一种方式可以让我们同时运行多个应用:
这里说的应用只是一个 Iris 框架实例,这个实例可以有完全不同的路由定义、中间件等。
package main
import (
"log"
"net/http"
"time"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/middleware/recover"
"golang.org/x/sync/errgroup"
)
var g errgroup.Group
func startApp1() error {
app := iris.New().SetName("app1")
app.Use(recover.New())
app.Get("/", func(ctx iris.Context) {
ctx.JSON(iris.Map{
"code": iris.StatusOK,
"message": "Welcome server 1",
})
})
app.Build()
return app.Listen(":8080")
}
func startApp2() error {
app := iris.New().SetName("app2")
app.Use(recover.New())
app.Get("/", func(ctx iris.Context) {
ctx.JSON(iris.Map{
"code": iris.StatusOK,
"message": "Welcome server 2",
})
})
return app.Listen(":8081")
}
func main() {
g.Go(startApp1)
g.Go(startApp2)
if err := g.Wait(); err != nil {
log.Fatal(err)
}
}
在这个例子中,我们监听了两个端口 8080
、8081
,我们可以通过这两个端口来访问这两个应用。
这个就有点类似于 nginx 了,同一个端口可以同时监听多个域名的请求:
package main
import (
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/apps"
"github.com/kataras/iris/v12/middleware/recover"
)
func main() {
app3 := iris.New().SetName("app3")
app3.Use(recover.New())
app3.Get("/", func(ctx iris.Context) {
ctx.WriteString("ha3")
})
app4 := iris.New().SetName("app4")
app4.Use(recover.New())
app4.Get("/", func(ctx iris.Context) {
ctx.WriteString("ha4")
})
switcher := apps.Switch(apps.Hosts{
apps.Host{
Pattern: "app3.local",
Target: app3,
},
apps.Host{
Pattern: "app4.local",
Target: app4,
},
})
switcher.Listen(":9010")
}
在这个例子中,监听了 9010
端口,但是通过 app3.local
和 app4.local
去访问的时候,结果是不一样的。