#java #openshift #activemq-artemis
#java #openshift #activemq-artemis
Вопрос:
У нас есть проект Openshift ( project1 ), в котором мы настраиваем брокер AMQ Artemis, используя изображение : amq- amq-broker-7-tech-preview / amq-broker-71-openshif . Будучи базовым образом, у нас нет такой конфигурации, как SSL или TLS. Для выполнения настройки, которую мы использовали в качестве примера: https://github.com/jboss-container-images/jboss-amq-7-broker-openshift-image/blob/amq71-dev/templates/amq-broker-71-basic.yaml
После развертывания образа на Openshift мы имеем следующее:
- брокер-amq-amqp (5672 / TCP 5672) Нет маршрута
- брокер-amq-jolokia (8161 / TCP 8161) https://broker-amq-jolokia-project1.192.168.99.105.nip.io
- broker-amq-mqtt ( 1883 / TCP 1883) Нет маршрута
- broker-amq-stomp ( 61613 / TCP 61613) Нет маршрута
- broker-amq-tcp ( 61616 / TCP 61616) Нет маршрута
Из другой службы Openshift в Java мы пытаемся подключиться к брокеру, но получаем следующую ошибку :
[org.apache.activemq.transport.failover.FailoverTransport] (ActiveMQ Task-1) Failed to connect to [tcp://broker-amq-amqp-project1.192.168.99.105.nip.io:61616?keepAlive=true] after: 230 attempt(s) with Connection refused (Connection refused), continuing to retry.
Код Java:
user = "example";
password = "example";
String address = "queue/example";
InitialContext context = new InitialContext();
queue = (Queue) context.lookup(address);
ConnectionFactory cf = (ConnectionFactory) context.lookup("ConnectionFactory");
try (Connection connection = cf.createConnection(user, password);) {
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
}
Файл свойств JNDI
java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=failover:(tcp://broker-amq-amqp-project1.192.168.99.105.nip.io:61616?keepAlive=true)?randomize=false
queue.queue/example=example/strings
Ответ №1:
Похоже, что вы пытаетесь подключиться к брокеру, используя маршрут OpenShift, когда для соответствующей службы не определен маршрут. Вы (или установщик) определили маршрут для Jolokia, но для брокера нет маршрута.
Здесь вы не получите полезного сообщения об ошибке, потому что любое имя хоста, заканчивающееся правильным доменом, будет подключено к маршрутизатору OpenShift. Однако маршрутизатор не будет знать, как обработать соединение без действительного маршрута, и, вероятно, просто вернет какой-то бессмысленный пакет ошибок клиенту JMS.
Если вы пытаетесь подключиться к брокеру из другого приложения в том же пространстве имен OpenShift, что и брокер, вам не нужно подключаться через маршрутизатор — просто используйте имя службы (предположительно broker-amq-tcp
) и порт службы явно в вашей настройке JMS.
Если вы подключаетесь к брокеру из другого приложения в другом пространстве имен OpenShift в том же кластере, вы можете настроить сетевую подсистему, чтобы разрешить прямые подключения к службе через пространства имен. К сожалению, это немного сложно настроить после установки OpenShift.
Если вы подключаетесь к брокеру из-за пределов пространства имен OpenShift и не можете напрямую использовать сервисы, вам придется подключаться по маршруту, и вы должны использовать зашифрованное соединение. Это не обязательно для безопасности — маршрутизатор будет считывать информацию SNI из заголовка SSL, чтобы определить, как направить запрос.
Итак, вам нужно будет создать службу для SSL-порта брокера, создать маршрут для этой службы, экспортировать сертификаты сервера из брокера, импортировать эти сертификаты в свой клиент и настроить клиент на использование URI SSL-соединения через маршрутизатор. Очевидно, что использовать сервис напрямую проще, если вы можете 😉
Все эти шаги настройки описаны в документации Red Hat по AMQ7 для OpenShift:
хотя я не могу отрицать, что в этом документе очень много информации, которую нужно просмотреть.
Комментарии:
1. Или, поскольку это касается Red Hat, обратитесь в техническую поддержку Red Hat. Я случайно знаю, что все эти ребята просто сидят сложа руки и ничего не делают. Извините, просто шучу 😉
2. мы пытаемся подключиться из того же проекта Openshift (из другой службы в том же проекте Openshift), и я предполагаю, что это то, что вы подразумеваете под тем же рабочим пространством. Как вы можете видеть в файле свойств jndi, мы пытаемся подключиться, используя имя службы, но по-прежнему получаем ошибку, указанную в вопросе
3.
jndi.properties
Я думаю, что у вас естьbroker-amq-amqp-project1.192.168.99.105.nip.io
. Это не имя службы, это имя хоста маршрута. Попробуйтеbroker-amq-amqp
. И, да, «project» — это имя, которое OpenShift использует для того, что все остальные называют пространством имен. Извините за это.4. Также — войдите в модуль, в котором вы запускаете свой клиент, и запустите
curl broker-amq-amqp:61616
. Вы не получите значимого ответа, потому что брокер не использует HTTP, но вы также не должны получать сообщение «нет маршрута к хосту» или «отказано в подключении».5. Мы пытались использовать
java.naming.provider.url=failover:(tcp://broker-amq-amqp?keepAlive=true)?randomize=false
, но теперь мы получаем ту же ошибку, но с сообщением :Failed to connect to [tcp://broker-amq-amqp?keepAlive=true] after: 10 attempt(s)with port out of range:-1, continuing to retry.
Ответ №2:
Дополнение и разъяснение к ответу Кевина Буна (что очень правильно).
Для того, чтобы брокер AMQ, работающий внутри модуля с именем «broker-amq-tcp», был доступен из других модулей в том же кластере:
- запустите брокер внутри контейнера по адресу 0.0.0.0. Это очень важно — localhost (loopback; 127.0.0.1) предотвратит попадание любых подключений извне модуля к брокеру;
- создайте службу (например, «broker-amq-tcp-service») для broker-amq-tcp, которая сопоставляет порт pod с портом контейнера 61616; например, 62626 (или любой другой);
- подключайтесь из других модулей, используя tcp: //broker-amq-tcp-service:62626.
Часть 0.0.0.0 стоила мне нескольких дней отладки 🙂