Подтвердить что ты не робот

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?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 4

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

Ответ 5

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

Он поддерживает автоматические выключатели, взвешенный циклический 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>

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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