Шаблон шлюза / прокси API для микросервисов, развернутых с помощью Azure Service Fabric

После просмотра видеороликов конференции BUILD для Azure Service Fabric мне осталось только представить, как это может хорошо вписаться в нашу текущую архитектуру, основанную на микросервисах. Однако есть одна вещь, которую я не совсем уверен, как я буду ее решать - шлюз / прокси API.

Рассмотрим менее чем тривиальную архитектуру микросервисов, в которой у вас есть N служб, работающих в Azure Service Fabric, предоставляющих конечные точки REST. Во многих ситуациях вы хотите упаковать эти фрагментированные конечные точки API в API с одной записью для использования потребителями, чтобы они не подключались напрямую к экземплярам фабрики служб. Решение Azure Service Fabric кажется настолько полным во всех смыслах, что я как бы задаюсь вопросом, не упустил ли я что-то очевидное, когда я не вижу способа тривиально решить эту проблему в рамках возможностей, упомянутых во время обсуждений BUILD.

Такие службы, как Vulcan, стремятся решить эту проблему, позволяя службам регистрировать пути, которые они хотят направить к ним, в etcd. Я предполагаю, что одним из способов решения этой проблемы может быть создание отдельной веб-службы с отслеживанием состояния, в которой другие службы могут регистрироваться, предоставляя имя службы и пути, которые им нужно направить к ним. Затем веб-служба с отслеживанием состояния может направлять трафик к правильному экземпляру в зависимости от своего состояния. Однако это не кажется полностью идеальным с такими вещами, как удаление маршрутов при удалении приложений и, как правило, синхронизация состояния со службами, развернутыми в кластере. Кто-нибудь думал об этом или есть идеи, как решить эту проблему в Azure Service Fabric?


person Trond Nordheim    schedule 01.05.2015    source источник


Ответы (8)


Необходимая для этого услуга регистрации / обнаружения службы на самом деле уже существует. Существует системная служба с отслеживанием состояния, называемая службой именования, которая по сути является регистратором экземпляров службы и конечных точек, которые они прослушивают. Поэтому, когда вы запускаете службу - либо без отслеживания состояния, либо с отслеживанием состояния - и открываете для нее какой-либо прослушиватель, адрес регистрируется в службе имен.

Теперь вам нужно заполнить «шлюз», с которым взаимодействуют пользователи. Это не обязательно должно быть с отслеживанием состояния, потому что служба именования управляет частью с отслеживанием состояния. Но вам нужно будет придумать схему адресации, которая будет работать для вас, а затем она будет просто перенаправлять запросы в нужное место. В основном примерно так:

  1. Получите запрос.
  2. Используйте NS, чтобы найти службу, которая может принять запрос.
  3. Отправьте ему запрос, а ответ - пользователю.
  4. Если служба больше не существует, 404.

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

person Vaclav Turecek    schedule 02.05.2015
comment
Это интересный подход. Кажется, я не могу найти какой-либо конкретной документации по Службе именования, однако у вас есть дополнительная информация об этом? Я вижу, что он зарегистрирован как fabric:/System/NamingService, но я не могу найти никаких интерфейсов или чего-либо подобного, что я мог бы использовать, например, для использования ServiceProxy.Create<TServiceInterface> для связи с ним. Я предполагаю, что ServiceProxy внутренне общается с ним, так что я предполагаю, что есть способ :) - person Trond Nordheim; 02.05.2015
comment
На самом деле я немного покопался и нашел в FabricClient кое-что, что было бы полезно при перечислении узлов / приложений / развертываний в кластере. Я должен иметь возможность использовать это, чтобы выяснить, какие службы хотят, чтобы трафик направлялся к ним (через схему именования служб или что-то еще), и реализовать некоторую простую логику для проверки. Спасибо за указатели! - person Trond Nordheim; 02.05.2015
comment
Вы поняли, FabricClient - это ваш шлюз для связи с системой. Используйте свойство ServiceManager для разрешения службы. ServiceProxy - это встроенный механизм для простого взаимодействия между службами (в основном предоставляет строго типизированный RPC между службами). И да, он внутренне использует FabricClient для разрешения службы! - person Vaclav Turecek; 02.05.2015
comment
Было бы неплохо иметь конкретный пример использования FabricClient для этой цели. Он содержит очень много функций, и шаблон использования, который можно здесь применить, совсем не очевиден. - person Sander; 03.11.2016
comment
@VaclavTurecek Есть ли какой-нибудь пример подхода, который вы описали? - person Roman Marusyk; 11.01.2017

