DarbanDev
DarbanDev
خواندن ۷ دقیقه·۲۴ روز پیش

میکروسرویس‌ها را با پروژه StackPay یاد بگیرید

میکروسرویس‌ها را با پروژه StackPay یاد بگیرید: از ایده تا اجرا!

سلام به همه توسعه‌دهندگان عزیز!

هدف اصلی من از ساخت StackPay این بود که معماری میکروسرویس‌ها را به ساده‌ترین شکل ممکن آموزش دهم. این پروژه یک سیستم ثبت سفارش آنلاین است که با دو سرویس مستقل FastAPI ساخته شده تا بتوانید ارتباط بین سرویس‌ها را در عمل ببینید. اگر می‌خواهید بدانید چطور سیستم‌های بزرگ را به بخش‌های کوچک تقسیم کنید، این مقاله را تا آخر بخوانید!

ایده اولیه: دو وب‌اپلیکیشن مستقل

وقتی شروع به طراحی StackPay کردم، اولین سوالی که برایم پیش آمد این بود:

چطور می‌شود یک سیستم پیچیده را به بخش‌های ساده و مستقل تقسیم کرد؟

برای پاسخ به این سوال، دو سرویس جداگانه طراحی کردم:

  1. سرویس محصولات: مدیریت اطلاعات محصولات (نام، قیمت، موجودی).
  2. سرویس سفارش‌ها: ثبت و پیگیری سفارش‌ها.

هر سرویس به تنهایی کار می‌کند و حتی اگر یکی از کار بیفتد، دیگری به کارش ادامه می‌دهد!

چرا فرانت‌اند ReactJS؟

برای بخش فرانت‌اند ReactJS را انتخاب کردم، نه Vue یا NextJS. دلیلش این است:

  • جامعه بزرگ: React یکی از محبوب‌ترین کتابخانه‌های جاوااسکریپت است با هزاران منبع آموزشی رایگان.
  • انعطاف‌پذیری: می‌توانید از Redux برای مدیریت حالت یا CSS Modules برای استایل‌دهی استفاده کنید.
  • سازگاری با میکروسرویس‌ها: React به راحتی با API‌های مختلف کار می‌کند و برای پروژه‌های چندسرویسی عالی است.

چرا NoSQL و چرا Redis؟

۱. مزایای NoSQL برای میکروسرویس‌ها

  • مقیاس‌پذیری: بدون نیاز به تغییر ساختار، داده‌ها را مدیریت کنید.
  • سرعت بالا: پردازش میلی‌ثانیه‌ای حتی برای داده‌های حجیم.

۲. چرا Redis؟

  • ذخیره‌سازی در RAM: دسترسی به داده‌ها با سرعت نور!
  • مدیریت صف‌ها: با Redis CLI می‌توانید پیام‌ها بین سرویس‌ها را مدیریت کنید.

راه‌اندازی Redis Cloud در ایران

برای استفاده از Redis Cloud (مدیریت ابری Redis):

  1. به سایت Redis Labs بروید و یک حساب بسازید.
  2. پلن مورد نظرتان را انتخاب کنید (پلن رایگان برای شروع مناسب است).
  3. اگر در ایران هستید و محدودیت دارید، می‌توانید از سرویس‌های داخلی مثل آریا‌کلاود یا پارس‌پک استفاده کنید که خدمات مشابه ارائه می‌دهند.

ویژگی‌های کلیدی StackPay

  • ثبت سفارش: انتخاب محصول و تعداد با چند کلیک.
  • خطایابی هوشمند: اگر کاربر عدد منفی وارد کند، سیستم به او هشدار می‌دهد.
  • واکنش‌گرا: طراحی مناسب برای موبایل و دسکتاپ.

فایل‌های کانسیومر (Consumer) و اهمیت آن‌ها

در معماری میکروسرویس‌ها، کانسیومرها نقش حیاتی دارند. این فایل‌ها مسئول دریافت و پردازش پیام‌های ارسال‌شده بین سرویس‌ها هستند. مثلاً وقتی کاربری سفارش جدیدی ثبت می‌کند، سرویس سفارش‌ها یک پیام به Redis می‌فرستد و کانسیومرهای سرویس محصولات این پیام را دریافت می‌کنند تا موجودی محصول را به‌روزرسانی کنند. این‌گونه سرویس‌ها بدون وابستگی مستقیم به هم کار می‌کنند و سیستم کلی پایدارتر می‌شود.

چرا کانسیومرها ضروری هستند؟

  • عدم وابستگی: سرویس‌ها نیازی ندارند مستقیماً به هم متصل باشند.
  • پردازش ناهمزمان: حتی اگر یک سرویس از کار بیفتد، پیام‌ها در صف می‌مانند و بعداً پردازش می‌شوند.
  • مقیاس‌پذیری: می‌توانید تعداد کانسیومرها را بر اساس حجم کار افزایش دهید.

