在生产环境运行Lagom

Lagom可以设置为与大多数生产环境协同工作,从物理服务器上的基本手动部署到OpenShift, KubernetesMesosphere DC/OS等服务编排平台。Lagom中的核心API独立于任何特定的部署平台。在Lagom确实需要与环境接口的地方,它提供了可扩展的插件点,允许您为生产配置服务,而无需更改服务实现代码。
以下信息概述了适用于任何环境的生产注意事项。如果要在OpenShift集群中部署服务,还可以参考《将Lightbend应用程序部署到OpenShift》指南。
生产环境注意事项可以总结为设置和调整以下部分或全部:

  • 制作工件(ZIP包、docker镜像等)
  • 服务位置(其他lagom服务、外部服务、数据库等)
  • Akka 集群组成
  • 暴露生命周期数据(准备度、活跃度)

    生产环境注意事项

    生产环境决定了打包服务、管理Akka集群形成和提供服务位置的方法,包括Cassandra 和 Kafka的方法:

  • Lagom利用开源[sbt native packager](https://www.scala-sbt.org/sbt-native-packager/?_ga=2.114361607.1487347529.1649669871-1627781359.1617093761)插件来生成软件包:

    • 默认情况下,sbt生成包含已编译服务、其所有依赖项和启动脚本的独立“通用”zip存档。它们没有特殊的基础设施要求,可以解压并在任何支持Java的地方运行。然而,这不包括用于流程监控和从崩溃中恢复的内置设施,因此对于一个有弹性的生产环境,您需要提供另一种方式。
    • 您还可以使用sbt native packager构建和发布Docker镜像,这些镜像可以与Kubernetes、DC/OS或任何其他与Docker兼容的生产环境一起使用。
    • 否则,您可以将sbt native packager配置为生成其他归档格式Windows(MSI)安装程序DebianRPM格式的Linux软件包等等。
  • 在运行时,服务需要定位其他服务的地址以与它们通信。这需要您配置ServiceLocator的实现,Lagom使用ServiceLocator按名称查找服务的地址。您选择的生产环境可能会提供一种可以与Lagom一起使用的服务发现机制。
    • 对于简单的部署,Lagom包含一个内置的服务定位器,该定位器使用服务配置中指定的硬编码地址(如下所述)。
    • 当使用进程不在静态IP上运行的动态部署时,您可以使用Akka发现服务定位器,该定位器可以与Kubernetes或DC/OS的服务发现功能或Akka服务发现支持的任何其他环境集成。
    • 另外,您可以自己实现该接口,以与您选择的服务注册中心(如 Consul, ZooKeeper, etcd)集成,或者从开源示例实现(如[lagom-service-locator-consul](https://github.com/jboner/lagom-service-locator-consul)[ lagom-service-locator-zookeeper](https://github.com/jboner/lagom-service-locator-zookeeper))开始。
  • 需要Akka集群(包括任何使用Lagom持久性发布-订阅API的集群)的Lagom服务必须具有在启动时形成集群或加入现有集群的策略。
    • 如果您不使用服务编排平台,并且可以在部署某些节点之前确定它们的地址,那么可以通过在服务配置中列出种子节点的地址来手动配置Akka群集。
    • 如果不指定种子节点的静态列表,Lagom将启用Akka集群引导扩展,以便与其他服务发现基础设施集成。使用Akka集群引导需要设置服务发现方法(例如Kubernetes的服务发现)。有关更多信息,请参阅Lagom集群文档。
  • 上面介绍的Akka集群引导功能需要启用Akka管理HTTP。这是一个由多个功能共享的Akka HTTP服务器,默认情况下运行在端口8558上(该端口是可配置的)。Lagom将在需要的功能启用时自动启动Akka管理HTTP。另请参见Lagom集群文档。
    • Akka管理HTTP还支持Akka提供的健康检查。健康检查是一种可插拔机制,在该机制中,库提供者和用户可以注册逻辑,以确定服务是否处于活动状态和/或就绪状态。默认情况下,Lagom将在Lagom服务需要集群的任何时候启用Akka集群成员资格健康检查。默认情况下,Akka健康检查注册ready/alive/路由,并实现Kubernetes描述的就绪性和有效性语义。
  • Lagom的Cassandra模块已准备就绪,可以使用服务定位器定位您的Cassandra集群。这意味着Lagom将Cassandra视为它可能需要定位的任何其他外部服务。如果您的生产环境需要,您还可以选择绕过服务定位器,直接在服务配置中提供Cassandra连接点,如下一节所述。
  • 类似地,Lagom的Kafka集成在默认情况下使用服务定位器来查找Kafka客户端的引导服务器。这也可以被覆盖,以在服务配置中指定代理列表。有关更多信息,请参阅Lagom Kafka客户端文档。

    使用静态的Cassandra连接点

    如果您希望为您的服务使用动态服务位置,但需要静态定位Cassandra,请修改application.conf。您需要禁用Lagom的ConfigSessionProvider,并使用akka-persistence-cassandra中提供的一个,它使用contact-points中列出的端点列表。application.conf除非被覆盖,否则配置设置将应用于所有环境(开发和生产)。有关在开发模式下设置Cassandra的更多信息,请参阅开发人员模式设置,以在开发模式下覆盖Cassandra设置。
    要设置静态Cassandracontact-points并禁用ConfigSessionProvider,请修改application.conf的以下部分: ```scala cassandra.default {

    list the contact points here

    contact-points = [“10.0.1.71”, “23.51.143.11”]

    override Lagom’s ServiceLocator-based ConfigSessionProvider

    session-provider = akka.persistence.cassandra.ConfigSessionProvider }

cassandra-journal { contact-points = ${cassandra.default.contact-points} session-provider = ${cassandra.default.session-provider} }

cassandra-snapshot-store { contact-points = ${cassandra.default.contact-points} session-provider = ${cassandra.default.session-provider} }

lagom.persistence.read-side.cassandra { contact-points = ${cassandra.default.contact-points} session-provider = ${cassandra.default.session-provider} }

  1. <a name="FBPWb"></a>
  2. # 服务和Cassandra使用静态值配置
  3. 您可以使用静态配置将Lagom系统部署到静态位置。使用静态服务位置时,还可以硬编码Cassandra位置。要实现这一点,请遵循以下步骤:
  4. 1. 在`application.conf`中指定服务位置。
  5. 1. 在Guice模块中绑定`ConfigurationServiceLocator`。
  6. 1. 可以选择在`application.conf`中添加Cassandra位置。
  7. `[ConfigurationServiceLocator](https://www.lagomframework.com/documentation/1.6.x/scala/api/com/lightbend/lagom/scaladsl/client/ConfigurationServiceLocator.html)`从Lagom的`application.conf`中读取服务定位器配置。下面是一个为两个Lagom服务指定静态位置的示例:
  8. ```scala
  9. lagom.services {
  10. serviceA = "http://10.1.2.3:8080"
  11. serviceB = "http://10.1.2.4:8080"
  12. }

要使Lagom使用ConfigurationServiceLocator,需要在生产模式下将[ConfigurationServiceLocatorComponents](https://www.lagomframework.com/documentation/1.6.x/scala/api/com/lightbend/lagom/scaladsl/client/ConfigurationServiceLocatorComponents.html)特质混合到应用程序中,如下例所示。在开发环境中使用LagomDevModeComponents特质。

  1. import com.lightbend.lagom.scaladsl.devmode.LagomDevModeComponents
  2. import com.lightbend.lagom.scaladsl.server._
  3. import com.lightbend.lagom.scaladsl.client.ConfigurationServiceLocatorComponents
  4. class HelloApplicationLoader extends LagomApplicationLoader {
  5. override def load(context: LagomApplicationContext) =
  6. new HelloApplication(context) with ConfigurationServiceLocatorComponents
  7. override def loadDevMode(context: LagomApplicationContext) =
  8. new HelloApplication(context) with LagomDevModeComponents
  9. }

要在使用静态服务定位器时对Cassandra连接点进行硬编码,请在application.conf中添加以下内容:

  1. lagom.services {
  2. cas_native = "tcp://10.1.2.3:9042"
  3. }