Cloudflare Workers - это бессерверная платформа, позволяющая разработчикам выполнять код JavaScript на граничной сети серверов Cloudflare. С помощью Workers программисты могут создавать и распространять проворные, управляемые событиями сценарии и приложения, которые могут реагировать на HTTP-запросы, запланированные события и другие триггеры. Workers можно использовать для изменения HTTP-запросов и ответов, маршрутизации трафика на различные серверы, аутентификации запросов, доставки статических файлов и многого другого.
Разработчики могут писать код Workers на JavaScript или TypeScript и использовать популярные фреймворки, такие как Node.js или React. Workers также можно написать на других языках, таких как Rust, Go и т.д., и преобразовать его в WebAssembly (Wasm).
В этой статье мы создадим бессерверный API с двумя конечными точками и развернем приложение на сервере Cloudflare.
Оглавление
Примеры приложений, созданных с помощью Cloudflare Workers
- Бессерверные API: Cloudflare Workers можно использовать для создания и развертывания бессерверных API, что дает множество преимуществ, включая масштабируемость, высокую доступность и низкую задержку API, которые могут быть интегрированы в другие сервисы.
- Сокращение URL-адресов: Cloudflare Workers можно использовать для создания сервисов сокращения URL, которые предоставляют пользователям короткие и легко запоминающиеся URL, перенаправляющие на более длинные и сложные URL.
- A/B-тестирование: Cloudflare Workers позволяет создавать фреймворки для A/B-тестирования, которые позволяют разработчикам тестировать различные варианты веб-сайта или приложения и измерять производительность каждой версии.
- Манипулирование изображениями: Cloudflare Workers могут работать с изображениями на месте, позволяя изменять размер, обрезать или наносить водяные знаки в режиме реального времени.
- Хостинг статических сайтов: Cloudflare Workers может размещать статические веб-сайты, предоставляя разработчикам масштабируемую и надежную платформу для размещения их веб-приложений.
- Обмен сообщениями в реальном времени: Cloudflare Workers позволяет создавать приложения для обмена сообщениями в реальном времени, использующие WebSockets для обеспечения связи между клиентами и серверами с низкой задержкой.
- Балансировка нагрузки: Cloudflare Workers может балансировать нагрузку между несколькими серверами, гарантируя, что сайт будет оставаться онлайн и отзывчивым даже в периоды высокого трафика.
Преимущества Cloudflare Workers
Низкая задержка
Тот факт, что Cloudflare Workers работают на границе сети, приближает их к пользователям и позволяет им обслуживать контент с меньшим временем задержки. Это приводит к улучшению пользовательского опыта, ускорению загрузки и повышению SEO-результатов.
Масштабируемость
Разработчикам не нужно беспокоиться о создании и управлении серверами для обработки всплесков трафика, поскольку Cloudflare Workers может автоматически масштабироваться для обработки больших объемов трафика.
Экономически эффективный
Разработчики могут начать использовать платформу без необходимости платить много денег, поскольку Cloudflare Workers предлагает щедрый бесплатный вариант. Она также предлагает доступные цены для приложений, которым требуется больше ресурсов.
Гибкость
Будучи бессерверной платформой, Cloudflare Workers освобождает разработчиков от обязанности следить за сетями и серверами. Теперь разработчики могут сосредоточиться на создании приложений и функций, не отвлекаясь на административные хлопоты.
Безопасность
Cloudflare Workers интегрируется с набором сервисов безопасности и производительности Cloudflare, что означает, что разработчики могут создавать безопасные и производительные приложения, не заботясь о внедрении функций безопасности самостоятельно.
Опыт разработчиков
Cloudflare Workers обеспечивают современный опыт разработчика, поддерживая популярные инструменты и фреймворки, такие как webpack, Rollup и Node.js. Это позволяет разработчикам легко начать работу с платформой и быстро создавать приложения.
Недостатки Cloudflare Workers
Ограниченная среда выполнения
Из-за ограничений на конкретную среду выполнения и парадигму программирования Cloudflare Workers можно использовать только для ограниченного круга приложений. Например, Cloudflare Workers построены на JavaScript и нуждаются в определенном наборе библиотек и API, которые могут не подходить для всех случаев использования.
Отсутствие постоянного хранилища
Отсутствие постоянного хранилища, предлагаемого Cloudflare Workers, может затруднить разработку приложений, требующих длительного хранения данных или сложного манипулирования данными.
Ограниченная отладка и тестирование
Cloudflare Workers не предоставляет надежных инструментов отладки и тестирования, что может затруднить диагностику и устранение ошибок в производстве.
Блокировка поставщика
Cloudflare Workers является проприетарной платформой, что означает, что разработчики, создающие приложения на этой платформе, могут быть заблокированы в использовании сервисов Cloudflare, которые они не собирались использовать.
Cloudflare Workers - относительно новая платформа, и поэтому сообщество разработчиков, которые могут предоставить поддержку или руководство для разработчиков-новичков, может быть ограниченным.
Предварительные условия
Чтобы следовать этому руководству, вам понадобится следующее:
- Базовые знания Rust
- установленный Rust
- Учетная запись пользователя Cloudflare
- IDE или редактор кода, например, Vscode.
Настройка окружения нашего проекта
Чтобы упростить работу с Cloudflare Workers, мы создадим бессерверный API с несколькими конечными точками, а затем развернем его на Cloudflare.
Для начала нам нужно установить CLI-инструмент через Rust Cargo под названием Wrangler, который упрощает сборку и развертывание. Он предназначен для облегчения процесса разработки:
> cargo install wrangler
Создайте проект
Для этого руководства вы можете либо клонировать пример проекта, либо создать его с нуля, на чем мы и сосредоточимся в этом руководстве.
Мы будем использовать Cargo для создания простого проекта Rust, чтобы мы могли написать наш код с нуля:
> cargo new --lib worker-app
[package]
name = "worker-app"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib", "rlib"]
[features]
default = ["console_error_panic_hook"]
[dependencies]
worker = "0.0.11"
[profile.release]
# Tell `rustc` to optimize for small code size.
opt-level = "s"
- [package]: В этом разделе определяются метаданные о пакете, такие как его имя, версия и редакция. В поле name указывается имя пакета, version - номер версии, а edition - используемая редакция Rust. В данном случае установлено значение "2021".
- [lib]: Этот раздел определяет опции для сборки библиотечного крейта. Поле crate-type задает типы выходных файлов для генерации, которые в данном случае являются библиотекой разделяемых объектов (cdylib) и статической библиотекой (rlib).
- [features]: Этот раздел определяет дополнительные функции, которые могут быть включены или отключены для crate. В данном случае функция по умолчанию включена, что включает функцию console_error_panic_hook. Эта функция позволяет выводить панические сообщения в консоль браузера при сбое рабочего процесса.
- [зависимости]: В этом разделе перечислены зависимости, необходимые для работы крейта. В данном случае единственной зависимостью является крейт worker, версия 0.0.11.
- [profile.release]: Этот раздел определяет опции для сборки крейта в режиме релиза. Поле opt-level указывает rustc оптимизировать код для малого размера (s). Это позволяет получить меньший выходной двоичный файл ценой увеличения времени компиляции
Добавьте файл конфигурации Wrangler в наш проект, создав файл wrangler.toml и добавив следующие команды. Эти команды обрабатывают наши сборки, которые также помогают запустить наше приложение:
name = ""
main = "build/worker/shim.mjs"
compatibility_date = "2022-01-20"
[vars]
WORKERS_RS_VERSION = "0.0.11"
[build]
command = "cargo install --git https://github.com/CathalMullan/workers-rs worker-build && worker-build --release"
- name = "": Эта строка определяет имя рабочего. В данном случае она оставлена пустой, поэтому рабочему будет присвоено имя по умолчанию
- main = "build/worker/shim.mjs": Эта строка определяет путь к JavaScript shim-файлу, который будет использоваться для взаимодействия с кодом Rust. Файл shim отвечает за создание модуля WebAssembly и раскрытие его функций для среды JavaScript
- compatibility_date = "2022-01-20": В этой строке указывается дата, с которой совместим рабочий. Это гарантирует, что рабочий будет развернут только в тех центрах обработки данных, которые были обновлены необходимыми зависимостями до этой даты.
- [vars]: Этот раздел определяет переменную WORKERS_RS_VERSION и присваивает ей значение "0.0.11". Эта переменная определяет версию библиотеки workers-rs, которая будет использоваться для сборки рабочего.
- [build]: Этот раздел содержит команду для сборки рабочего с помощью cargo, менеджера пакетов Rust. Команда устанавливает пакет worker-build из репозитория CathalMullan/workers-rs на GitHub, а затем запускает команду worker-build в режиме release. Это скомпилирует код Rust в модуль WebAssembly, который может быть загружен JavaScript shim
Построение бессерверного API
Чтобы продолжить, нам нужно отредактировать файл lib.rs и написать приведенный ниже код, который представляет собой маршрут бессерверного HTTP API, использующий worker::*:
use worker::*;
#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> Result<Response> {
let r = Router::new();
r.get("http://blog.logrocket.com/", |_, _| Response::ok("Hello from Logrocket Workers!"))
.run(req, env).await
Конечные точки объявляются внутри функции main, которая включает макрос #[event(fetch)], указывающий на API времени выполнения Cloudflare.
Чтобы запустить наше приложение, мы воспользуемся следующей командой. Если вы столкнулись с ошибкой, обновите Rust:
> wrangler dev


