【问题标题】:Running Multiple Lagom Application in a Single Process在单个进程中运行多个 Lagom 应用程序
【发布时间】:2018-03-20 07:59:23
【问题描述】:

我们基于 Lagom 构建了多个可独立部署的微服务,在我们的云设置上我们这样部署,但在某些本地设置中,它变成并发布在 diff 中运行多个 Lagom 服务。过程。

我们能够通过侵入 Play 类在单个进程中运行多个基于 Lagom 的应用程序,如果另一个应用程序通过侵入 Play scala 启动,则该类会停止一个应用程序:

val globalApp = app.globalApplicationEnabled

if (globalApp && _currentApp != null && _currentApp.globalApplicationEnabled) {
  logger.info("Stopping current application")
  stop(_currentApp)
}

我将其更新为:

val globalApp = app.globalApplicationEnabled

if (globalApp && _currentApp != null && _currentApp.globalApplicationEnabled) {
  logger.info("Stopping current application")
}

我的问题:这样做是否正确,对 lagom 应用程序或任何其他方式在单个进程中启动多个服务可能产生什么影响

【问题讨论】:

  • 可以分享之前的部分吗?如何启动多个 lagom 应用程序?

标签: java playframework-2.0 lagom


【解决方案1】:

你不应该需要那个 hack,你应该能够将它添加到你的每个应用程序application.conf

play.allowGlobalApplication = false

这将关闭 Play 的全局应用程序支持,这意味着在上述 if 条件下,globalApp 将为 false,因此当您启动第二个应用程序时它不会停止当前应用程序。

如果您在执行此操作时遇到任何问题,例如,如果您遇到异常说某事正在尝试访问全局应用程序,那么您可能在 Lagom 和/或 Play 中发现了一个错误,您可以向他们的问题跟踪器报告.

在一个进程中运行多个 Lagom 的后果是:

  • 它们可能会因消耗过多内存、创建过多线程等而相互崩溃。
  • 如果一个人被黑客入侵,他们都会被入侵。
  • 您不能使用系统属性单独配置它们,因为它们都将使用相同的系统属性。启动它们时需要小心,以确保它们获得自己的配置文件。这并不难做到,但 API 的文档记录不是很好。
  • 可能有一些其他库尝试读取的其他配置文件最终会在它们之间共享 - 除非您为每个应用程序提供自己的类加载器,这是完全可行的(Lagom devmode 会这样做)。
  • 我假设您使用的是 Scala,但如果您使用的是 Java,则需要通过显式禁用您不需要的模块来注意每个应用程序中启用了哪些模块,或者提供非常独立的类加载器每个应用程序,因为 Play 使用 Guice 提供模块的方法是基于类路径上的模块。这在 Scala 中不是问题,因为模块是通过将它们显式混合到您的应用程序蛋糕中来启用的。

可能还有其他一些事情需要注意,但我现在想不起来。

【讨论】:

  • 谢谢,我正在使用 java,每个应用程序都使用单独的 ClassLoader。无论如何,我都知道上述后果,非常感谢。我也看到我在没有意识到配置方面犯了一个多么愚蠢的错误
猜你喜欢
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多