在单个服务器上托管多个rails服务+"api enabled"网站的体系结构

Oli*_*nce 6 rest web-services ruby-on-rails sinatra ruby-on-rails-3

我刚刚阅读了Paul Dix的着作"面向服务的设计与RoR",我想根据我刚刚学到的内容创建一个Rails 3 Web应用程序.

我认为我的基本架构是正确的,但是一个简单的问题就是阻止我:我应该如何在同一台服务器上托管多个REST服务?

这就是我现在看到的事情:

  • 基于Sinatra创建*服务应用程序(UserService,XYZFeatureService,...)(我猜),它提供REST端点来访问资源
  • 有一个前端Rails应用程序与控制器/视图/ ...消耗来自不同服务的数据.例如,最终用户可以访问它http://www.myapp.com.
  • 最后有一个独立的"API"应用程序来处理调用https://api.myapp.com/*https://www.myapp.com/api/*发布外部API,这些外部API将使用相同的服务,并在其上进行可能的身份验证,限制等.

这听起来像是一个好的开始吗?

就实现而言,从我在书中所读到的,我计划创建gems来处理rails app和服务之间的通信(我可能会抛出一些RabbitMQ但这是另一个故事).

但是,由于我只有一台物理服务器,我想知道如何让所有这些应用程序/服务一起生活?我的第一个猜测是在localhost上启动每个服务应用程序:xxxx其中xxxx是每个服务的不同非特权端口.我可以在rails应用程序中配置每个客户端gem以使用这些端口.

除此之外,我可能会运行Apache 2 + Passenger来为我的rails前端和API服务提供服务,使用像Rack :: URLMap(或虚拟主机,如果使用子域)来将请求定向到正确的应用程序.我是否应该在生产环境中使用Passenger来运行我的服务?

这是正确的方式吗?!它与我所阅读和学习的内容一致,并且如果需要也很容易分成几个物理服务器,但我想确定我没有遗漏一些东西.你会以不同的方式建造东西

非常感谢您的投入!

更新

我想要回答的主要问题是:

  • 所描述的体系结构是否适合使用外部API端点构建Web应用程序?
  • 在不同端口上的单个服务器上运行服务是否可以?

谢谢!

Oli*_*nce 1

所以这个问题已经有 3 年多了,我认为它可以从一个合理客观的答案中受益。

有趣的是,再次阅读这个问题,发现它最近被投票了,而简单的“高水平”答案就是:做你想做/需要做的事!

没有什么神奇的规则需要遵守,尽管我想这就是我当时正在寻找的东西。然而,有一些关键事项需要牢记:

  • 设计面向服务的架构意味着我们正在为扩展做准备。每个服务都应该独立运行,而不是依赖于与堆栈中的其他服务在同一台服务器上运行。不要耦合您的服务,它们需要保持独立

  • 然而,不要“过度准备”:花大量时间设计完美架构的诱惑很大,而您实际上需要做的是发布您的 v1!

  • 当您构建单独的服务时,不要使其变得比需要的更复杂:一个带有 REST(类似)端点的简单 Web 堆栈可能就足够了。RabbitMQ 和其他消息队列也很棒,但它们解决了您可能没有真正遇到的问题。

  • 就服务器而言,嗯...在理想的情况下,您希望每个服务都有一个服务器,全部位于一个数据中心,并在另一个物理上分离的数据中心中的第二组(或更多!)服务器上进行复制...这需要时间和金钱来设置和维护。如果您在一个大型组织中,这可能没问题,但如果是这种情况,您可能不需要阅读此答案。
    所以是的,你可以从小事做起!一台或两台服务器,或者一台带有虚拟化服务器的“大型服务器”......这一切都取决于您对管理事物或雇用系统管理员的信心。一台机器就足够了,并且可以毫不犹豫地在其上运行多个服务,只要它们都可以共享相同的系统和内存。
    今天,我可能会使用 nginx 根据主机名或端口将请求分派到正确的服务,并使用防火墙(例如 Shorewall)在不同端口上运行专用服务,以阻止这些端口上来自外部的请求。

就是这样……就像我说的,没有神奇的答案,但需要为每个需要解决的问题设计解决方案。在过去的三年里,我主要独自从事中型/大型项目,我学到的是,从简单开始是关键。