Для этой цели мы также реализовали сервис HTTP-шлюза. Чтобы убедиться, что у нас может быть один HTTP-шлюз для любого внутреннего протокола, мы реализовали шлюз для внутренних служб на основе HTTP (таких как ASP.NET WebAPI) с помощью промежуточного программного обеспечения ASP.NET 5. Он направляет запросы, например, из / service на внутренний адрес Service Fabric, например fabric: / myapp / myservice, используя ServicePartitionClient и некоторую логику повторных попыток из CommunicationClientFactoryBase.

Мы открыли исходный код этого промежуточного программного обеспечения, и вы можете найти его здесь: https://github.com/c3-ls/ServiceFabric-HttpServiceGateway

В вики проекта также есть дополнительная документация.

person Christian Weiss    schedule 04.01.2016
comment
возникли проблемы с настройкой этого на https. вы, ребята, пробовали запустить это на https? - person Alex Gordon; 31.10.2017

Эта функция встроена для конечных точек http, начиная с версии 5.0 Service Fabric. Документация доступна по адресу https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reverseproxy/

person dtriana    schedule 26.07.2016
comment
В большинстве случаев достаточно общения через обратный прокси, если вы понимаете последствия его использования. Любая служба в вашем кластере, которая предоставляет конечную точку HTTP, будет доступна для внешних клиентов. Скорее всего, ваша команда DevOps сочтет это неприемлемым. - person FunksMaName; 30.07.2017

Мы использовали проект с открытым исходным кодом под названием Traefik с поразительным успехом. Вокруг него есть оболочка Azure Service Fabri c - по сути, это GoLang exe. который развертывается в кластере как управляемый исполняемый файл.

Он поддерживает автоматические выключатели, взвешенный круговой алгоритм LB, маршрутизацию путей и версий заголовков (это замечательно для размещения нескольких версий API), список можно продолжить. И у него есть удобный портал для просмотра статистики и статистики здоровья.

Реальная сила в этом заключается в том, как вы его настраиваете. Это делается через сам сервис в ServiceManifest.xml. Это позволяет вам развертывать новые сервисы и иметь возможность немедленно перенаправить их - нет необходимости обновлять таблицу маршрутизации и т. Д.

Пример

<StatelessServiceType ServiceTypeName="WebServiceType">
  <Extensions>
      <Extension Name="Traefik">
        <Labels xmlns="http://schemas.microsoft.com/2015/03/fabact-no-schema">
          <Label Key="traefik.frontend.rule.example">PathPrefixStrip: /a/path/to/service</Label>
          <Label Key="traefik.enable">true</Label>
          <Label Key="traefik.frontend.passHostHeader">true</Label>
        </Labels>
      </Extension>
  </Extensions>
</StatelessServiceType>

Настоятельно рекомендуется!

person KnowHoper    schedule 23.03.2018
comment
Я также использую Traefik с Service Fabric. Совершенно без шва! - person pixelTitan; 01.07.2019

Azure Service Fabric упрощает реализацию стандартной архитектуры для этого сценария: служба шлюза в качестве внешнего интерфейса для клиентов, к которым они могут подключаться, и все N серверных служб, взаимодействующих с интерфейсным шлюзом. В составе Service Fabric доступно несколько стеков API связи, которые упрощают обмен данными между клиентами и службами и внутри самих служб. Стеки API связи, предоставляемые Service Fabric, скрывают подробности обнаружения, подключения и повторных попыток подключения, чтобы вы могли сосредоточиться на фактическом обмене информацией. При использовании API связи Service Fabric службы не должны реализовывать механизм регистрации своих имен и конечных точек в конкретной службе маршрутизации, за исключением обычных шагов в рамках создания самой службы. Коммуникационные API принимают URI службы и ключ раздела, автоматически разрешают и подключаются к нужному экземпляру службы. Эта статья обеспечивает хорошую отправную точку для принятия решения относительно того, какие коммуникационные API-интерфейсы лучше всего подходят для вашего конкретного случая, в зависимости от того, используете ли вы Reliable Actors или Reliable Services, или такие протоколы, как HTTP или WCF, или от выбора языка программирования. в которых написаны службы. В конце статьи вы найдете ссылки на более подробные статьи и руководства по различным коммуникационным API. Учебное пособие по обмену данными в службах веб-API см. На странице это.