В процессе запуска нашего приложения Wrangler добавляет в наш проект папку build, которая содержит рабочий каталог, index.wasm , shim.mjs и index.js:
Именно файл index.js содержит код JavaScript, реализующий
import * as wasm from "./index_bg.wasm";
import { __wbg_set_wasm } from "./index_bg.js";
__wbg_set_wasm(wasm);
export * from "./index_bg.js";
Давайте добавим больше конечных точек в приложение. Это запрос get, который принимает параметр запроса id и возвращает ответ в формате JSON:
.get_async("/json/:id", |_, ctx| async move {
if let Some(id) = ctx.param("id") {
match id.parse::<u32>() {
Ok(id) => {
let json = json!({
"id": id,
"message": "Hello from Logrocket Workers!",
"timestamp": Date::now().to_string(),
});
return Response::from_json(&json);
}
Err(_) => return Response::error("Bad Request", 400),
}
};
Чтобы развернуть наше приложение на Cloudflare, нам необходимо пройти аутентификацию, которая позволит легко развертывать и обновлять наше приложение в продакшене:
wrangler login
Команда ниже позволяет нам развернуть наше приложение на Cloudflare. имя будет использоваться в качестве поддомена для приложения:
wrangler publish --name logrocket
Вот предварительный вид команды:
Viola 🎉 Ура наше приложение в производстве:


Заключение
В этом руководстве мы представили Cloudflare Workers в Rust, включая их плюсы и минусы. Затем мы создали бессерверный API и развернули демо-приложение на сервере Cloudlfare.