Как настроить бессерверную серверную часть для Hasura с помощью функций Azure в NET 6 и C#

Использование Hasura имеет множество преимуществ. У вас есть центральный шлюз, через который вы можете одновременно подключаться ко многим серверным службам, включая базы данных SQL, конечные точки GraphQL или конечные точки REST, и все можно запрашивать с помощью языка GraphQL.

С Hasura Actions у вас есть возможность реализовать пользовательскую логику, которая может быть вызвана мутацией GraphQL или запросом. Для этого вам нужно будет настроить конечную точку REST, которая должна быть доступна для Hasura. У вас есть выбор: либо настроить сервер, который работает все время, либо просто настроить бессерверную функцию, которая не тратит ресурсы впустую, пока не используется.

Конечно, у каждого из этих вариантов есть свои плюсы и минусы, но это уже другая тема, о которой я расскажу в будущем. В этой демонстрации я покажу вам, как настроить Функцию Azure, которая может обрабатывать вызовы от Hasura и будет функционировать как ваша внутренняя логика. В этом примере я буду использовать .NET 6 и C#, однако вы, конечно, можете выбрать другой язык.

Если вы еще не работали с Hasura, вот еще одна моя статья, в которой рассказывается о настройке демонстрации Hasura и автоматической генерации машинописного кода для клиента GraphQL в Angular.

Обзор

На приведенном выше рисунке показана архитектура этой витрины. Hasura размещается в облаке Amazon Web Services, которое является средой по умолчанию при настройке Hasura Cloud. База данных PostgreSQL и наше бессерверное приложение Azure Functions размещены в облаке Microsoft Azure.

Код приложения Функции Azure этой демонстрации можно найти на моем Github здесь.

Первоначальная настройка функции Azure

Настроить функцию Azure очень просто. Если у вас еще нет учетной записи Azure, я советую вам зарегистрироваться и попробовать кое-что самостоятельно. Большую часть среды облачных вычислений Azure можно протестировать бесплатно. Кроме того, Microsoft предоставляет вам бесплатные курсы, которые часто включают песочницу, где вы можете попробовать что угодно, не беспокоясь о счете.

Чтобы добавить функцию Azure, войдите на портал Azure и нажмите Создать ресурс. В строке поиска найдите «Функциональное приложение» и нажмите Создать.

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

Нажмите Далее: Хостинг.

  • Выберите или создайте новую учетную запись хранения.
  • Выберите предпочтительную операционную систему.
  • Выберите Потребление (без сервера) в качестве типа плана. Это только агрегирует затраты, когда оно используется.

Вам пока не нужно беспокоиться о затратах, так как План потребления функций Azure очень дешев, а его бесплатный уровень составляет 1 миллион запросов.

Теперь вы можете нажать Просмотреть + создать и создать свою первую функцию Azure!

Программирование функции Azure

Теперь давайте перейдем к части кодирования. Если вы установили Visual Studio с расширениями Azure, вы можете просто выбрать шаблон функций Azure в диалоговом окне Создать проект. В противном случае вы можете создать новый проект через CLI. Я рекомендую использовать расширения Azure, так как это также упростит публикацию.

Во время установки вас спросят, какой тип функции вы хотите создать. Выберите триггер Http и уровень авторизации: функция.

Уровень авторизации Функция означает, что ваше приложение Функций по умолчанию будет защищено секретом. Только клиент, который знает этот секрет или имеет действительный заголовок аутентификации, может вызвать функцию.

После создания проекта вы столкнетесь с демонстрационной функцией под названием Function1. Это реализовано как статическая функция. Однако я всегда предпочитаю нестатический класс, так как это позволяет мне использовать внедрение зависимостей и некоторые зависимости из моих проектов:

Атрибут над функцией Выполнить используется Azure для создания URL-адреса конечной точки этой функции, например. https://hasura-actions-demo.azurewebsites.net/api/hasura-demo-action.

Чтобы иметь возможность использовать Microsoft Dependency Injection, вам сначала нужно добавить следующие пакеты:

Создайте класс с именем Startup прямо в папке проекта и добавьте следующий код:

Благодаря этому атрибуту узел приложения Функций Azure знает, что использовать в качестве логики запуска, поэтому здесь вы можете добавить свои зависимости в контейнер IoC.

Теперь, чтобы приступить к реализации функции, которую может вызывать Hasura, нам нужно выяснить, как выглядит вызов из Hasura Actions. По этому поводу мы смотрим на документацию и видим, что это сериализованный объект JSON, содержащий четыре объекта:

  • Название действия
  • Сеансовые переменные от Hasura
  • Входные данные
  • И исходный запрос запроса

Я решил реализовать общий тип, в который мы можем десериализовать каждый вызов из Hasura:

