Лагом разворачивает сервисы примера hello-world отдельно в производственном режиме - PullRequest
0 голосов
/ 31 октября 2019

Я бы хотел развернуть все компоненты Привет-мира Lagom, настроенные отдельно. Мне удалось развернуть первую службу, ссылающуюся на локально развернутые установки Kafka и Cassandra со следующими application.conf:

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
            }
          ]
        }
      }
    }
  }
}

Я считаю, что настроил локатор службы Akka, добавив зависимость в build.sbt:

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
* 1018Итак, какова будет конфигурация (application.conf для второго сервиса) для достижения желаемого поведения?

Кстати, я выполняю следующие шаги для запуска служб

  1. Создайте полный проект hello world с помощью sbt dist
  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
...