В проекте Fn отсутствуют операции http (CRUD)

Я потратил весь день на то, чтобы быть очень взволнованным в связи с серверной платформой "fn project" - http://fnproject.io/.

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

Проект fn кажется идеальным для моих нужд, пока я не закончу изучать документацию и все соответствующие сообщения в блоге и вдруг подумаю "что? Чего ждать??? Где операции http?

Я не могу найти ни одной ссылки, где бы указывалось, возможно ли даже иметь http-триггеры для различных http-операций (например, POST, PUT, PATCH, DELETE), не говоря уже о том, как бы я это сделал.

Я хочу создать REST API (или, конечно, по крайней мере, json-обслуживающий API RPC на основе http - если у него нет гиперссылок, это не REST;), но давайте не будем вдаваться в этот в этой теме)

Я что-то здесь упускаю (конечно, правильная часть документации)?

Кто-нибудь может, пожалуйста, просветить меня о том, как я это сделаю, или даже сказать мне, если я полностью не понял, для чего я должен использовать это?

Мое волнение прошло пока мягко, но я надеюсь, что кто-то изменится с правильной информацией.

Мне кажется странным, что я не могу найти никого, кто бы жаловался на это, поэтому я думаю, что это, возможно, указывает на мое недоразумение.

Другие решения, такие как OpenFaaS, выглядят интересно, но мне не нужно узнавать, как развернуть kubernetes и docker рои, если я могу избежать этого:)

3 ответа

Решение

Я не эксперт, но на данный момент невозможно указать метод http внутри триггера. Проверьте последнюю спецификацию триггера: как видите, понятия "нет" http метод здесь.

Однако обработка различных методов HTTP может быть выполнена внутри самой функции.

Например, в Java (с fdk-java v1.0.80), вы можете использовать com.fnproject.fn.api.httpgateway.HTTPGatewayContextв качестве первого параметра функции, как описано в разделе " Доступ к информации HTTP из функций " документации:

В Fn для Java, когда ваша функция обслуживается триггером HTTP (или другим совместимым HTTP-шлюзом), вы можете получить доступ к обоим заголовкам входящих запросов для вашей функции, добавив 'com.fnproject.fn.api.httpgateway.HTTPGatewayContext параметр к параметрам вашей функции.

Использование этого позволяет:

  • ...
  • Доступ к методу и URL запроса для триггера
  • ...

Затем вы можете получить метод HTTP, вызвавgetMethod()наHTTPGatewayContextпередается в качестве параметра.

На других языках (с другими fdk) можно сделать то же самое:

Из этого контекста вы сможете получить method параметр передан, когда fn invoke --method=[GET|POST|...] (с помощью fn-http-method заголовок).

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

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

Когда в прошлом я создавал службы Serverless Framework (или создавал и развертывал функции Lambda с использованием terraform), я развертывал его на AWS и поэтому использовал предложение AWS API Gateway (их продукт на самом деле называется API-шлюзом, но важно признать, что этот API-интерфейс Шлюз - это шаблон проектирования распределенных систем / микросервисов).

Шлюз API позволяет направлять определенные типы http-запросов, включая метод (GET,POST,PUT,DELETE), к нужным функциям.

Платформы, такие как проект Fn и OpenFaaS, не предоставляют готового решения API-шлюза, и, похоже, мы должны позаботиться об этом сами.

Эти вышеупомянутые платформы о развертывании функций. Мы находим другие биты через наш продукт выбора.

Концепция проекта fn заключается в создании функций с вводом/выводом, независимыми от протоколов нижнего уровня; мы сможем связать эту функцию с несколькими протоколами в разных системах.

Однако на практике, насколько мне известно, в настоящее время поддерживается только http.

Вы всегда можете сломать абстракции, обратившись к нижним уровням API (см. ответ norbdj) и найдя материал, связанный с HTTP. Но его нет в API более высокого уровня, поскольку он должен был быть независимым от него.

Другие вопросы по тегам