سلام به همه توسعهدهندگان عزیز!
هدف اصلی من از ساخت StackPay این بود که معماری میکروسرویسها را به سادهترین شکل ممکن آموزش دهم. این پروژه یک سیستم ثبت سفارش آنلاین است که با دو سرویس مستقل FastAPI ساخته شده تا بتوانید ارتباط بین سرویسها را در عمل ببینید. اگر میخواهید بدانید چطور سیستمهای بزرگ را به بخشهای کوچک تقسیم کنید، این مقاله را تا آخر بخوانید!
وقتی شروع به طراحی StackPay کردم، اولین سوالی که برایم پیش آمد این بود:
چطور میشود یک سیستم پیچیده را به بخشهای ساده و مستقل تقسیم کرد؟
برای پاسخ به این سوال، دو سرویس جداگانه طراحی کردم:
هر سرویس به تنهایی کار میکند و حتی اگر یکی از کار بیفتد، دیگری به کارش ادامه میدهد!
برای بخش فرانتاند ReactJS را انتخاب کردم، نه Vue یا NextJS. دلیلش این است:
برای استفاده از Redis Cloud (مدیریت ابری Redis):
در معماری میکروسرویسها، کانسیومرها نقش حیاتی دارند. این فایلها مسئول دریافت و پردازش پیامهای ارسالشده بین سرویسها هستند. مثلاً وقتی کاربری سفارش جدیدی ثبت میکند، سرویس سفارشها یک پیام به 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
پس از نصب و راهاندازی سرویسها، میتوانید با استفاده از دستورات زیر هر دو برنامه پرداخت و انبارداری را تست کنید.
# اجرای سرویس محصولات 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}'
# اجرای سرویس سفارشها 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
توضیحات:
برای اینکه مطمئن شوید ارتباط بین سرویسها بهدرستی عمل میکند، میتوانید سناریوی زیر را تست کنید:
curl -X POST http://localhost:8000/products \
-H "Content-Type: application/json" \
-d '{"name": "Smartphone", "price": 800, "quantity": 50}'
curl -X POST http://localhost:8001/orders \
-H "Content-Type: application/json" \
-d '{"product_id": 1, "quantity": 5}'
curl -X GET http://localhost:8000/products/1
توجه: اگر همه چیز بهدرستی پیکربندی شده باشد، موجودی محصول باید به میزان سفارش کاهش یافته باشد. این نشان میدهد که سرویسها بهخوبی با یکدیگر در ارتباط هستند و پیامها از طریق Redis بین آنها منتقل میشوند.
اگر به کدهای پروژه نگاهی بیندازید، متوجه خواهید شد که برای تمامی فایلهای Python و JavaScript از کامنتها و داکاسترینگهای خوانا به زبان فارسی استفاده کردهام. این توضیحات به شما کمک میکنند تا:
مثال از داکاسترینگهای فارسی در Python:
class Product(BaseModel): """ کلاس محصول که اطلاعات محصول را نگهداری میکند. فیلدها: - name: نام محصول - price: قیمت محصول - quantity: موجودی محصول در انبار """ name: str price: float quantity: int
یکی از ابزارهای قدرتمند برای تست و مستندسازی API، Swagger UI است. با استفاده از Swagger UI، میتوانید بهراحتی تمامی endpointهای خود را مشاهده و تست کنید، بدون نیاز به ابزارهایی مانند Postman.
از آنجا که ما از FastAPI استفاده میکنیم، Swagger UI بهصورت پیشفرض در آن تعبیه شده است. برای دسترسی به Swagger UI، کافی است پس از اجرای سرویسها، به آدرسهای زیر مراجعه کنید:
با باز کردن این آدرسها در مرورگر، میتوانید تمامی endpointهای مربوط به هر سرویس را مشاهده و تست کنید.
اگر میخواهید 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'), # ... ]
توجه: حتماً از Django REST Framework برای ساخت APIهای خود استفاده کنید تا Swagger بتواند آنها را تشخیص دهد.
از شما دعوت میکنم تا با مشارکت در توسعه StackPay، به بهبود و گسترش این پروژه کمک کنید. ایدهها، پیشنهادها و فیدبکهای شما میتواند به ارتقای کیفیت این پروژه بیانجامد.
اگر به یادگیری بیشتر درباره میکروسرویسها، FastAPI، و Redis علاقهمند هستید، منابع زیر را توصیه میکنم:
در پایان، امیدوارم این پروژه و توضیحات آن برای شما مفید بوده باشد. اگر سوالی داشتید یا نیاز به راهنمایی بیشتر داشتید، حتماً با من در تماس باشید.
تماس با من:
ایمیل: darbandidr99@gmail.com
گیتهاب: idarbandi
مقاله در لینکدین : انگلیسی
اگر علاقهمند به یادگیری عمیقتر هستید، توصیه میکنم کدهای پروژه را با دقت دنبال کنید. در تمامی فایلهای Python و JavaScript از کامنتها و داکاسترینگهای فارسی و مفهومی استفاده کردهام. این توضیحات به زبان فارسی عمیق نوشته شدهاند تا درک بهتری از منطق برنامهها و ساختار میکروسرویسها پیدا کنید.
با بررسی کدها، میتوانید نحوه ارتباط بین سرویسها، مدیریت دادهها، و بهینهسازی سیستم را بهخوبی بیاموزید. اگر سوالی داشتید یا نیاز به راهنمایی بیشتر داشتید، حتماً با من در تماس باشید.
موفق باشید! 🌟