В проекте 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) можно сделать то же самое:
- в Go: пример вызова
RequestMethod()
в контексте - в рубине: класс
HTTPContext
- в Python: класс
HTTPGatewayContext
- в узле: класс
HTTPGatewayContext
Из этого контекста вы сможете получить 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 более высокого уровня, поскольку он должен был быть независимым от него.