Отключете силата на безсървърните изчисления с Google Cloud Functions. Това ръководство разглежда HTTP тригери за изграждане на мащабируеми, събитийни приложения.
Google Cloud Functions: Изчерпателно ръководство за HTTP тригери
Google Cloud Functions (GCF) е безсървърна среда за изпълнение, която ви позволява да изграждате и свързвате облачни услуги. С Cloud Functions вие пишете прости функции с една цел, които са прикрепени към събития, излъчвани от вашата облачна инфраструктура и услуги. Вашата функция се изпълнява, когато събитието, което наблюдавате, се случи. Този подход ви позволява да разработвате управлявани от събития приложения, без да управлявате сървъри или среди за изпълнение.
Един от най-често срещаните начини за задействане на Cloud Function е чрез HTTP заявка. Това ръководство ще навлезе в света на HTTP тригерите в Google Cloud Functions, предоставяйки ви знанията за изграждане на мощни, мащабируеми и рентабилни приложения.
Какво представляват HTTP тригерите?
HTTP тригерът ви позволява да изпълнявате вашата Cloud Function в отговор на HTTP заявка. По същество, когато HTTP заявка бъде изпратена до конкретен URL адрес, Google Cloud Functions автоматично ще изпълни свързаната функция. Това прави HTTP тригерите идеални за изграждане на API, уебкуки и управлявани от събития уеб приложения.
Основни предимства от използването на HTTP тригери:
- Мащабируемост: Cloud Functions автоматично се мащабират, за да обработват входящи HTTP заявки. Не е нужно да се притеснявате за осигуряване или управление на сървъри.
- Рентабилност: Плащате само за времето, през което функцията ви се изпълнява. Когато функцията ви е неактивна, не се начисляват такси.
- Лесна употреба: Cloud Functions опростяват процеса на разработка и внедряване. Можете да се съсредоточите върху писането на кода на вашата функция, а Google Cloud се грижи за инфраструктурата.
- Интеграция: HTTP тригерите ви позволяват лесно да интегрирате вашите Cloud Functions с други услуги, като уеб приложения, мобилни приложения и API на трети страни.
Създаване на Cloud Function с HTTP тригер
Нека преминем през процеса на създаване на проста Cloud Function с HTTP тригер. Ще създадем функция, която отговаря със съобщение "Hello, World!". Този пример може да бъде адаптиран за различни глобални локали чрез просто модифициране на изходния низ.
Предварителни изисквания:
- Акаунт в Google Cloud Platform (GCP).
- Инсталиран и конфигуриран Google Cloud SDK (gcloud).
Стъпки:
- Създаване на нов проект (ако нямате такъв):
Ако все още нямате GCP проект, създайте такъв в Google Cloud Console.
- Активиране на Cloud Functions API:
В Cloud Console навигирайте до Cloud Functions API и го активирайте.
- Създаване на директория за функция:
Създайте нова директория за вашата Cloud Function. Например:
mkdir hello-http cd hello-http
- Напишете кода на функцията:
Създайте файл на име `main.py` (или `index.js` за Node.js) със следния код:
Python (main.py):
def hello_http(request): """HTTP Cloud Function. Args: request (flask.Request): The request object. <https://flask.palletsprojects.com/en/1.1.x/api/#flask.Request> Returns: The response text, or any set of values that can be turned into a Response object using `make_response` <https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.make_response>. """ request_json = request.get_json(silent=True) request_args = request.args if request_json and 'name' in request_json: name = request_json['name'] elif request_args and 'name' in request_args: name = request_args['name'] else: name = 'World' return f'Hello, {name}!'
Node.js (index.js):
exports.helloHttp = (req, res) => { let name = 'World'; if (req.body.name) { name = req.body.name; } else if (req.query.name) { name = req.query.name; } res.status(200).send(`Hello, ${name}!`); };
- Създаване на файл с изисквания (само за Python):
Ако използвате Python, създайте файл на име `requirements.txt` и добавете всички зависимости, от които се нуждае вашата функция. За този пример това не е строго необходимо, но е добра практика да включите такъв. Можете да го оставите празен, ако нямате зависимости.
- Внедряване на функцията:
Използвайте командата `gcloud functions deploy`, за да внедрите вашата функция. Заменете `YOUR_FUNCTION_NAME` с желаното име за вашата функция.
Python:
gcloud functions deploy YOUR_FUNCTION_NAME \ --runtime python39 \ --trigger-http \ --allow-unauthenticated
Node.js:
gcloud functions deploy YOUR_FUNCTION_NAME \ --runtime nodejs16 \ --trigger-http \ --allow-unauthenticated
Обяснение на параметрите:
- `YOUR_FUNCTION_NAME`: Името, което искате да дадете на вашата Cloud Function.
- `--runtime`: Средата за изпълнение на вашата функция (напр. `python39`, `nodejs16`).
- `--trigger-http`: Указва, че функцията трябва да бъде задействана от HTTP заявки.
- `--allow-unauthenticated`: Позволява на всеки да извика функцията без удостоверяване. Предупреждение: Бъдете внимателни, когато активирате това в производствена среда! Помислете за прилагане на правилно удостоверяване и оторизация.
- Тестване на функцията:
След внедряване, командата `gcloud` ще изведе URL адреса на вашата функция. След това можете да я тествате, като изпратите HTTP заявка до този URL адрес, използвайки инструмент като `curl` или Postman.
curl YOUR_FUNCTION_URL
Трябва да видите съобщението "Hello, World!" в отговора. Можете също така да предадете име като параметър за заявка:
curl "YOUR_FUNCTION_URL?name=YourName"
Това трябва да върне "Hello, YourName!"
Разбиране на HTTP заявката и отговора
Когато Cloud Function се задейства от HTTP заявка, тя получава обект, съдържащ информация за заявката. Този обект обикновено включва:
- Заглавия: HTTP заглавия, изпратени със заявката.
- Тяло: Тялото на заявката (напр. JSON данни, данни от форма).
- Параметри на заявката: Параметри, предадени в URL адреса.
- Метод: HTTP методът (напр. GET, POST, PUT, DELETE).
Вашата функция след това трябва да върне HTTP отговор, който включва:
- Код на състоянието: HTTP код на състоянието (напр. 200 OK, 400 Bad Request, 500 Internal Server Error).
- Заглавия: HTTP заглавия, които да бъдат изпратени с отговора.
- Тяло: Тялото на отговора (напр. JSON данни, HTML съдържание).
Пример: Обработка на различни HTTP методи
Ето пример за това как да обработвате различни HTTP методи във вашата Cloud Function:
Python (main.py):
from flask import escape
def http_method(request):
"""Responds to any HTTP request.
Args:
request (flask.Request): HTTP request object.
Returns:
The response text or any set of values that can be turned into a
Response object using
`make_response`<https://flask.palletsprojects.com/en/2.0.x/api/#flask.Flask.make_response>.
"""
if request.method == 'GET':
return 'This is a GET request!'
elif request.method == 'POST':
request_json = request.get_json(silent=True)
if request_json and 'message' in request_json:
message = escape(request_json['message'])
return f'This is a POST request with message: {message}'
else:
return 'This is a POST request without a message.'
else:
return 'Unsupported HTTP method.', 405
Node.js (index.js):
exports.httpMethod = (req, res) => {
switch (req.method) {
case 'GET':
res.status(200).send('This is a GET request!');
break;
case 'POST':
if (req.body.message) {
const message = req.body.message;
res.status(200).send(`This is a POST request with message: ${message}`);
} else {
res.status(200).send('This is a POST request without a message.');
}
break;
default:
res.status(405).send('Unsupported HTTP method!');
break;
}
};
Не забравяйте да внедрите актуализираната функция, използвайки командата `gcloud functions deploy`.
Защита на вашите HTTP тригери
Сигурността е от първостепенно значение при работа с HTTP тригери, особено когато се борави с чувствителни данни или критични операции. Ето някои ключови съображения за сигурност:
Удостоверяване и оторизация
По подразбиране Cloud Functions, задействани от HTTP, са публично достъпни, ако използвате `--allow-unauthenticated`. В повечето производствени сценарии ще искате да ограничите достъпа само до оторизирани потребители или услуги. Google Cloud предоставя няколко опции за удостоверяване и оторизация:
- Identity-Aware Proxy (IAP): IAP ви позволява да контролирате достъпа до вашите Cloud Functions въз основа на Google самоличности. Той изисква от потребителите да се удостоверят със своите Google акаунти, преди да получат достъп до функцията.
- Сервизни акаунти: Можете да присвоите сервизен акаунт на вашата Cloud Function и да го използвате за удостоверяване с други Google Cloud услуги. Това е полезно за позволяване на вашата функция да достъпва ресурси като Cloud Storage или Cloud Datastore.
- Персонализирано удостоверяване: Можете да приложите собствен механизъм за удостоверяване, като JWT (JSON Web Token) или API ключове. Това ви дава най-голяма гъвкавост, но също така изисква повече усилия за разработка.
Валидиране на входните данни
Винаги валидирайте входните данни, получени от вашата Cloud Function, за да предотвратите уязвимости в сигурността като SQL инжекция или междусайтов скриптинг (XSS). Използвайте подходящи техники за дезинфекция и екраниране, за да се предпазите от злонамерени входни данни.
HTTPS
Уверете се, че вашата Cloud Function е достъпна само чрез HTTPS, за да шифровате комуникацията между клиента и функцията. Google Cloud Functions автоматично предоставя HTTPS крайни точки.
Ограничаване на честотата (Rate Limiting)
Приложете ограничаване на честотата, за да предотвратите злоупотреби и атаки за отказ на услуга (DoS). Можете да използвате услуги като Google Cloud Armor, за да защитите вашите Cloud Functions от прекомерен трафик.
Случаи на употреба за HTTP тригери
HTTP тригерите са многофункционални и могат да се използват в широк спектър от приложения. Ето някои често срещани случаи на употреба:
- REST API: Изграждайте RESTful API за вашите уеб и мобилни приложения.
- Уебкуки: Интегрирайте се с услуги на трети страни, като получавате събития от уебкуки.
- Обработка на форми: Обработвайте данни, подадени чрез HTML форми.
- Преоразмеряване на изображения: Задействайте преоразмеряване на изображения, когато нови изображения бъдат качени в Cloud Storage.
- Трансформация на данни: Трансформирайте данни от един формат в друг.
- Slack ботове: Създавайте интерактивни Slack ботове.
- Персонализирани уеб приложения: Обслужвайте динамично съдържание за малки уеб приложения или микроуслуги.
Примери в различни индустрии
- Електронна търговия (Глобална): HTTP тригер може да се използва за обработка на плащания от различни платежни шлюзове по целия свят, валидиране на транзакции и актуализиране на състоянията на поръчките в реално време. Функцията може да използва информация за геолокация от заявката, за да приложи подходящи данъци и такси за доставка въз основа на местоположението на потребителя.
- Финанси (Международно банкиране): HTTP тригерите могат да улеснят сигурни преводи на средства между различни банкови сметки в световен мащаб, обработвайки валутни конверсии и спазвайки международните банкови разпоредби. Удостоверяването е от решаващо значение тук, потенциално включващо многофакторно удостоверяване чрез SMS или приложения за удостоверяване.
- Здравеопазване (Телемедицина): HTTP тригер може да обработва заявки за насрочване на срещи от пациенти по целия свят, координирайки с различни часови зони и управлявайки наличността на лекари. Той може също така да се интегрира с услуги за превод, за да осигури многоезична поддръжка. Поверителността на данните и спазването на разпоредби като HIPAA (в САЩ) или GDPR (в Европа) са от първостепенно значение.
- Образование (Онлайн учебни платформи): HTTP тригерите могат да се използват за автоматично оценяване на задачи, предоставяйки незабавна обратна връзка на студентите, независимо от тяхното местоположение. Те могат също така да задействат персонализирани препоръки за обучение въз основа на представянето на студентите.
- Логистика (Глобална доставка): HTTP тригерите могат да се използват за проследяване на пратки в реално време, предоставяйки актуална информация за местоположението на пакета и прогнозните срокове за доставка на клиенти по целия свят. Интеграциите с различни превозвачи чрез техните API чрез HTTP тригери са често срещани.
Разширени техники
Използване на променливи на средата
Променливите на средата ви позволяват да конфигурирате вашата Cloud Function, без да кодирате чувствителна информация или стойности на конфигурацията във вашия код. Можете да зададете променливи на средата, използвайки командата `gcloud functions deploy` или в Google Cloud Console.
gcloud functions deploy YOUR_FUNCTION_NAME \
--runtime python39 \
--trigger-http \
--set-env-vars API_KEY=YOUR_API_KEY,DATABASE_URL=YOUR_DATABASE_URL
Във вашия код можете да осъществявате достъп до променливи на средата, използвайки речника `os.environ` (Python) или обекта `process.env` (Node.js).
Python:
import os
def your_function(request):
api_key = os.environ.get('API_KEY')
# Use the API key in your function
return f'API Key: {api_key}'
Node.js:
exports.yourFunction = (req, res) => {
const apiKey = process.env.API_KEY;
// Use the API key in your function
res.status(200).send(`API Key: ${apiKey}`);
};
Обработка на асинхронни задачи
За дълготрайни или интензивни изчислителни задачи е най-добре да използвате асинхронна обработка, за да избегнете блокиране на HTTP заявката. Можете да използвате услуги като Google Cloud Tasks или Cloud Pub/Sub, за да разтоварите тези задачи в отделни опашки.
Обработка на грешки и регистриране
Приложете стабилна обработка на грешки и регистриране във вашите Cloud Functions, за да идентифицирате и разрешите проблеми бързо. Използвайте Google Cloud Logging, за да събирате логове от вашите функции и да наблюдавате тяхната производителност.
Най-добри практики
- Поддържайте функциите малки и фокусирани: Всяка функция трябва да има една, добре дефинирана цел.
- Използвайте управление на зависимостите: Използвайте пакетни мениджъри като `pip` (Python) или `npm` (Node.js), за да управлявате вашите зависимости.
- Тествайте функциите си задълбочено: Пишете модулни тестове и интеграционни тестове, за да гарантирате, че функциите ви работят правилно.
- Наблюдавайте производителността на функцията: Използвайте Google Cloud Monitoring, за да проследявате времето за изпълнение на функцията, използването на памет и процента на грешки.
- Оптимизирайте кода за "студени стартове": Минимизирайте времето, необходимо на вашата функция да стартира ("студен старт"). Това може да се постигне чрез намаляване на зависимостите, оптимизиране на кода и използване на осигурена паралелност (където е налично).
- Разгледайте местоположението на функцията: Разгърнете функциите си в регион, който е географски близо до вашите потребители, за да минимизирате латентността. За глобална аудитория, помислете за внедряване в множество региони.
Отстраняване на често срещани проблеми
- Функцията не се внедрява: Проверете за синтактични грешки в кода си, уверете се, че имате необходимите разрешения и проверете дали използвате поддържана среда за изпълнение.
- Функцията връща грешка 500: Проверете логовете на функцията в Google Cloud Logging за съобщения за грешки. Чести причини включват необработени изключения, липсващи зависимости или неправилна конфигурация.
- Функцията изтича: Увеличете стойността на таймаута на функцията в Google Cloud Console или чрез командата `gcloud functions deploy`. Също така оптимизирайте кода си, за да намалите времето за изпълнение.
- Функцията не се задейства: Проверете дали тригерът е конфигуриран правилно и дали HTTP заявката се изпраща до правилния URL адрес.
Заключение
Google Cloud Functions с HTTP тригери предоставят мощен и гъвкав начин за изграждане на безсървърни приложения. Чрез разбиране на концепциите и техниките, обсъдени в това ръководство, можете да използвате силата на Cloud Functions, за да създадете мащабируеми, рентабилни и управлявани от събития решения за глобална аудитория. Прегърнете безсървърната революция и отключете пълния потенциал на вашите облачни приложения!