Service Fabric - Как зарезервировать или защитить мой порт в жестком коде
Пейзаж:
У нас есть Приложение с двумя микро сервисами.
Micro Service A используется для предоставления приложения за пределами кластера (наш веб-сервер)
Micro Service B - это наша бизнес-функциональность.
У нас есть F5 перед Micro Service A для балансировки нагрузки по жестко закодированным портам (onPrem).
- Внутри Micro Service A мы жестко программируем определенные порты для конечной точки http в манифесте.
Проблема: мы являемся свидетелями того, что иногда Micro Service B (бизнес-функциональность) может украсть порт, который Micro Service A трудно использовать. Тогда он никогда не запустит сервис правильно.
Мы также видим, что SF, кажется, использует доступные порты последовательно. Так что если мы жестко закодировали Micro Service A, чтобы использовать порт 001, а Micro Service B был случайным. Когда А перезагружался, иногда Б получал 001.
Возможные решения:
- Мы могли бы жестко закодировать все микро сервисы - не нравится.
- Мы могли бы зарезервировать более высокий диапазон для этих жестко закодированных портов. Например, если Service Fabric использует 1000 портов, мы можем оставить 501-1000 для Сервиса A и позволить Сервису B захватить 001-499. Это только задерживает проблемы, пока у вас не будет более 500 экземпляров. - Не большой поклонник этого тоже.
- Жесткий код порта, чтобы быть портом, который находится за пределами диапазона кластера? Например, если мы использовали 20001-20500 в качестве диапазона ApplicationEndpoints при настройке кластера, если мы жестко закодировали MicroService A для пользователя 21000, похоже, он работает? Я не уверен, какие непредвиденные последствия это может создать?
Пожалуйста, дайте мне отличный вариант 4:)
Спасибо,
Greg
1 ответ
Когда у вас есть этот масштабный уровень, лучший подход - использовать типы узлов для обработки внешнего доступа отдельно от внутреннего.
Вы должны создать FrontEnd NodeType для размещения своих API или веб-сервисов, которые предоставляют жестко закодированные порты (т. Е. 80, 443), а затем создать BackEnd NodeType для размещения ваших служб со случайными портами. При таком подходе вам не нужно беспокоиться о портах, потому что службы будут работать на разных узлах в соответствии с их ролями и только FE будут доступны из-за пределов кластера.
Если вам по-прежнему необходимо обрабатывать это внутри одних и тех же узлов, вы можете использовать конфигурацию типа узла "Начальный порт приложения" и "Конечный порт приложения", которая будет обрабатывать список портов, которым будет назначена ваша служба при запуске. Таким образом, вы должны жестко закодировать свои порты вне этих списков и позволить сервисам BE использовать список из портов приложений, как вы предложили в третьем варианте.
Убедитесь, что жестко закодированные порты настроены на вашем балансировщике нагрузки, иначе они не будут доступны извне кластера.