عنوان:

‫Cloudflare Workers برای توسعه‌دهندگان ASP.NET Core؛ بخش اول: مبانی و مفاهیم کلیدی


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۵/۲۱ ۰۸:۱۰
آدرس: www.dntips.ir
در این سری، قصد داریم از دنیای سرورهای متمرکز و آشنای ASP.NET Core فاصله گرفته و با یک معماری جدید و قدرتمند به نام Edge Computing آشنا شویم. شما یاد خواهید گرفت که Cloudflare Workers چیست، چرا انقدر سریع است و چگونه می‌توانید اولین کد خود را در لبه شبکه (Edge) اجرا کنید.

درس ۱: معرفی Cloudflare Workers و Edge Computing

۱.۱- مشکل کجاست؟ آشنایی با مفهوم تأخیر (Latency)
به عنوان یک توسعه‌دهنده ASP.NET Core، شما اپلیکیشن خود را روی یک سرور (مثلاً در یک دیتاسنتر در آلمان) مستقر می‌کنید. وقتی کاربری از استرالیا می‌خواهد به سایت شما دسترسی پیدا کند، درخواست او باید نیمی از کره زمین را طی کند تا به سرور شما برسد و پاسخ نیز باید همین مسیر را برگردد. این فاصله فیزیکی باعث ایجاد تأخیر یا Latency می‌شود که مستقیماً بر تجربه کاربری تأثیر منفی می‌گذارد.

۱.۲- راه حل: Edge Computing چیست؟
  • مفهوم: Edge Computing یعنی اجرای کد شما نه در یک سرور مرکزی، بلکه در شبکه‌ای گسترده از سرورها که در سراسر جهان و نزدیک به کاربران نهایی توزیع شده‌اند. به این نقاط توزیع شده، PoP (Point of Presence) گفته می‌شود.
  • یک مقایسه آشنا: شما احتمالاً با CDN (Content Delivery Network) برای سرو کردن فایل‌های استاتیک (مثل تصاویر، CSS و JavaScript) آشنا هستید. CDN این فایل‌ها را در نقاط مختلف دنیا کَش می‌کند تا سریع‌تر به دست کاربر برسند. Edge Computing را به عنوان یک CDN برای کدهای اجرایی خودتان در نظر بگیرید!

۱.۳- Cloudflare Workers چیست؟
Cloudflare Workers یک پلتفرم Serverless است که به شما اجازه می‌دهد کدهای JavaScript یا TypeScript (و به صورت آزمایشی کدهای کامپایل شده به WebAssembly مانند .NET) را مستقیماً روی شبکه Edge کلادفلر اجرا کنید.
وقتی درخواستی به دامنه شما ارسال می‌شود، به جای اینکه مستقیماً به سرور اصلی شما (Origin Server) برود، ابتدا توسط نزدیک‌ترین Worker به کاربر دریافت و پردازش می‌شود.

۱.۴- معماری جادویی: V8 Isolates در مقابل کانتینرها (Docker)
  • چیزی که با آن آشنا هستید (کانتینرها): در دنیای .NET، ما از Docker برای پکیج کردن اپلیکیشن به همراه تمام نیازمندی‌هایش، حتی یک نسخه کوچک از سیستم‌عامل، استفاده می‌کنیم. راه‌اندازی یک کانتینر جدید چند صد میلی‌ثانیه تا چند ثانیه زمان می‌برد که به آن Cold Start می‌گویند.
  • روش Cloudflare Workers (ایزوله‌ها): کلادفلر از تکنولوژی به نام V8 Isolates استفاده می‌کند که توسط موتور جاوااسکریپت V8 گوگل کروم قدرت گرفته است. هر ایزوله یک محیط اجرای کد بسیار سبک و ایزوله است، بدون سربار سیستم‌عامل.
  • مزیت اصلی: راه‌اندازی یک ایزوله کمتر از ۵ میلی‌ثانیه طول می‌کشد! این یعنی عملاً Cold Start وجود ندارد. این معماری به کلادفلر اجازه می‌دهد تا روی یک سرور فیزیکی، هزاران Worker را با هزینه بسیار پایین اجرا کند.

۱.۵- جمع‌بندی مزایا برای یک توسعه‌دهنده ASP.NET Core:
  • سرعت فوق‌العاده: کاهش چشمگیر Latency برای کاربران سراسر جهان.
  • حفاظت از سرور اصلی: شما می‌توانید درخواست‌های مخرب، بات‌ها یا ترافیک اسپم را در Edge شناسایی و مسدود کنید، پیش از آنکه اصلاً به سرور ASP.NET Core شما برسند.
  • کاهش هزینه و بار سرور: با مدیریت کردن کش، ریدایرکت‌ها و حتی بخشی از منطق برنامه در Edge، بار پردازشی سرور اصلی شما به شدت کاهش می‌یابد.
  • مقیاس‌پذیری بی‌نهایت: کد شما به صورت خودکار و بدون نیاز به هیچ‌گونه تنظیماتی در سراسر جهان مقیاس‌پذیر می‌شود.


درس ۲: راه‌اندازی اولین Worker

حالا زمان آن است که دست به کد شویم. برای کار با Workers، ما از ابزار خط فرمان (CLI) کلادفلر به نام Wrangler استفاده می‌کنیم.
یک مقایسه آشنا:Wrangler برای دنیای Workers، معادل dotnet CLI در دنیای .NET است.

