Lagom在生产模式下分别部署了hello-world示例服务

时间:2019-10-31 00:38:57

标签: scala production service-locator akka-cluster lagom

我想分别部署Lagom hello-world的所有组件。我能够使用以下application.conf来部署引用本地部署的Kafka和Cassandra安装的第一个服务:

lagom.cluster.bootstrap.enabled=false
akka.cluster.seed-nodes = [
  "akka.tcp://application@192.168.0.34:2552"
]

akka {
  discovery {
    method = aggregate
    aggregate {
      discovery-methods = ["akka-dns", "config"]
    }
    config {
      services {
        cas_native {
          endpoints = [
            {
              host = "localhost"
              port = 9042
            }
          ]
        },
        kafka_native {
          endpoints = [
            {
              host = "localhost"
              port = 9092
            }
          ]
        }
      }
    }
  }
}

我相信我通过在build.sbt中添加依赖项来配置Akka服务定位器:

val akkaServiceDiscovery = "com.lightbend.lagom" %% "lagom-scaladsl-akka-discovery-service-locator" % LagomVersion.current
lazy val `hello-impl` = (project in file("hello-impl-impl"))
  .enablePlugins(LagomScala)
  .settings(
    libraryDependencies ++= Seq(
      lagomScaladslPersistenceCassandra,
      lagomScaladslKafkaBroker,
      lagomScaladslTestKit,
      lagomScaladslCluster,
      macwire,
      scalaTest,
      akkaServiceDiscovery
    )
  )
  .settings(lagomForkedTestSettings)
  .settings(
    Seq(
      lagomCassandraEnabled in ThisBuild := false,
      lagomUnmanagedServices in ThisBuild := Map("cas_native" -> "tcp://localhost:9042"),
      lagomKafkaEnabled in ThisBuild := false,
      lagomKafkaAddress in ThisBuild := "localhost:9092"
    )
  )
  .dependsOn(`hello-api`)

并使用

实例化应用程序
  override def load(context: LagomApplicationContext): LagomApplication =
    new HelloWorldApplication(context) with AkkaDiscoveryComponents

但是,我无法找到部署第二个服务的方式,以使第二个服务将自己注册到由第一个服务启动的服务定位器。当我在dev模式下单独运行服务时,我已经实现了这种行为。

我在服务定位器和服务本身上都遇到了Address already in use: bind异常,例如:

2019-10-30T21:53:34.652Z [info] akka.management.internal.HealthChecksImpl [sourceThread=main, akkaTimestamp=21:53:34.650UTC, akkaSource=HealthChecksImpl(akka://application), sourceActorSystem=application] - Loading liveness checks List()
2019-10-30T21:53:34.881Z [info] akka.management.scaladsl.AkkaManagement [sourceThread=main, akkaSource=AkkaManagement(akka://application), sourceActorSystem=application, akkaTimestamp=21:53:34.881UTC] - Binding Akka Management (HTTP) endpoint to: 192.168.0.34:8558
2019-10-30T21:53:35.003Z [info] akka.management.scaladsl.AkkaManagement [sourceThread=main, akkaTimestamp=21:53:35.002UTC, akkaSource=AkkaManagement(akka://application), sourceActorSystem=application] - Including HTTP management routes for HealthCheckRoutes
2019-10-30T21:53:37.017Z [error] akka.io.TcpListener [sourceThread=application-akka.actor.default-dispatcher-3, akkaSource=akka://application/system/IO-TCP/selectors/$a/0, sourceActorSystem=application, akkaTimestamp=21:53:37.009UTC] - Bind failed for TCP channel on endpoint [/192.168.0.34:8558]
java.net.BindException: Address already in use: bind
2019-10-30T21:53:37.998Z [info] play.api.Play [] - Application started (Prod) (no global state)
2019-10-30T21:53:38.044Z [error] akka.io.TcpListener [sourceThread=application-akka.actor.default-dispatcher-3, akkaTimestamp=21:53:38.043UTC, akkaSource=akka://application/system/IO-TCP/selectors/$a/1, sourceActorSystem=application] - Bind failed for TCP channel on endpoint [/0.0.0.0:9000]
java.net.BindException: Address already in use: bind

那么,实现我想要的行为的配置(第二个服务的application.conf)将是什么?

顺便说一句,我执行以下步骤来运行服务

  1. 使用sbt dist构建完整的hello world项目
  2. 通过第一步生成的脚本运行第一个服务,例如./hello-impl-1.0-SNAPSHOT/bin/hello-impl -Dplay.http.secret.key=changemeasdf
  3. 尝试像第一个服务一样运行第二个服务./hello-stream-impl-1.0-SNAPSHOT/bin/hello-stream-impl -Dplay.http.secret.key=changemeasdf

0 个答案:

没有答案