Поскольку исходный запрос нам не нужен, мы можем спокойно его игнорировать. Если вы хотите, вы также можете реализовать действие Hasura, которое не имеет входной полезной нагрузки, поэтому я также добавил здесь необобщенный тип.

Теперь мы можем использовать этот тип для десериализации HttpRequest, который будет передан нашей функции Hasura.

Создать действие Хасуры

Чтобы создать новое действие, вам нужно нажать ДействияСоздать на панели инструментов Hasura Cloud.

Появится диалоговое окно, где вы должны ввести Определение действия. Здесь вы можете ввести следующее:

  • В качестве типа вы можете ввести Query или Mutation.
  • Следующая строка — это название вашего действия.
  • В фигурные скобки вы вставляете аргументы, которые будут переданы в ваш запрос, а затем в приложение "Функции Azure".
  • После «:» вы можете ввести тип результата

Рядом с определением действия вам нужно будет определить типы, которые вы хотите использовать в своем действии.

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

Для обработчика вам нужно будет ввести URL-адрес вашей функции, а затем секрет, который будет автоматически создан Azure. На следующем шаге мы увидим, как мы загружаем наше приложение функций в Azure и получаем URL-адрес и секрет.

На данный момент сохраните свое действие на Hasura и продолжите, открыв проект приложения "Функции Azure" сверху.

Размещение приложения функций в Azure

Прежде чем мы будем готовы опубликовать наше приложение в Azure, нам сначала нужно реализовать нашу бизнес-логику.

Во-первых, мы определяем наши типы запросов и результатов в отдельных файлах. Поскольку я использую .NET 6, я могу просто использовать для этого типы записей:

Чтобы десериализовать наш запрос от Hasura, наш код будет выглядеть так:

С помощью этого кода мы готовы опубликовать наше приложение функций в Azure. Для этого щелкните проект правой кнопкой мыши и выберите Опубликовать.

  • Появится диалоговое окно, в котором вы можете выбрать Azure.
  • В следующем окне выберите Приложение-функция Azure (Windows/Linux) в соответствии с настройками приложения «Функции» в Azure.
  • Теперь выберите свою подписку и приложение «Функции», которое мы создали выше.

Выберите Готово и Опубликовать. Теперь ваше приложение будет загружено и размещено в Azure.

Связь с Хасурой

Последний шаг — заполнить URL-адрес обработчика действия, который мы определили в Hasura выше. Чтобы получить URL-адрес, войдите на портал Azure и перейдите к приложению «Функции».

Нажмите ФункцииФункция и выберите функцию, активируемую HTTP, в появившемся окне. На этой панели выберите Получить URL-адрес функции, и вам будет показан URL-адрес, за которым следует автоматически сгенерированный секрет для вашего Уровня авторизации функции.

Скопируйте этот URL-адрес и вставьте его в определение действия Hasura.

Вуаля, вы успешно настроили функцию Azure в качестве обработчика действий для Hasura.

Используйте проводник GraphiQL на панели API на Hasura, чтобы протестировать только что созданную мутацию:

Кстати, если вы хотите отладить свою функцию, вы можете либо использовать Visual Studio, либо просмотреть функцию МониторингПоток журнала в приложении «Функции» в Azure. Что-то вроде этого должно быть среди вывода, когда функция выполнена успешно:

2022-02-01T19:36:50.384 [Information] Executing 'hasura-demo-action' (Reason='This function was programmatically called via the host APIs.', Id=04b3a0c7-4a89-48af-952c-d20528467c20)
2022-02-01T19:36:50.385 [Information] Executed 'hasura-demo-action' (Succeeded, Id=04b3a0c7-4a89-48af-952c-d20528467c20, Duration=1ms)

Следующие шаги

С этого момента у вас есть возможность реализовать всю свою бизнес-логику в приложении функций Azure. Эта установка имеет возможность масштабирования, поэтому вы не будете страдать от низкой производительности на своей серверной стороне.

Спасибо, что нашли время прочитать эту статью. Надеюсь, вы нашли его информативным, познавательным и интересным.
Мы очень ценим вашу поддержку и участие.

Если вы заинтересованы в том, чтобы быть в курсе последних тенденций, советов и приемов для чистой архитектуры, чистого кодирования и новейших технологических стеков, особенно в контексте C #, .NET и Angular, я был бы признателен. если вы решили следовать за мной.

Удачного дня!

Если вы еще не используете Medium для ежедневного расширения своих знаний, сейчас самое время начать! С Medium вы можете легко получить больше знаний по высокопрофессиональным темам, публиковать качественный контент и охватить более широкую аудиторию. Чтобы начать, просто создайте учетную запись Medium, используя эту ссылку:

Присоединиться к Medium сейчас

Таким образом, вы получите доступ к мощной платформе, которая поможет вам общаться с новыми писателями и читателями и каждый день узнавать что-то новое.