Использование Akka Http для нескольких привязок

Использовать akka http для привязки к порту, а затем маршрутизировать входящие соединения достаточно просто, учитывая документация.

Один нерешенный вопрос заключается в том, как связать несколько портов для разных маршрутов. Если у меня есть несколько спецификаций:

val route1 : Flow[HttpRequest, HttpResponse,_] = ???
val interface1 : String = ???
val port1 : Int = ???

val route2 : Flow[HttpRequest, HttpResponse,_] = ???
val interface2 : String = ???
val port2 : Int = ???

Должны ли они быть связаны с одним HttpExt< /а>?

implicit val actorSystem : akka.actor.ActorSystem = ???

val httpExt = akka.http.scaladsl.Http()

httpExt.bindAndHandle(route1, interface1, port1)
httpExt.bindAndHandle(route2, interface2, port2)

Или следует использовать разные HttpExt для каждой привязки?

Http().bindAndHandle(route1, interface1, port1)
Http().bindAndHandle(route2, interface2, port2)

Если любой из них действителен, то есть ли какие-либо последствия для использования одного метода над другим?

Заранее благодарим Вас за отзыв и ответ.


person Ramón J Romero y Vigil    schedule 08.09.2016    source источник
comment
Это ответит на ваш вопрос: Http() eq Http()   -  person Viktor Klang    schedule 11.09.2016
comment
@viktorklang Это добавляет ясности в вопрос. Но если вызов Http () имеет какие-либо побочные эффекты, например. на ActorSystem, то равенство объектов не полностью объясняет поведение.   -  person Ramón J Romero y Vigil    schedule 11.09.2016
comment
В моем ответе ниже у меня есть ссылка на код, который показывает, что второй вызов Http() не имеет побочных эффектов.   -  person Tim    schedule 12.09.2016


Ответы (1)


Небольшое исследование исходного кода показывает следующее.

Здесь мы видим, что происходит при Http() вызове. Объект Http расширяет черту ExtensionId[HttpExt], которая отвечает за регистрацию дополнительных функций в системе акторов. Это это super вызов. Как мы видим, он использует ссылку this, которая в нашем случае является ссылкой на объект (важно). Здесь — это то, что на самом деле происходит, когда мы вызываем Http(). Первое, что делает этот код, — проверяет, зарегистрировано ли уже расширение. Помните, что ext в нашем случае является объектом, поэтому любые последующие вызовы после первого ничего не сделают.

Это означает, что любой из ваших подходов будет работать одинаково, но imo с использованием одного httpExt менее запутанно, учитывая, как на самом деле работает базовая система.

person Tim    schedule 11.09.2016