首页 文章

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

提问于
浏览
2

我们在我们的 Cloud 设置上构建了多个基于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 回答

  • 2

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

    play.allowGlobalApplication = false
    

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

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

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

    • 他们可以通过消耗太多内存,创建太多线程等来相互崩溃 .

    • 如果有人被黑客入侵,他们都会受到损害 .

    • 您可以't configure them individually using system properties, since they' ll同时拾取相同的系统属性 . 你很难做到,但API没有很好的记录 .

    • 可能有一些其他库试图读取的其他配置文件最终会在它们之间共享 - 除非你给每个应用程序自己的类加载器,这完全可行(Lagom devmode这样做) .

    • 我假设您正在使用Java,您需要注意在每个应用程序中启用哪些模块,方法是明确禁用您使用Guice提供模块的方法,这取决于类路径上的模块 . 这在Scala中不是问题,因为模块通过将它们显式混合到应用程序蛋糕中来启用 .

    可能还有其他一些事情要注意,但我现在想不到它们 .

相关问题