نصب و راه‌اندازی

ابتدا ریپازیتوری را کلون کنید و وارد پوشه پروژه شوید:

# کلون ریپازیتوری git clone https://github.com/idarbandi/StackPay.git cd StackPay

سپس فرانت‌اند و بک‌اند را نصب کنید:

# نصب فرانت‌اند cd frontend npm install # نصب بک‌اند cd backend pip install -r requirements.txt

برای اجرای سرویس‌ها، دستورات زیر را اجرا کنید:

# اجرای فرانت‌اند npm start # اجرای بک‌اند uvicorn main:app --reload

نحوه تست سرویس‌های پرداخت و انبارداری

پس از نصب و راه‌اندازی سرویس‌ها، می‌توانید با استفاده از دستورات زیر هر دو برنامه پرداخت و انبارداری را تست کنید.

تست سرویس محصولات (Inventory Service)

# اجرای سرویس محصولات cd inventory_service uvicorn main:app --reload --port 8000
# دریافت لیست محصولات curl -X GET http://localhost:8000/products # افزودن محصول جدید curl -X POST http://localhost:8000/products \ -H "Content-Type: application/json" \ -d '{"name": "Laptop", "price": 1500, "quantity": 10}'

تست سرویس سفارش‌ها (Order Service)

# اجرای سرویس سفارش‌ها cd order_service uvicorn main:app --reload --port 8001
# ثبت سفارش جدید curl -X POST http://localhost:8001/orders \ -H "Content-Type: application/json" \ -d '{"product_id": 1, "quantity": 2}' # دریافت لیست سفارش‌ها curl -X GET http://localhost:8001/orders

توضیحات:

  • با اجرای سرویس محصولات در پورت 8000 و سرویس سفارش‌ها در پورت 8001، می‌توانید هر سرویس را به‌صورت مستقل تست کنید.
  • در درخواست‌های بالا، از متدهای HTTP مناسب (GET برای دریافت داده و POST برای ایجاد داده جدید) استفاده شده است.
  • حتماً آیدی محصولات و مقادیر را با داده‌های موجود در سیستم خود هماهنگ کنید.

نکته مهم درباره تست سرویس‌ها

برای اینکه مطمئن شوید ارتباط بین سرویس‌ها به‌درستی عمل می‌کند، می‌توانید سناریوی زیر را تست کنید:

  1. ایجاد یک محصول جدید در سرویس محصولات:curl -X POST http://localhost:8000/products \
    -H "Content-Type: application/json" \
    -d '{"name": "Smartphone", "price": 800, "quantity": 50}'
  2. ثبت یک سفارش جدید برای همان محصول در سرویس سفارش‌ها:curl -X POST http://localhost:8001/orders \
    -H "Content-Type: application/json" \
    -d '{"product_id": 1, "quantity": 5}'
  3. بررسی موجودی محصول پس از ثبت سفارش تا ببینید موجودی به‌درستی کاهش یافته است:curl -X GET http://localhost:8000/products/1

توجه: اگر همه چیز به‌درستی پیکربندی شده باشد، موجودی محصول باید به میزان سفارش کاهش یافته باشد. این نشان می‌دهد که سرویس‌ها به‌خوبی با یکدیگر در ارتباط هستند و پیام‌ها از طریق Redis بین آن‌ها منتقل می‌شوند.

کامنت‌ها و داک‌استرینگ‌های فارسی در کد

اگر به کدهای پروژه نگاهی بیندازید، متوجه خواهید شد که برای تمامی فایل‌های Python و JavaScript از کامنت‌ها و داک‌استرینگ‌های خوانا به زبان فارسی استفاده کرده‌ام. این توضیحات به شما کمک می‌کنند تا:

  • منطق پشت هر تابع و کلاس را بهتر درک کنید.
  • نحوه ارتباط بین سرویس‌ها را بیاموزید.
  • مفاهیم پیچیده را به زبان ساده بفهمید.

مثال از داک‌استرینگ‌های فارسی در Python:

class Product(BaseModel): """ کلاس محصول که اطلاعات محصول را نگهداری می‌کند. فیلدها: - name: نام محصول - price: قیمت محصول - quantity: موجودی محصول در انبار """ name: str price: float quantity: int

استفاده از Swagger UI برای تست API

یکی از ابزارهای قدرتمند برای تست و مستندسازی API، Swagger UI است. با استفاده از Swagger UI، می‌توانید به‌راحتی تمامی endpointهای خود را مشاهده و تست کنید، بدون نیاز به ابزارهایی مانند Postman.

