Фото АЙЛИН ГЁРАЛ
Serverless — одна из горячих тем в мире разработчиков, особенно в последние пару лет. Как следует из названия, Serverless — это способ развертывания конечных точек, также называемых функциями, без необходимости иметь дело с сервером или оборудованием, на котором они работают.
Отсутствие необходимости беспокоиться о серверах делает эту модель действительно рентабельной, поскольку мы платим только за время выполнения наших функций. Если наши API работают только, например, 30 часов в месяц, то мы будем платить только за эти 30 часов, а не за время простоя сервера, которое составляет 24 часа в сутки в течение всего месяца.
Помимо экономической выгоды, Serverless также позволяет нам справляться с пиковым трафиком благодаря своей модели автоматического масштабирования. Это действительно веские причины для того, чтобы начать использовать Serverless как можно скорее.
Зарегистрируйтесь в Cloudflare Workers
Вы можете зайти и зарегистрироваться на https://workers.cloudflare.com/. Их щедрый бесплатный уровень обеспечивает нам 100,000
операции чтения в день!!! Не знаю, как вам, а мне этого количества более чем достаточно для моих сайд-проектов.
Я имею в виду, даже если вы хотите использовать их платный план, это $5
за 1,000,000
запросов в месяц. Выберите тот план, который вам подходит, а затем давайте напишем код.
Установка инструментов CLI
Теперь, когда у нас есть учетная запись, первое, что нужно сделать, это установить инструменты CLI. В этом примере мы будем использовать JS-клиент. Давайте установим wrangler
глобально.
npm install -g @cloudflare/wrangler
Теперь, когда у нас установлен wrangler
, мы видим, что он предоставляет нам ряд возможностей, которые мы можем с ним делать. Теперь давайте войдем в нашу учетную запись
wrangler login
Allow Wrangler to open a page in your browser? [y/n]
Ввод y
откроет окно в нашем браузере.
Как только мы разрешим wrangler управлять нашей функцией, сообщение waiting for API token...
должно исчезнуть из нашего интерфейса командной строки. Затем следующее сообщение должно подтвердить, что мы успешно вошли в систему.
wrangler whoami
+--------------------------------+-----------------------------------+ | Account Name | Account ID | +--------------------------------+-----------------------------------+ | [email protected]'s Account | do_not_share_this_key_with_anyone | +--------------------------------+-----------------------------------+
Если, как и у меня, у вас были проблемы с тем, чтобы это работало, альтернативный способ сделать это вручную. Перейдите на https://dash.cloudflare.com/profile/api-tokens и проверьте глобальный ключ API. Как только мы введем наш пароль и пройдем CAPTCHA, мы сможем скопировать ключ API. Затем давайте настроим это в wrangler.
wrangler config --api-key We don't recommend using your Global API Key! Please consider using an API Token instead.
<https://support.cloudflare.com/hc/en-us/articles/200167836-Managing-API-Tokens-and-Keys> Enter Email: [email protected] Enter Global API Key: do_not_share_this_key_with_anyone 💁 Validating credentials... ✨ Successfully configured. You can find your configuration file at: /Users/your_username/.wrangler/config/default.toml
Если у вас по-прежнему возникают проблемы, проверьте ссылку, которую они рекомендуют https://support.cloudflare.com/hc/en-us/articles/200167836-Managing-API-Tokens-and-Keys.
Наша команда wrangler whoami
теперь должна показать нам, что мы вошли в систему. Теперь пришло время создать новый проект. Вы можете проверить стартовую страницу в документации Cloudflare Workers, где есть множество проектов, которые можно использовать в качестве отправной точки. Для этого сообщения в блоге я сделаю очень простую функцию, которая выводит количество репозиториев, которые есть у пользователя на Github.
wrangler generate username_github_repos
Теперь время для крутых вещей! 🎉
JS-код
Теперь, когда проект сгенерирован, давайте откроем его в нашем любимом текстовом редакторе (в моем случае VSCode) и посмотрим код. Индексный файл будет содержать следующее.
/** * Respond with "Username x has y repos" text * @param {Request} request */ async function handleRequest(request) { try { let username = 'harrisgeo88'
// splits the url from the query string const querystring = request.url.split('?')[1] if (querystring) { // we split the query string into an array const params = querystring.split('&') // we search for username const userParam = params.find(y => y.includes('username')) // if username exists then use it. Otherwise use the default if (userParam) { username = userParam.split('=')[1] } }
const response = await fetch(`https://api.github.com/users/${username}/repos?per_page=100`, { headers: { 'User-Agent': 'request' } }) const allRepos = await response.json() const length = allRepos.length let repos = '' if (length > 99) { repos = 'more than 100' } else if (!length) { repos = '0' } else { repos = `${length}` }
return new Response(`Username ${username} has ${repos} repos`, { headers: { 'content-type': 'text/plain' }, }) } catch (err) { console.log(err) } }
addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) })
Просто для простоты в этом сообщении в блоге я не использую сторонние библиотеки. По этой причине часть параметров строки запроса выполняется вручную. Библиотеки типа qs упростили бы эту работу.
Что делает этот код, так это то, что он принимает параметр запроса username
, который мы передаем, и использует его для получения репозиториев для этого пользователя. API Github ограничен 100 результатами на странице. Если ваше имя пользователя имеет более 100 результатов, на странице будет напечатано Username x has more than 100 repos
.
Если мы не передадим никаких параметров запроса, по умолчанию будет использоваться мое имя пользователя harrisgeo88
. Имейте в виду, что этот API возвращает только ваши публичные репозитории. Если вы, как и я, запутались и начнете задаваться вопросом, почему числа не совпадают с числами в моем профиле, когда я вхожу в систему, это из-за этого 😂
Теперь, когда наша функция готова, давайте запустим ее локально и посмотрим на наш код в действии.
Запуск локально
Команда wrangler
сделает всю работу за нас и запустит сервер локально.
wrangler dev
Если вы запускаете этот проект впервые, вы заметите, что интерфейс командной строки выдаст следующую ошибку. Error: field account_id is required to deploy to workers.dev
. К счастью, это действительно легко решить. Если мы откроем наш редактор, мы увидим файл с именем wrangler.toml
. Это файл конфигурации, и он выглядит так
name = "username_github_repos"
type = "javascript"
account_id = ""
workers_dev = true
route = ""
zone_id = ""
Помните ранее, когда мы запускали wrangler whoami
? Давайте сделаем это снова и скопируем поле Account ID
, которое было там напечатано. Это то, что нам нужно вставить в account_id
файла wrangler.toml
. Как только мы это сделаем, сохраним файл и снова запустим wrangler dev
, мы увидим следующее.
wrangler dev
💁 watching "./"
👂 Listening on <http://127.0.0.1:8787>
Теперь нажатие на этот URL-адрес откроет браузер и покажет вам мое имя пользователя и количество репозиториев, которые у меня есть. Хотя это состояние по умолчанию. Замените johnsmith своим именем пользователя в ?username=johnsmith
. Это даст нам http://127.0.0.1:8787/?username=johnsmith
Потрясающий! Теперь давайте развернем эту функцию.
Развертывание нашей функции
И снова Wrangler сделает это за нас.
wrangler publish
Надеюсь, вы увидите следующее.
wrangler publish
✨ JavaScript project found. Skipping unnecessary build!
✨ Successfully published your script to
https://username_github_repos.harrisgeo.workers.dev
Аааа вот и все. Вы можете просмотреть мой прямо здесь https://username_github_repos.harrisgeo.workers.dev
Да, это было!
Поздравляем!!! Вы только что развернули свою первую функцию Cloudflare Worker в облаке. Мне очень нравится, как просто они сделали это, чтобы начать с ним. Это абсолютно бесплатный, простой и в целом отличный способ начать публиковать больше сторонних проектов в облаке, не беспокоясь о контрактах, серверах и прочих подобных вещах.
Код в блоге можно найти здесь.
Какой проект вы собираетесь создавать с помощью Cloudflare Workers?
Pподпишитесь на мою рассылку, если вам понравился этот пост и вы хотите получать уведомления о выходе новых.