使用Finagle的clientbuilder,如何在外部设置主机?

Using Finagle's clientbuilder, how do I set the host externally?

我正在构建一个指向另一台服务器的简单代理。一切正常,但我需要找到一种方法来最有可能使用 Docker 或某种配置文件在外部设置 ClientBuilder 中的主机。这是我拥有的:

import java.net.InetSocketAddress
import com.twitter.finagle.Service
import com.twitter.finagle.builder.{ServerBuilder, ClientBuilder}
import com.twitter.finagle.http.{Request, Http}
import com.twitter.util.Future
import org.jboss.netty.handler.codec.http._

object Proxy extends App {

  val client: Service[HttpRequest, HttpResponse] = {
  ClientBuilder()
    .codec(Http())
    .hosts("localhost:8888")
    .hostConnectionLimit(1)
    .build()
  }

  val server = {
    ServerBuilder()
      .codec(Http())
      .bindTo(new InetSocketAddress(8080))
      .name("TROGDOR")
      .build(client)
  }
}

如果您知道这样做的方法或对此有任何想法,请告诉我!

您需要一个文件 server.properties 并将您的配置放入文件中:

HOST=host:8888

现在 docker 使用 docker-入口点 bash 脚本在每次启动时编写配置。添加此脚本并在 Docker 文件中定义环境变量:

$ ENV HOST=myhost
$ ENV PORT=myport
$ ADD docker-entrypoint.sh /docker-entrypoint.sh
$ ENTRYPOINT ["/docker-entrypoint.sh"]
$ CMD ["proxy"]

写出你的docker-entrypoint.sh:

#!/bin/bash -x

set -o errexit

cat > server.properties << EOF
HOST=${HOST}:${PORT}
EOF

if [ "" = 'proxy' ]; then
  launch server
fi

exec "$@"

使用您的配置和命令 "proxy":

启动 Docker
$ docker run -e "HOST=host" -e "PORT=port" image proxy

你也可以在不确定你的服务器容器ip地址时进行链接:

$ docker run -e "HOST=mylinkhost" -e "PORT=port" --link myservercontainer:mylinkhost image proxy

如果你想要 运行 这个简单的代理在一个 docker 容器中并动态管理目标主机 ip,你可以尝试通过环境变量传递目标主机 ip 并像这样更改你的代码

import java.net.InetSocketAddress
import com.twitter.finagle.Service
import com.twitter.finagle.builder.{ServerBuilder, ClientBuilder}
import com.twitter.finagle.http.{Request, Http}
import com.twitter.util.Future
import org.jboss.netty.handler.codec.http._

object Proxy extends App {
  val target_host = sys.env.get("TARGET_HOST")

  val client: Service[HttpRequest, HttpResponse] = {
  ClientBuilder()
    .codec(Http())
    .hosts(target_host.getOrElse("127.0.0.1:8888"))
    .hostConnectionLimit(1)
    .build()
  }

  val server = {
    ServerBuilder()
      .codec(Http())
      .bindTo(new InetSocketAddress(8080))
      .name("TROGDOR")
      .build(client)
  }
}

这将使您的代码读取系统环境变量TARGET_HOST。完成此部分后,您可以尝试通过将以下参数添加到 docker run 命令来启动 docker 容器:

-e "TARGET_HOST=127.0.0.1:8090"

例如docker run -e "TARGET_HOST=127.0.0.1:8090" <docker image> <docker command>

请注意,您可以将 127.0.0.1:8090 更改为您的目标主机。