Используя клиентский биллер 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 ответа

Решение

Если вы хотите запустить этот простой прокси в контейнере 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 команда:

-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 на ваш целевой хост.

Вам нужен файл server.properties и поместите вашу конфигурацию в файл:

HOST=host:8888

Теперь заставьте docker писать свою конфигурацию при каждом запуске с помощью bash-скрипта docker-entrypoint. Добавьте этот скрипт и определите переменные среды внутри вашего 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 "$@"

Запустите Docker с вашей конфигурацией и командой "proxy":

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

Вы также можете сделать ссылку, когда вы не уверены, IP адрес вашего контейнера контейнера:

$ docker run -e "HOST=mylinkhost" -e "PORT=port" --link myservercontainer:mylinkhost image proxy
Другие вопросы по тегам