我想分别部署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)将是什么?
顺便说一句,我执行以下步骤来运行服务
sbt dist
构建完整的hello world项目./hello-impl-1.0-SNAPSHOT/bin/hello-impl -Dplay.http.secret.key=changemeasdf
./hello-stream-impl-1.0-SNAPSHOT/bin/hello-stream-impl -Dplay.http.secret.key=changemeasdf