我们基于 Lagom 构建了多个可独立部署的微服务,在我们的云设置上我们这样部署,但在某些本地设置上,它会以不同的方式运行多个 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 应用程序或在单个进程中启动多个服务的任何其他方式可能产生什么影响
最佳答案
您不应该需要这种技巧,您应该能够将其添加到每个应用程序application.conf
:
play.allowGlobalApplication = false
这将关闭 Play 的全局应用程序支持,这意味着在上面的 if 条件中,globalApp
将为 false,因此当您启动第二个应用程序时,它不会停止当前应用程序。
如果您在执行此操作时遇到任何问题,例如,如果您收到异常,表明某些内容正在尝试访问全局应用程序,那么您可能在 Lagom 和/或 Play 中发现了错误,您可以将其报告给他们的问题跟踪器.
在一个进程中运行多个 Lagom 的后果是:
- 它们可能会因消耗过多内存、创建过多线程等而导致彼此崩溃。
- 如果其中一方受到黑客的攻击,他们都会受到攻击。
- 您无法使用系统属性单独配置它们,因为它们都会获取相同的系统属性。启动它们时需要小心,以确保它们获得自己的配置文件。这并不难做到,但 API 的文档还不够完善。
- 可能还有一些其他库尝试读取的其他配置文件,这些文件最终将在它们之间共享 - 除非您为每个应用程序提供自己的类加载器,这是完全可行的(Lagom devmode 就是这样做的)。
- 我假设您使用的是 Scala,但如果您使用的是 Java,则需要通过显式禁用不需要的模块来小心每个应用程序中启用的模块,或者为每个应用程序提供非常单独的类加载器每个应用程序,因为 Play 使用 Guice 提供模块的方法是基于类路径上的模块。这在 Scala 中不是问题,因为模块是通过显式地将它们混合到应用程序蛋糕中来启用的。
可能还有其他一些事情需要注意,但我现在想不起来。
关于java - 在单个进程中运行多个 Lagom 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49378990/