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

时间:2015-07-10 21:37:38

标签: proxy host finagle

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

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

如果您知道某种方法或有任何想法,请告诉我们!

2 个答案:

答案 0 :(得分:0)

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

HOST=host:8888

现在让docker用每个启动时用docker-entrypoint bash脚本编写你的配置。添加此脚本并在Dockerfile中定义环境变量:

$ 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 [ "$1" = 'proxy' ]; then
  launch server
fi

exec "$@"

使用您的配置和命令&#34; proxy&#34;:

启动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

答案 1 :(得分:0)

如果你想在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更改为目标主机。