Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Обратный прокси-сервер, встроенный в Azure Service Fabric, помогает микрослужбам, работающим в кластере Service Fabric, обнаруживать и взаимодействовать с другими службами, имеющими конечные точки HTTP.
Модель связи микрослужб
Микрослужбы в Service Fabric выполняются в подмножестве узлов в кластере и могут переноситься между узлами по различным причинам. В результате конечные точки микрослужб могут динамически изменяться. Чтобы обнаружить и взаимодействовать с другими службами в кластере, микрослужба должна выполнить следующие действия:
- Определите местоположение сервиса с помощью службы именования.
- Подключитесь к службе.
- Объедините предыдущие шаги в цикле, который реализует политики разрешения служб и повторных попыток, применяемые к сбоям подключения.
Дополнительные сведения см. в разделе "Подключение и взаимодействие с службами".
Взаимодействие с помощью обратного прокси-сервера
Обратный прокси-сервер — это служба, которая выполняется на каждом узле и обрабатывает разрешение конечных точек, автоматическую повторную попытку и другие ошибки подключения от имени клиентских служб. Обратный прокси-сервер можно настроить для применения различных политик, так как он обрабатывает запросы от клиентских служб. Использование обратного прокси-сервера позволяет клиентской службе использовать любые клиентские библиотеки связи HTTP и не требует специального разрешения и логики повторных попыток в службе.
Обратный прокси-сервер предоставляет одну или несколько конечных точек на локальном узле, которые клиентские службы используют для отправки запросов другим сервисам.
Примечание.
Поддерживаемые платформы
Обратный прокси-сервер в Service Fabric в настоящее время поддерживает следующие платформы
- Кластер Windows: Windows 8 и более поздней версии или Windows Server 2012 и более поздних версий
- Кластер Linux: обратный прокси-сервер в настоящее время недоступен для кластеров Linux
Достижение микрослужб за пределами кластера
Модель внешней связи по умолчанию для микрослужб — это модель согласия, из-за которой доступ к каждой службе невозможно получить непосредственно из внешних клиентов. Azure Load Balancer, который является сетевой границей между микрослужбами и внешними клиентами, выполняет преобразование сетевых адресов и пересылает внешние запросы во внутренние конечные точки IP:port. Чтобы сделать конечную точку микрослужбы доступной непосредственно внешним клиентам, необходимо сначала настроить Load Balancer для пересылки трафика на каждый порт, используемый службой в кластере. Однако большинство микрослужб, особенно микрослужб с отслеживанием состояния, не живут на всех узлах кластера. Микрослужбы могут перемещаться между узлами при отработки отказа. В таких случаях Load Balancer не может эффективно определить расположение целевого узла реплик, к которому он должен пересылать трафик.
Достижение микрослужб через обратный прокси-сервер извне кластера
Вместо настройки порта отдельной службы в Load Balancer можно настроить только порт обратного прокси-сервера в Load Balancer. Эта конфигурация позволяет клиентам за пределами кластера подключаться к службам внутри кластера с помощью обратного прокси-сервера без дополнительной настройки.
Предупреждение
При настройке порта обратного прокси-сервера в Load Balancer все микрослужбы в кластере, предоставляющие конечную точку HTTP, доступны за пределами кластера. Это означает, что микрослужбы, предназначенные для внутренних, могут быть обнаружены определенным злоумышленником. Это потенциально представляет серьезные уязвимости, которые могут быть использованы; Например:
- Злоумышленник может запустить атаку типа "отказ в обслуживании", неоднократно вызывая внутреннюю службу, которая не имеет достаточно защищенной области атаки.
- Злоумышленник может доставлять искаженные пакеты во внутренний сервис, что приводит к непреднамеренному поведению.
- Служба, предназначенная для внутреннего использования, может возвращать частную или конфиденциальную информацию, не предназначенную для предоставления служб за пределами кластера, таким образом, предоставляя эту конфиденциальную информацию злоумышленнику.
Прежде чем сделать обратный прокси-порт общедоступным, убедитесь, что вы полностью понимаете и устраняете потенциальные последствия безопасности для кластера и приложений, работающих на нем.
Формат URI для адресации служб с помощью обратного прокси-сервера
Обратный прокси-сервер использует определенный универсальный формат идентификатора ресурса (URI) для идентификации секции службы, в которую следует перенаправлять входящий запрос:
http(s)://<Cluster FQDN | internal IP>:Port/<ServiceInstanceName>/<Suffix path>?PartitionKey=<key>&PartitionKind=<partitionkind>&ListenerName=<listenerName>&TargetReplicaSelector=<targetReplicaSelector>&Timeout=<timeout_in_seconds>
http(s): Обратный прокси-сервер можно настроить для приема трафика HTTP или HTTPS. Для перенаправления HTTPS обратитесь к безопасной службе с обратным прокси-сервером после установки обратного прокси-сервера для прослушивания HTTPS.
Полное доменное имя кластера (FQDN) | внутренний IP-адрес: Для внешних клиентов можно настроить обратный прокси-сервер таким образом, чтобы он был доступен через домен кластера, например mycluster.eastus.cloudapp.azure.com. По умолчанию обратный прокси-сервер выполняется на каждом узле. Для внутреннего трафика обратный прокси-сервер можно получить на локальном узле или на любом внутреннем IP-адресе узла, например 10.0.0.1.
Порт: Это порт, например 19081, который был указан для обратного прокси-сервера.
ServiceInstanceName: Это полное имя развернутой инстанции службы, к которой вы хотите получить доступ без схемы fabric:/. Например, чтобы получить доступ к фабрике:/myapp/myservice/ службе, вы используете myapp/myservice.
Имя экземпляра службы чувствительно к регистру. Использование другого регистра для имени экземпляра службы в URL-адресе приводит к тому, что запросы завершаются неудачей с ошибкой 404 (не найдено).
Суффикс путь: Это фактический путь URL-адреса, например myapi/values/add/3, для службы, к которой требуется подключиться.
PartitionKey: Для секционированных служб это вычисляемый ключ секции, к которой вы хотите обратиться. Обратите внимание, что это не идентификатор раздела GUID. Этот параметр не требуется для служб, использующих схему одноэлементного разделения.
PartitionKind: Это схема секционирования службы. Это может быть "Int64Range" или "Named". Этот параметр не требуется для служб, использующих схему одноэлементного раздела.
ListenerName Конечные точки из службы имеют форму {"конечные точки":{"Листенер1":"Endpoint1","Листенер2":"Endpoint2" ...}}. Когда служба предоставляет несколько конечных точек, это определяет конечную точку, в которую должен пересылаться запрос клиента. Это может быть опущено, если служба имеет только один прослушиватель.
TargetReplicaSelector Это указывает, как следует выбрать целевую реплику или экземпляр.
- Если целевая служба находится в состоянии, targetReplicaSelector может быть одним из следующих вариантов: PrimaryReplica, RandomSecondaryReplica или RandomReplica. Если этот параметр не указан, значение по умолчанию — PrimaryReplica.
- Если целевая служба не сохраняет состояние, обратный прокси-сервер выбирает случайный экземпляр раздела службы для пересылки запроса.
Времени ожидания: Это указывает время ожидания HTTP-запроса, созданного обратным прокси-сервером службы от имени клиентского запроса. Значение по умолчанию — 120 секунд. Этот параметр является необязательным.
Пример использования
Например, давайте рассмотрим структуру:/MyApp/MyService , которая открывает прослушиватель HTTP по следующему URL-адресу:
http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/
Ниже приведены ресурсы для службы:
/index.html/api/users/<userId>
Если служба использует схему одиночного секционирования, параметры строки запроса PartitionKey и PartitionKind не требуются, и к службе можно обращаться через шлюз следующим образом:
- Внешне:
http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService - Внутренне:
http://localhost:19081/MyApp/MyService
Если служба использует схему секционирования Uniform Int64, параметры строки запроса PartitionKey и PartitionKind должны использоваться для доступа к секции службы:
- Внешне:
http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range - Внутренне:
http://localhost:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range
Чтобы получить доступ к ресурсам, предоставляемым службой, просто поместите путь к ресурсу после имени службы в URL-адресе:
- Внешне:
http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService/index.html?PartitionKey=3&PartitionKind=Int64Range - Внутренне:
http://localhost:19081/MyApp/MyService/api/users/6?PartitionKey=3&PartitionKind=Int64Range
Затем шлюз перенаправит эти запросы на URL-адрес службы:
http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/index.htmlhttp://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/api/users/6
Специальная обработка служб совместного использования портов
Обратный прокси-сервер Service Fabric пытается заново определить адрес службы и повторить запрос, если служба недоступна. Как правило, если служба недоступна, экземпляр службы или реплика перемещается на другой узел как часть его обычного жизненного цикла. В этом случае обратный прокси-сервер может получить сообщение об ошибке сетевого подключения, указывающее, что конечная точка больше не открыта в исходно разрешенном адресе.
Однако реплики или экземпляры служб могут совместно использовать процесс узла, а также предоставлять общий доступ к порту при размещении веб-сервера на основе http.sys, включая:
В этой ситуации, скорее всего, веб-сервер доступен в узле и отвечает на запросы, но разрешенный экземпляр службы или реплика больше недоступен на узле. В этом случае шлюз получит ответ HTTP 404 с веб-сервера. Таким образом, ответ HTTP 404 может иметь два разных значения:
- Случай 1. Адрес службы правильный, но ресурс, запрошенный пользователем, не существует.
- Случай 2. Адрес службы неверный, а ресурс, запрошенный пользователем, может существовать на другом узле.
Первым случаем является обычная ошибка HTTP 404, которая считается ошибкой пользователя. Однако во втором случае пользователь запросил ресурс, который существует. Обратному прокси-серверу не удалось её обнаружить, поскольку сама служба перемещена. Обратный прокси-сервер должен снова устранить адрес и повторить запрос.
Таким образом обратный прокси-сервер должен различать эти два случая. Чтобы сделать это различие, необходимо указание от сервера.
По умолчанию обратный прокси-сервер предполагает вариант #2 и пытается разрешить и вновь отправить запрос.
Чтобы указать вариант #1 обратному прокси-серверу, служба должна вернуть следующий заголовок ответа HTTP:
X-ServiceFabric : ResourceNotFound
Этот заголовок ответа HTTP указывает обычную ситуацию HTTP 404, в которой запрошенный ресурс не существует, и обратный прокси-сервер не попытается снова устранить адрес службы.
Специальная обработка для служб, работающих в контейнерах
Для служб, работающих в контейнерах, можно использовать переменную среды для Fabric_NodeIPOrFQDN создания URL-адреса обратного прокси-сервера , как показано в следующем коде:
var fqdn = Environment.GetEnvironmentVariable("Fabric_NodeIPOrFQDN");
var serviceUrl = $"http://{fqdn}:19081/DockerSFApp/UserApiContainer";
Для локального кластера Fabric_NodeIPOrFQDN по умолчанию задано значение localhost. Запустите локальный кластер с параметром -UseMachineName, чтобы убедиться, что контейнеры могут подключаться к обратному прокси, который работает на узле. Дополнительные сведения см. в разделе "Настройка среды разработчика для отладки контейнеров".
Для служб Service Fabric, выполняемых в контейнерах Docker Compose, требуется специальная конфигурация раздела ports в docker-compose.yml с http: или https:. Дополнительные сведения см. в статье о поддержке развертывания Docker Compose в Azure Service Fabric.
Дальнейшие действия
- Установка и настройка обратного прокси-сервера в кластере
- Настройте пересылку на защищенную HTTPS-службу с обратным прокси-сервером
- Диагностика событий обратного прокси-сервера
- Пример обмена данными по протоколу HTTP между службами представлен в примере проекта на сайте GitHub.
- Удаленные вызовы процедур с помощью удаленного взаимодействия служб Reliable Services
- Веб-API, использующий OWIN в Надежных сервисах
- Обмен данными WCF с помощью надежных служб