person Kunal Deep Singh - MSFT    schedule 02.05.2015
comment
Я знаю концепцию прослушивателя связи для служб Service Fabric, чтобы осуществлять фактическую связь со службами; то, что я представлял, было чем-то вроде Service1, желающего обслуживать /foo/*, Service2, желающего обслуживать /bar/*; затем настроить общий прокси-сервер API перед api.mydomain.com проксированием соответствующих URI в соответствующие службы на сервере. Кажется, что для организации такого типа маршрутизации требуется некоторая работа, и мой вопрос был больше в том, что Service Fabric предоставит это, или мне нужно управлять своим собственным? - person Trond Nordheim; 02.05.2015
comment
Кроме того, для дальнейшего уточнения; то, что я хотел бы от такого прокси-сервера API, - это позволить ему обнаруживать, какие службы хотят, какие пути во время выполнения (либо каким-то образом перечисляя службы в кластере Service Fabric, извлекая метаданные для каждой службы, либо позволяя самим службам сообщать прокси, какие пути они хотят направить к себе). Необходимость поддерживать некоторые жестко запрограммированные маршруты, когда потенциально иметь сотни сервисов, кажется в лучшем случае обременительной. - person Trond Nordheim; 02.05.2015

Мы используем SF с шаблоном шлюза и около 13 сервисов за шлюзом. Мы используем встроенную службу DNS, которую предоставляет SF, см. https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-dnsservice, это позволяет внутренней службе обслуживать вызовы с известными (внутренними для SF) DNS-именами, включая шлюз к внутренним службам. Есть несколько хорошо известных основных шлюзов asp.net (Ocelot, ProxyKit), но мы сделали собственные. У нас есть внешний балансировщик нагрузки для маршрутизации к нескольким экземплярам шлюза в SF.

person Thomas P Morgan    schedule 20.02.2019

Когда служба запускается, она регистрирует свою конечную точку в службе именования фабрики. Затем с помощью клиентских API Fabric вы можете запросить у Fabric зарегистрированные конечные точки, связанные с зарегистрированным именем службы.

Итак, да, как вы описали свой случай, у вас будет шлюз, который будет принимать входящий URI для подключения, а затем использовать эту информацию о пути в качестве поиска имени службы, чтобы затем создать прокси-соединение между входящим запросом и фактическим внутренним расположение конечной точки.

Похоже, команда опубликовала один из примеров, в котором показано, как это сделать: https://github.com/Azure/servicefabric-samples/tree/master/samples/Services/VS2015/WordCount

person Brad Merrill    schedule 02.05.2015

Мне интересно, вместо того, чтобы открывать Rest at N + services, используйте стек связи по умолчанию везде внутри служебной фабрики (или, насколько это возможно, чтобы все было просто внутренне). Выставляйте REST только в краевых точках входа в ткань. Используйте стандартный API-интерфейс web 2.x без сохранения состояния, который обертывает прокси-серверы структуры ваших служб и субъектов, и / или используйте службу фабрики, предоставляющую остальное таким же образом. Агрегируйте свои API по мере необходимости в обращенных вперед сервисах Rest. Не уверен, что я еще видел необходимость в дополнительных накладных расходах агрегатора для перенаправления имен (возможно, я упускаю эту мысль). Тогда это могло бы показаться просто упражнением в организации (и обеспечении) конечных точек покоя с желаемым пространством имен (то есть шаблоном фасада).

person staceyw    schedule 13.09.2015