1

我有一个用 Go 编写的小型 Web 应用程序。它为更大的系统创建了一个基础,我希望它是可扩展的,可以添加/删除组件,而无需以任何方式修改此基础。

目前的结构是:

       App
         Modules
             Core
                 ... Core Files Here ...
       app.go
   main.go

app.go 将包含一个路由方法,它应该接受一个 Web 请求,并根据请求路径知道哪个模块负责处理请求。每个模块/组件都有其在控制器上。

每个组件都有自己的包名,所以我认为这是不可能的,因为 go 强制显式导入。

例如,我可以添加一个名为 say blog 的新模块/组件,例如:

       App
         Modules
             Core
                 ... Core Files Here ...
                 controller.go
             Blog
                 ... Blog Files Here ...
                 controller.go
       app.go
   main.go
4

1 回答 1

3

有几种方法可以实现您的目标。由于 Go 目前不支持动态加载的库,因此您可能需要在添加/删除任何组件时重新编译您的应用程序。因此,最简单的方法是yourapp/core包含以下内容的包:

  • 具有充当主应用程序Application的方法的类型ServeHTTP
  • Component所有组件都必须实现的接口。您可能希望在其中包含一个BaseUrl() string和一个ServeHTTP方法。
  • 您的类型的一种Register方法Application,可用于向您的应用程序添加新组件。

然后可以在单独的包(例如yourapp/blog)中实现您的组件,它们可能取决于您的yourapp/core包。

唯一仍然需要“用户可编辑”的是main.go文件,它可能如下所示:

func main() {
    app := core.NewApplication()
    app.Register(blog.Blog{
        Title: "My Personal Blog",
    })
    app.Register(...)
    app.Run()
}

另一种方法可能是为您的组件定义一个 RPC 接口(可能包括像RegisterComponentUnregisterComponenta这样的函数GetGlobalConfig)。

然后,您可以在单独的进程中运行这些组件,其优点是您可以动态启动/停止/重新加载这些组件,并且它们不会破坏您的主应用程序。如果您想改用这种方法,请查看net/rpc包,甚至可能是httputil.NewSingleHostReverseProxy 。

于 2013-08-09T19:37:07.657 回答