如何为许多应用程序构建Phoenix伞框架

Ste*_*len 10 elixir phoenix-framework

我正在玩一个使用phx 1.3和伞形应用程序的新产品套件的架构.

我有一个基于Phoenix的企业级WebRTC软电话(许多按键,一个显示器,多个输入和输出音频设备选择等).我用Phoenix开发了一个Slack克隆消息传递应用程序原型.这两个应用程序相当大我需要将手机与聊天应用程序集成到一个前端,可能只是手机,只是聊天客户端,两者都是.我需要向聊天客户端添加许多新功能,我还希望该体系结构支持使用同一客户端在呼叫服务器上设置其他设置(基于用户)以及可能的大量管理级别设置.我可能也会在未来添加其他应用程序,如操作员面板,日志查看器,列表继续...客户端JS非常简单,没有前端框架.我渲染模板服务器端并通过频道推出html.

我想建立这个可插拔的.相同的端点和数据库.一个常见的UX.

我认为伞中有两个常见的应用程序,一个用于Phoenix端点和一对控制器,另一个用于主要的Repo和一些模式.我试图弄清楚为每个应用程序使用两个或更多其他应用程序会有多困难.一个用于上下文和模式,另一个用于控制器,视图,模板和早午餐资源.可能是第三方API的另一个.

为了实现这一点,我需要为每个应用程序中的路由器进行动态调度.处理每个应用程序中包含的迁移的方法,可能还有更多我尚未想到的.

有人试过吗?是否有任何类似结构的开源项目?

Mik*_*hot 11

我日常工作的elixir应用程序是一个包含13个应用程序的保护伞.

根部是Phoenix端点和顶级路由器,它将请求转发给其他应用程序中定义的路由器.

这意味着应用程序不会分为多个层(Web /业务/数据),而是分为垂直域切片.

随着应用程序在过去12个月中显着增长,这已经很好地扩展了.

我遇到的最大问题是Phoenix路由器在转发到其他路由器时剥离了请求的主要路径,因此我们创建了一个mountPlug路由器一起使用的宏,它保持请求路径不变:

defmodule MyApp.Router do
  @moduledoc """
  Top level routing to each of the sub-systems
  """

  use Plug.Router

  plug :match
  plug :dispatch

  mount "/events/*_", Events.Router
  mount "/report/*_", Report.Router
  mount "/stats/*_",  Stats.Router
  mount "/auth/*_",   Auth.Router
end
Run Code Online (Sandbox Code Playgroud)

和装载:

defmacro mount(path, router, opts \\ []) do
  quote do
    @opts unquote(router).init(unquote(opts))
    match unquote(path), do: unquote(router).call(var!(conn), @opts)
  end
end
Run Code Online (Sandbox Code Playgroud)

为简单起见,我们在单个应用程序中管理整个数据库的迁移,但是在每个应用程序中分别声明了Ecto Schemas.

是一个展示一些概念的项目.

  • 谢谢!我喜欢你的'mount'方法.我过去曾遇到过这个问题.没想到你的做法.但是,我尝试使用这个`Application.get_env(:app,:routers)|> Enum.map(&(forward"/",&1))`进行快速加速.我把它放在我的主路由器的末尾,它似乎工作.你能想到这种方法有什么问题吗? (2认同)