۲.۱- پیش‌نیازها:
یک حساب کاربری رایگان در Cloudflare.
نصب Node.js و NPM روی سیستم شما. (نگران نباشید، شما قرار نیست Node.js دولوپر شوید! Wrangler با این ابزارها ساخته شده است).

۲.۲- مراحل راه‌اندازی:
نصب Wrangler: ترمینال یا PowerShell را باز کرده و دستور زیر را اجرا کنید:
npm install -g wrangler
احراز هویت Wrangler: با اجرای دستور زیر، به حساب کلادفلر خود متصل می‌شوید. یک صفحه مرورگر باز می‌شود تا لاگین کنید.
wrangler login
ساخت پروژه جدید: یک پوشه برای پروژه خود بسازید و در آن دستور زیر را اجرا کنید:
wrangler init my-first-worker
این دستور یک پروژه ساده Worker با فایل‌های ضروری ایجاد می‌کند.

بررسی ساختار پروژه:
  • src/index.ts (یا .js): این فایل اصلی کد شماست. معادل فایل Program.cs یا یک Controller در پروژه ASP.NET Core شما.
  • wrangler.toml: این فایل تنظیمات پروژه شماست. معادل فایل appsettings.json یا .csproj. در اینجا نام Worker، دامنه و سایر تنظیمات را مشخص می‌کنید.

تست محلی (Local Testing): برای اجرای Worker روی سیستم خودتان، از دستور زیر استفاده کنید. این دستور یک سرور محلی راه‌اندازی می‌کند که رفتار Edge را شبیه‌سازی می‌کند. (معادل dotnet watch run).
wrangler dev
استقرار در Edge: پس از اطمینان از صحت کد، با یک دستور آن را در شبکه جهانی کلادفلر منتشر کنید!
wrangler deploy
تبریک! کد شما اکنون در سراسر جهان فعال است.


درس ۳: مفاهیم پایه در کدنویسی Workers

کدنویسی در Workers بسیار سرراست است و بر پایه دو آبجکت اصلی Request و Response بنا شده است.
یک مقایسه آشنا: این مدل بسیار شبیه به کار با HttpRequest و IActionResult در یک Minimal API یا کنترلر ASP.NET Core است.

۳.۱- نقطه ورود: تابع fetch
هر Worker یک نقطه ورود اصلی دارد که یک تابع fetch است. این تابع به ازای هر درخواست ورودی اجرا می‌شود.
// src/index.ts
export default {
  async fetch(request: Request): Promise<Response> {
    // این اولین Worker من است!
    return new Response('Hello from the Edge!');
  },
};

۳.۲- کار با آبجکت Request
آبجکت request شامل تمام اطلاعات درخواست ورودی است:
export default {
  async fetch(request: Request): Promise<Response> {
    const url = request.url; // آدرس کامل درخواست
    const method = request.method; // متد HTTP (GET, POST, etc.)
    const userAgent = request.headers.get('User-Agent'); // خواندن یک هدر خاص

    const responseBody = `You made a ${method} request to ${url}. Your User-Agent is: ${userAgent}`;
    return new Response(responseBody);
  },
};

۳.۳- ساخت آبجکت Response
برای ارسال پاسخ به کاربر، شما یک نمونه جدید از آبجکت Response می‌سازید.
  • new Response(body, options)
می‌توانید بدنه (body)، کد وضعیت (status) و هدرها (headers) را مشخص کنید:
export default {
  async fetch(request: Request): Promise<Response> {
    const jsonData = { id: 1, name: 'Sample Data' };

    return new Response(JSON.stringify(jsonData), {
      status: 200, // کد وضعیت OK
      headers: {
        'Content-Type': 'application/json', // تنظیم هدر
        'X-Powered-By': 'Cloudflare-Workers'
      },
    });
  },
};

۳.۴- مسیریابی (Routing) ساده
در ساده‌ترین حالت، می‌توانید با استفاده از if/else یا switch بر اساس URL درخواست، مسیریابی را انجام دهید.
export default {
  async fetch(request: Request): Promise<Response> {
    const url = new URL(request.url);

    if (url.pathname === '/api/user') {
      return new Response('User Profile Data');
    }

    if (url.pathname.startsWith('/admin')) {
      return new Response('Admin area access denied!', { status: 403 });
    }

    return new Response('Welcome to the homepage!');
  },
};
نکته برای حرفه‌ای‌ها: هرچند این روش ساده است، اما برای برنامه‌های بزرگ‌تر کتابخانه‌های مسیریابی مخصوص Workers وجود دارد که تجربه ای شبیه به Routing در ASP.NET Core را فراهم می‌کنند.

جمع‌بندی بخش اول:
تا اینجا شما با فلسفه و قدرت Cloudflare Workers آشنا شدید، ابزارهای لازم را نصب کردید و توانستید یک برنامه ساده را در لبه شبکه مستقر کنید. شما حالا مفاهیم بنیادی Request و Response را درک کرده‌اید. در بخش بعدی، ما از این دانش پایه استفاده خواهیم کرد تا Workers را به عنوان یک "Middleware" قدرتمند در جلوی اپلیکیشن‌های ASP.NET Core خود قرار دهیم.

برای شروع می‌توانید به ویدیوی آموزشی «Learn Cloudflare Workers 101 - Full Course for Beginners» هم مراجعه کنید.