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