مزایای استفاده از Swagger UI

  • رابط کاربری زیبا و کاربرپسند: نیازی به نوشتن دستی درخواست‌ها نیست؛ همه چیز از طریق رابط گرافیکی انجام می‌شود.
  • مستندسازی خودکار: توضیحات endpointها، پارامترها و پاسخ‌ها به‌صورت خودکار تولید می‌شود.
  • آزمایش سریع: امکان ارسال درخواست‌ها و مشاهده پاسخ‌ها در لحظه.

اضافه کردن Swagger UI به پروژه StackPay

از آنجا که ما از FastAPI استفاده می‌کنیم، Swagger UI به‌صورت پیش‌فرض در آن تعبیه شده است. برای دسترسی به Swagger UI، کافی است پس از اجرای سرویس‌ها، به آدرس‌های زیر مراجعه کنید:

با باز کردن این آدرس‌ها در مرورگر، می‌توانید تمامی endpointهای مربوط به هر سرویس را مشاهده و تست کنید.

استفاده از Swagger UI در پروژه‌های Django

اگر می‌خواهید Swagger UI را به برنامه‌های Django خود اضافه کنید، می‌توانید از پکیج drf-yasg استفاده کنید. مراحل زیر را دنبال کنید:

<>نصب پکیج drf-yasg:pip install drf-yasg
اضافه کردن به INSTALLED_APPS در فایل settings.py:INSTALLED_APPS = [ # ... 'rest_framework', 'drf_yasg', # ... ]
تعریف مسیرهای Swagger در فایل urls.py:from django.urls import path, re_path from rest_framework import permissions from drf_yasg.views import get_schema_view from drf_yasg import openapi schema_view = get_schema_view( openapi.Info( title="API Documentation", default_version='v1', description="توضیحات تست", ), public=True, permission_classes=(permissions.AllowAny,), ) urlpatterns = [ # ... re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'), path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'), # ... ]
  1. دسترسی به Swagger UI:پس از اجرای سرور Django، می‌توانید به آدرس http://localhost:8000/swagger/ مراجعه کنید تا Swagger UI را ببینید.

توجه: حتماً از Django REST Framework برای ساخت APIهای خود استفاده کنید تا Swagger بتواند آن‌ها را تشخیص دهد.

دعوت به همکاری و گسترش پروژه

از شما دعوت می‌کنم تا با مشارکت در توسعه StackPay، به بهبود و گسترش این پروژه کمک کنید. ایده‌ها، پیشنهاد‌ها و فیدبک‌های شما می‌تواند به ارتقای کیفیت این پروژه بیانجامد.

  • گزارش باگ‌ها: اگر با مشکلی مواجه شدید، آن را در بخش Issues گیت‌هاب مطرح کنید.
  • افزودن ویژگی‌های جدید: می‌توانید Pull Request‌های خود را برای اضافه کردن قابلیت‌های جدید ارسال کنید.
  • ترجمه و مستندسازی: کمک به بهبود مستندات و ترجمه آن به زبان‌های دیگر.

منابع یادگیری بیشتر

اگر به یادگیری بیشتر درباره میکروسرویس‌ها، FastAPI، و Redis علاقه‌مند هستید، منابع زیر را توصیه می‌کنم:

  • مستندات رسمی FastAPI: FastAPI Documentation
  • آموزش‌های Redis: Redis Tutorials
  • مفاهیم میکروسرویس‌ها: مقالات و کتاب‌های مرتبط با معماری میکروسرویس‌ها.
  • استفاده از Swagger با Django: drf-yasg Documentation

در پایان، امیدوارم این پروژه و توضیحات آن برای شما مفید بوده باشد. اگر سوالی داشتید یا نیاز به راهنمایی بیشتر داشتید، حتماً با من در تماس باشید.

تماس با من:

ایمیل: darbandidr99@gmail.com

گیت‌هاب: idarbandi

مقاله در لینکدین : انگلیسی

اگر علاقه‌مند به یادگیری عمیق‌تر هستید، توصیه می‌کنم کدهای پروژه را با دقت دنبال کنید. در تمامی فایل‌های Python و JavaScript از کامنت‌ها و داک‌استرینگ‌های فارسی و مفهومی استفاده کرده‌ام. این توضیحات به زبان فارسی عمیق نوشته شده‌اند تا درک بهتری از منطق برنامه‌ها و ساختار میکروسرویس‌ها پیدا کنید.

با بررسی کدها، می‌توانید نحوه ارتباط بین سرویس‌ها، مدیریت داده‌ها، و بهینه‌سازی سیستم را به‌خوبی بیاموزید. اگر سوالی داشتید یا نیاز به راهنمایی بیشتر داشتید، حتماً با من در تماس باشید.

موفق باشید! 🌟

یک برنامه نویس جوان عاشق چالش مسئولیت پذیر و متعهد به دنبال تجارب برنامه نویسی
شاید از این پست‌ها خوشتان بیاید