在单个进程中运行多个Lagom应用程序

时间:2018-03-20 07:59:23

标签: java playframework-2.0 lagom

我们在我们的云设置上构建了多个可独立部署的基于Lagom的微服务,但是在一些onpremise设置上,在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")
}

我的问题:这是正确的做法,对拉格姆应用程序或在单一进程中提升多项服务的任何其他方式可能产生的影响

1 个答案:

答案 0 :(得分:2)

你不应该需要那个黑客,你应该只能将它添加到你的每个应用程序中application.conf

play.allowGlobalApplication = false

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

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

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

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

可能还有其他一些事情需要注意,但我现在无法想到它们。