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

Running Multiple Lagom Application in a Single Process

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

我们能够 运行 通过入侵 Play class 在单个进程中 运行 多个基于 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 应用程序或任何其他在单个进程中启动多个服务的方式可能产生什么影响

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

play.allowGlobalApplication = false

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

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

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

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

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