我有两个Akka HTTP服务器,它们都运行在码头上和单独的端口上
我已经使用sbt本机包管理器创建了dockerfile。
这是projectA的码头组成。
akkahttpservice:
image: projectA-service:0.0.1
container_name: projectA-service-container
ports:
- "8085:8085"这是projectB的码头组成。
akkahttpservice:
image: projectB-service:0.0.1
container_name: projectB-service-container
ports:
- "8083:8083"这是docker ps的输出
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71a58c080e7c projectA-service:0.0.1 "/opt/docker/bin/not…" 5 minutes ago Up 5 minutes 8084/tcp, 0.0.0.0:8085->8085/tcp, :::8085->8085/tcp projectA-service-container
c08f5700ce3d projectB-service:0.0.1 "/opt/docker/bin/int…" 22 hours ago Up 28 minutes 0.0.0.0:8083->8083/tcp, :::8083->8083/tcp projectB-service-container我想使用akka客户端在projectB中调用projectA路由
这是projectB的路线
def getAdminToken: server.Route =
path("get-admin-token") {
post {
entity(as[JsValue]) {
json =>
val userName = json.asJsObject.fields("userName").convertTo[String]
val userPwd = json.asJsObject.fields("userPwd").convertTo[String]
complete("got the details")
}
}
}下面是projectA的代码,我想在其中调用projectB路由
def addUserInKeyCloak: server.Route = {
path("add-user-in-keycloak") {
post {
entity(as[NotaryUser]) {
notaryUser =>
val adminUrl = "http://0.0.0.0:8083/get-admin-token"
val jsonStr =
s"""{
| "userName":"admin",
| "userPwd":"admin"
| }""".stripMargin
val request = HttpRequest(HttpMethods.POST, adminUrl, Nil, HttpEntity(ContentTypes.`application/json`, jsonStr.stripMargin.parseJson.toString()))
val responseFuture = Http(context.system).singleRequest(request)
complete("result from future")
}
}
}
}我试过了
val adminUrl = "http://0.0.0.0:8083/get-admin-token"有例外
Tcp command [Connect(0.0.0.0:8083,None,List(),Some(10 seconds),true)] failed because of java.net.ConnectException: Connection refused (akka.stream.StreamTcpException: Tcp command [Connect(0.0.0.0:8083,None,List(),Some(10 seconds),true)] failed because of java.net.ConnectException: Connection refused)我试着用不同的URL
val adminUrl = "http://projectB-service-container:8083/get-admin-token"然后我又得到了另一个例外
Tcp command [Connect(docker-interpret-auth-container:8083,None,List(),Some(10 seconds),true)] failed because of java.net.UnknownHostException: projectB-service-container (akka.stream.StreamTcpException: Tcp command [Connect(projectB-service-container:8083,None,List(),Some(10 seconds),true)] failed because of java.net.UnknownHostException: projectB-service-container)代码在不使用docker的情况下运行良好,所有上述异常都是在使用docker -组合在docker上运行时发生的。
上面的代码在码头上运行时也可以很好地处理邮递员和卷曲。
发布于 2022-11-09 14:36:13
尝试与主机0.0.0.0一起使用路由只会尝试向同一个容器内的端口发出请求,这不是您要寻找的。您的错误是Connection refused,因为应用程序在不同的容器中运行,因此它们无法使用主机0.0.0.0相互访问。为了使用Docker访问另一个正在运行的容器,请将服务的名称作为主机引用,如下面的docker-compose.yml中所示
version: "3.3"
services:
akkahttpservicea:
image: projectA-service:0.0.1
container_name: projectA-service-container
ports:
- "8085:8085"
akkahttpserviceb:
image: projectB-service:0.0.1
container_name: projectB-service-container
ports:
- "8083:8083"例如,在projectA中,使用
val adminUrl = "http://akkahttpserviceb:8083/get-admin-token"https://stackoverflow.com/questions/74374635
复制相似问题