进阶 www.iris-go.com 2026-10-20 02:39:14 · 15 阅读

第23章 多应用实例

### 多应用实例 `github.com/kataras/iris/v12/apps` 包提供全局作用域的控制,用于管理同一 Program 下所有已注册的 Iris 应用。 #### 示例应用 下文将介绍各项功能的用例。 Get 函数 `Get` 函数根据“appName”返回一个 Iris 应用。如果未找到名称完全匹配的应用,则返回 `nil`。 如果缺少“appName”参数,则返回最后一个注册的应用。若尚未注册任何应用,则会创建一个名为“Default”的临时应用并返回该应用。“Default”应用也可在同一 Program 的多个 Go 包中通用。 同一程序下的应用会自动注册。 若要检查是否至少注册了一个应用,请使用 `GetAll() []*iris.Application` 函数。 ```go func Get(appName ...string) *iris.Application ``` 特性 无需全局参数和循环导入,即可在 Program 的所有 Go 包中全局访问 Iris 应用。 ```go /* myserver/api/user.go */ package userapi import ( "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/apps" ) func init() { app := apps.Get() app.Get("/", list) } func list(ctx iris.Context) { // [...] ctx.WriteString("list users") } ``` ```go /* myserver/main.go */ package main import ( _ "myserver/api/user" "github.com/kataras/iris/v12/apps" ) func main() { app := apps.Get() app.Listen(":80") } ``` 空的 `_` 导入语句会调用 `userapi.init` 函数(在 `main` 之前执行),该函数会初始化一个 Iris 应用(如果尚未存在),并将其注册到内部全局存储中,以供跨包使用。 按名称引用一个或多个 Iris 应用 `Application.SetName` 方法为该 Iris 应用设置唯一名称。它会为当前应用的 Logger 设置一个子前缀。其 `Application.String` 方法返回给定的名称。它返回自身。 ```go func (app *Application) SetName(appName string) *Application ``` ```go /* myserver/main.go */ package main import "github.com/kataras/iris/v12" func main() { app := iris.New().SetName("app.company.com") } ``` go/* myserver/pkg/something.go */ package pkg import "github.com/kataras/iris/v12/apps" func DoSomething() { app := apps.Get("app.company.com") }1
2
3
4
5
6
7
8
9
main 函数创建了一个 Iris Application 并以 "app.company.com" 名称注册。此后,同一程序中的所有包都可以通过名称获取这个 Application 实例。

Switch 函数

Switch 函数返回一个新的 Application,其唯一作用是通过"提供的 cases"将请求路由到匹配的 Application。阅读下文了解可用的 SwitchProvider,以及如何创建和使用自定义的 SwitchProvider。 cases 按注册顺序依次过滤。 gofunc Switch(provider SwitchProvider, options ...SwitchOption) *iris.Application1
示例代码: goswitcher := Switch(Hosts{ "mydomain.com": app, "test.mydomain.com": testSubdomainApp, "otherdomain.com": "appName", }) switcher.Listen(":80")1
2
3
4
5
6
注意,这不是负载均衡器的替代品。filters 按注册顺序执行,由匹配到的 Application 处理请求,仅此而已。 返回的 Switch Iris Application 可以注册路由,当所有已注册的 Application 都不匹配提供的 filters 时,这些路由将负责处理传入请求。 返回的 Switch Iris Application 还可以注册自定义错误码处理器,例如在没有匹配到任何 Application 时注入 404 响应。它也可以通过 WrapRouter 方法进行包装,这对日志记录和统计非常有用。

SwitchProvider 接口

这是 Switch 函数的第一个必填参数。 SwitchProvider 应返回一个或多个 SwitchCase 值。 gotype SwitchProvider interface { GetSwitchCases() []SwitchCase }1
2
3
SwitchCase 结构体包含 Filter 和目标 Iris Application。 gotype SwitchCase struct { Filter func(ctx iris.Context) bool App *iris.Application }1
2
3
4

SwitchOptions 结构体

这是 Switch 函数的最后一个可变参数(可选)。 gotype SwitchOptions struct { // RequestModifiers holds functions to run // if and only if at least one Filter passed. // They are used to modify the request object // of the matched Application, e.g. modify the host. // // See `SetHost` option too. RequestModifiers []func(*http.Request) }1
2
3
4
5
6
7
8
9
SetHost 函数是一个 SwitchOption,它会强制为匹配的应用程序的请求对象设置 Host 字段。在与 Hosts SwitchProvider 配合使用时非常有用。典型场景:为了 SEO,将 www 重定向到根域名的同时,让两者的内部请求保持相同的 Host,这样根应用的处理器无论实际请求的 Host 是什么,都始终以单一主机名工作。 ```go func SetHost(hostField string) SwitchOption ``` 代码示例: ```go cases := Hosts{ {"^(www.)?mydomain.com$", rootApp}, } switcher := Switch(cases, SetHost("mydomain.com")) ``` 使用 Join 切片将不同类型的 SwitchProvider 包裹起来,以便同时传入多个 provider。 代码示例: ```go Switch(Join{ SwitchCase{ Filter: customFilter, App: myapp, }, Hosts{ {"^test.*$", myapp}, }, }) ```

评论 (0)