Подключение к wildcard ip 0.0.0.0 работает в контейнере, но не на хосте - PullRequest
1 голос
/ 06 мая 2019

У меня странное поведение на моем проекте Акка.Подводя итог: у меня есть две Actorsystems, работающие на моей хост-системе, и я хочу соединяться друг с другом для отправки сообщений.Теперь проблема в том, что когда я использую следующую конфигурацию akka на моем клиенте:

akka {
  actor {
    provider = remote
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 0
    }
 }
}

и следующее на моей серверной системе актеров:

akka {
  loglevel = "INFO"
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 5150
    }
    log-sent-messages = on
    log-received-messages = on
  }
}

Я не могу подключиться к моей серверной системе актеров с помощьюactorselection выглядит следующим образом:

val selection = context.actorSelection("akka.tcp://ServerSystem@0.0.0.0:5150/user/receiver")

Я ожидаю, что он будет работать с подстановочным IP-адресом, поскольку это означает, что он пытался подключиться к каждому IPv4, который имеет хост-система.Я получаю следующую ошибку:

[WARN] [05/06/2019 08:57:03.738] [New I/O boss #3] [NettyTransport(akka://ClientSystem)] Remote connection to [null] failed with java.net.ConnectException: Connection refused: no further information: /0.0.0.0:5150
[WARN] [05/06/2019 08:57:03.738] [ClientSystem-akka.remote.default-remote-dispatcher-13] [akka.tcp://ClientSystem@127.0.0.1:8346/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FServerSystem%400.0.0.0%3A5150-0] Association with remote system [akka.tcp://ServerSystem@0.0.0.0:5150] has failed, address is now gated for [5000] ms. Reason: [Association failed with [akka.tcp://ServerSystem@0.0.0.0:5150]] Caused by: [java.net.ConnectException: Connection refused: no further information: /0.0.0.0:5150]

С другой стороны, все работает нормально, если я изменяю 127.0.0.1 в конфигурации сервера на 0.0.0.0, когда я запускаю его внутри контейнера докера и подключаюсь к немуиспользуя адрес 0.0.0.0 в выборе актера на моем клиенте, который работает на хосте.Так что здесь, кажется, работает связывание и подключение к подстановочному IP.

У кого-нибудь есть объяснение этому поведению?

1 Ответ

1 голос
/ 06 мая 2019

Я думаю, это объясняется этим superuser.com ответом .

127.0.0.1 является частной петлевой сетью и может использоваться только для подключения к другим процессам на том же компьютере.Поэтому, если вы привязываете приемный сокет к этому адресу, вы не сможете получать соединения с других компьютеров.

0.0.0.0 - это псевдоадрес, который имеет различные значения в зависимости от контекста.Для сервера это означает, что сокет доступен с любого входящего IP-адреса в любой сети.Для клиента это, вероятно, означает IP-адрес по умолчанию текущего компьютера, хотя это зависит от того, как библиотека решит с ним обращаться.

...