de_DEen_USes_ESfa_IRfr_FRhi_INja

یک مطالعه موردی جامع و مرحله‌به‌مرحله: به‌کارگیری مدل C4 در سیستم بانکداری اینترنتی (شرکت بیگ بانک plc)

این مدل C4, که توسط سیمون براون ایجاد شده است، روشی ساده، سلسله‌مراتبی و دوست‌داشتنی برای توسعه‌دهندگان برای نمایش معماری نرم‌افزار است. این مدل از چهار سطح انتزاعی (که به همین دلیل «C4» نامیده می‌شود) برای توصیف یک سیستم از نمای کلی تا جزئیات سطح کد استفاده می‌کند:

  1. زمینه سیستم (سطح 1) – دید کلی: سیستم و کاربران یا وابستگی‌های خارجی آن.
  2. کانتینرها (سطح 2) – انتخاب‌های فناوری سطح بالا و مسئولیت‌ها.
  3. اجزاء (سطح 3) – بلوک‌های ساختاری منطقی اصلی درون یک کانتینر.
  4. کد (سطح 4) – جزئیات اختیاری سطح کلاس یا ساختار کد.

این مدل توسط سه نوع دیگر از نمودارها پشتیبانی می‌شود:

  • چشم‌انداز سیستم
  • پویا
  • نصب و راه‌اندازی

این مدل وابسته به نمادگذاری نیست (شما می‌توانید هر ابزار نمودارسازی را استفاده کنید) و بر روی شفافیت، هماهنگی و جزئیات مناسب برای مخاطب تمرکز دارد. به دلیل جلوگیری از نمودارهای معماری پیچیده و شبیه به کره خاکستری و توانایی مقیاس‌پذیری از طرح‌های سیاه‌برد تا مستندات خودکار، به‌طور گسترده مورد استفاده قرار می‌گیرد.

برای این مطالعه موردی هدفمند, ما از مثال استاندارد موجود در وب‌سایت رسمی C4 استفاده می‌کنیم: سیستم بانکداری اینترنتی برای شرکت فیکشنی «بیگ بانک plc». هدف کسب‌وکار این است که مشتریان فردی بتوانند حساب‌های خود را مشاهده کنند و پرداخت‌های آنلاین انجام دهند در حالی که با سیستم‌های اصلی بانک موجود یکپارچه شوند.

ما از هر سطح با:

  • هدف و مخاطب
  • عناصر کلیدی + مسئولیت‌ها
  • رابطه‌ها
  • یک نمودار C4 آماده‌استفاده نمودار PlantUML C4(PlantUML از سینتکس C4 پشتیبانی می‌کند و در اکثر نمایشگرهای مارکدوان به زیبایی نمایش داده می‌شود)
  • دلیل و تصمیمات کلیدی
  • چگونه این نمودار به ذینفعان کمک می‌کند

مرحله ۱: تعیین دامنه و ایجاد نمودار زمینه سیستم (سطح ۱)

هدف: نشان دادن اینکه سیستم بانکداری اینترنتی جدید چگونه در دنیا جای می‌گیرد. مخاطب: ذینفعان کسب‌وکار، افراد غیرفنی، اعضای جدید تیم.

عناصر (از مثال رسمی):

  • مشتری بانکداری شخصی (فرد) – مشتری با یک یا چند حساب بانکی شخصی.
  • سیستم بانکداری اینترنتی (سیستم نرم‌افزاری) – سیستم جدیدی که در حال ساخت آن هستیم.
  • سیستم بانکداری اصلی (سیستم نرم‌افزاری، موجود) – ماشین اصلی که داده‌های مشتری، حساب‌ها و تراکنش‌ها را مدیریت می‌کند.
  • سیستم ایمیل (سیستم نرم‌افزاری، خارجی) – سرویس ایمیل ساده AWS (AWS SES) برای ارسال تأییدیه‌ها.

رابطه‌ها:

  • مشتری → استفاده می‌کند از → سیستم بانکداری اینترنتی (برای مشاهده حساب‌ها و انجام پرداخت‌ها)
  • سیستم بانکداری اینترنتی → استفاده می‌کند از → سیستم بانکداری اصلی (برای داده‌های حساب و پرداخت‌ها)
  • سیستم بانکداری اینترنتی → ایمیل ارسال می‌کند از طریق → سیستم ایمیل

اینجا یک نمودار زمینه C4 PlantUML:


@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml

LAYOUT_TOP_DOWN()
LAYOUT_WITH_LEGEND()

title نمودار زمینه سیستم (سطح ۱) برای سیستم بانکداری اینترنتی

Person(customer, "مشتری بانکداری شخصی", "مشتری با یک یا چند حساب بانکی شخصی.")
System(internet_banking_system, "سیستم بانکداری اینترنتی", "سیستم جدید برای مشاهده حساب‌ها و انجام پرداخت‌ها.")
System(core_banking_system, "سیستم بانکداری اصلی", "ماشین اصلی موجود که داده‌های مشتری، حساب‌ها و تراکنش‌ها را مدیریت می‌کند.")
System_Ext(email_system, "سیستم ایمیل", "سرویس ایمیل ساده AWS (AWS SES) برای ارسال تأییدیه‌ها.")

Rel(customer, internet_banking_system, "استفاده می‌کند از")
Rel(internet_banking_system, core_banking_system, "استفاده می‌کند از")
Rel(internet_banking_system, email_system, "ایمیل ارسال می‌کند از طریق")

Lay_D(customer, internet_banking_system)
Lay_D(internet_banking_system, core_banking_system)
Lay_U(email_system, internet_banking_system)
@enduml

دلیل و ارزش: این نمودار تکی بلافاصله پاسخ می‌دهد به «چه چیزی در حال ساخت هستیم و با چه کسانی ارتباط داریم؟» با نشان دادن صریح وابستگی‌های خارجی، از گسترش دامنه جلوگیری می‌کند. ذینفعان کسب‌وکار آن را دوست دارند زیرا هنوز جزئیات فنی وجود ندارد.

مرحله ۲: نمودار کانتینر (سطح ۲)

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

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

  • برنامه صفحه تکی (مرورگر اینترنت – جاوااسکریپت + آنگولار) – رابط کاربری کامل بانکداری اینترنتی.
  • اپلیکیشن موبایل (دستگاه موبایل – ناتیو iOS/Android یا ریاکت نیتیو) – عملکرد محدود برای استفاده در حال حرکت.
  • اپلیکیشن API (طرف سرور – جاوا + اسپرینگ بوت) – API JSON/HTTPS که توسط هر دو سمت جلویی استفاده می‌شود.
  • پایگاه داده (پایگاه داده رابطه‌ای – پست‌گری‌اس‌کیل) – داده‌های جلسه، ترجیحات کاربر، خلاصه‌های حساب کش شده را ذخیره می‌کند (داده‌های اصلی در مینفریم باقی می‌مانند).

رابطه‌های کلیدی (سیستم‌های خارجی همانند سطح ۱):

  • SPA و اپلیکیشن موبایل → تماس → اپلیکیشن API
  • اپلیکیشن API ↔ پایگاه داده
  • اپلیکیشن API → سیستم بانکداری اصلی و سیستم ایمیل

نمودار کانتینر C4 PlantUML:


@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
!include https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons/angular.puml
!include https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons/java.puml
!include https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons/postgresql.puml

LAYOUT_TOP_DOWN()
LAYOUT_WITH_LEGEND()

title نمودار کانتینر C4 برای سیستم بانکداری اینترنتی

Person(customer, "مشتری بانکداری شخصی", "مشتری با یک یا چند حساب بانکی شخصی.")

System_Boundary(internet_banking_system, "سیستم بانکداری اینترنتی", "سیستم جدید برای مشاهده حساب‌ها و انجام پرداخت‌ها.") {
Container(spa, "برنامه صفحه تکی", "جاوااسکریپت + آنگولار", "رابط کاربری کامل بانکداری اینترنتی", $sprite="angular")
Container(mobile_app, "اپلیکیشن موبایل", "iOS/Android (ریاکت نیتیو)", "عملکرد محدود برای استفاده در حال حرکت", $sprite="react")
Container(api_app, "اپلیکیشن API", "جاوا + اسپرینگ بوت", "API JSON/HTTPS که توسط هر دو سمت جلویی استفاده می‌شود", $sprite="java")
ContainerDb(database, "پایگاه داده", "پست‌گری‌اس‌کیل", "داده‌های جلسه، ترجیحات کاربر، خلاصه‌های حساب کش شده", $sprite="postgresql")
}

System(core_banking_system, "سیستم بانکداری اصلی", "مینفریم موجود که داده‌های مشتری، حساب‌ها و تراکنش‌ها را مدیریت می‌کند.")
System_Ext(email_system, "سیستم ایمیل", "سرویس ساده ایمیل AWS (AWS SES) برای ارسال تأییدیه‌ها.")

' روابط
Rel(customer, spa, "استفاده می‌کند از", "HTTPS")
Rel(customer, mobile_app, "استفاده می‌کند از", "HTTPS")
Rel(spa, api_app, "تماس می‌گیرد به", "JSON/HTTPS")
Rel(mobile_app, api_app, "تماس می‌گیرد به", "JSON/HTTPS")
Rel(api_app, database, "خواندن و نوشتن به", "JDBC/SQL")
Rel(api_app, core_banking_system, "پرس و جو / به‌روزرسانی", "JSON/HTTPS")
Rel(api_app, email_system, "ارسال ایمیل از طریق", "HTTPS")

' نکات چیدمان (اختیاری – به PlantUML کمک می‌کند تا عناصر را بهتر چیده شود)
Lay_D(customer, internet_banking_system)
Lay_D(internet_banking_system, core_banking_system)
Lay_U(email_system, internet_banking_system)

@enduml

دلیل: ما الگوی مدرن SPA + پایه‌گاه API برای وب را انتخاب کردیم، اپلیکیشن موبایل ناتیو برای عملکرد، و پایگاه داده سبک‌وزن نگه داشتیم (بیشتر داده‌ها در مینفریم قدیمی زندگی می‌کنند). این نمودار منبع واحد واقعی برای تصمیمات فناوری سطح بالا است و به تیم‌های DevOps در برنامه‌ریزی زیرساخت کمک می‌کند.

مرحله ۳: نمودار مؤلفه (سطح ۳)

هدف: به یک کانتینر (معمولاً پیچیده‌ترین آن – اپلیکیشن API) زوم کنید و مؤلفه‌های منطقی اصلی آن را نشان دهید. مخاطب: تیم‌های توسعه.

مثال: مؤلفه‌های داخل اپلیکیشن API:

  • کنترلر حساب‌ها (Spring MVC)
  • کنترلر احراز هویت
  • کنترلر بازنشانی رمز عبور
  • اجزای امنیتی (مدیریت احراز هویت، JWT و غیره)
  • اجزای مدیریت حساب (هماهنگ‌کننده فراخوانی‌ها به سیستم بانکی اصلی)
  • اجزای اطلاع‌رسانی ایمیلی

نمودار جزئیات C4 PlantUML (متمرکز بر کاربرد API):


@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml

LAYOUT_WITH_LEGEND()

title نمودار جزئیات سیستم بانکداری اینترنتی - کاربرد API

Container(spa, "برنامه صفحه تکی", "javascript و angular", "تمامی قابلیت‌های بانکداری اینترنتی را به مشتریان از طریق مرورگر وب ارائه می‌دهد.")
Container(ma, "اپلیکیشن موبایل", "Xamarin", "مجموعه‌ای محدود از قابلیت‌های بانکداری اینترنتی را به مشتریان از طریق دستگاه موبایل ارائه می‌دهد.")
ContainerDb(db, "پایگاه داده", "ساختار پایگاه داده رابطه‌ای", "اطلاعات ثبت‌نام کاربران، اعتبارات احراز هویت هش‌شده، لاگ‌های دسترسی و غیره را ذخیره می‌کند.")
System_Ext(mbs, "سیستم بانکی اصلی", "تمامی اطلاعات بانکی اصلی مربوط به مشتریان، حساب‌ها، تراکنش‌ها و غیره را ذخیره می‌کند.")

Container_Boundary(api, "کاربرد API") {
    Component(accounts, "کنترلر حساب‌ها", "Spring MVC", "خلاصه و موجودی حساب‌ها را به مشتریان ارائه می‌دهد.")
    Component(auth, "کنترلر احراز هویت", "Spring MVC", "احراز هویت کاربر، مدیریت جلسه و تولید توکن را مدیریت می‌کند.")
    Component(reset, "کنترلر بازنشانی رمز عبور", "Spring MVC", "به کاربران اجازه می‌دهد تا رمز عبور خود را از طریق ایمیل بازنشانی کنند.")
    Component(security, "اجزای امنیتی", "Spring Bean", "احراز هویت، تولید توکن JWT و هش کردن رمز عبور را مدیریت می‌کند.")
    Component(accountmgmt, "اجزای مدیریت حساب", "Spring Bean", "هماهنگ‌کننده فراخوانی‌ها به سیستم بانکی اصلی برای عملیات حساب‌ها.")
    Component(email, "اجزای اطلاع‌رسانی ایمیلی", "Spring Bean", "ایمیل‌های بازنشانی رمز عبور و ایمیل‌های تأیید حساب را از طریق SMTP ارسال می‌کند.")

    Rel(accounts, security, "استفاده می‌کند")
    Rel(auth, security, "استفاده می‌کند")
    Rel(reset, security, "استفاده می‌کند")
    Rel(accountmgmt, mbs, "استفاده می‌کند", "XML/HTTPS")
    Rel(email, db, "خواندن", "JDBC")
}

Rel(spa, accounts, "استفاده می‌کند", "JSON/HTTPS")
Rel(spa, auth, "استفاده می‌کند", "JSON/HTTPS")
Rel(spa, reset, "استفاده می‌کند", "JSON/HTTPS")
Rel(ma, accounts, "استفاده می‌کند", "JSON/HTTPS")
Rel(ma, auth, "استفاده می‌کند", "JSON/HTTPS")
Rel(ma, reset, "استفاده می‌کند", "JSON/HTTPS")
@enduml

دلیل: این سطح نشان می‌دهد که مسئولیت‌ها چگونه تقسیم می‌شوند (جدا سازی نگرانی‌ها) و ورود کاربران جدید به پروژه را بسیار سریع‌تر می‌کند. شما فقط نمودارهای جزئیات را برای کانتینرها می‌کشید که به اندازه کافی پیچیده هستند تا این کار مفید باشد.

مرحله ۴: نمودار کد (سطح ۴) – اختیاری

هدف: نشان دادن ساختار داخلی یک جزء (نمودار کلاس، توالی و غیره). مخاطب: توسعه‌دهندگانی که روی این کد کار می‌کنند.

مثال برایکنترلر احراز هویتاجزاء – یک نمودار کلاس ساده UML در PlantUML:


@startuml
classDiagram

skinparam {
roundcorner 8
ArrowColor #444444
ArrowFontColor #444444
BorderColor #444444

Class {
BorderColor #1A237E
BackgroundColor #E8EAF6
FontColor #1A237E
}
}

class "AuthenticationController" {
+login(credentials)
+refreshToken()
}

class "JwtTokenProvider" {
+generateToken(user)
+validateToken(token)
}

class "UserRepository" {
+findByUsername()
}

AuthenticationController ..> JwtTokenProvider : "استفاده می‌کند"
AuthenticationController ..> UserRepository : "استفاده می‌کند"
@enduml

در پروژه‌های واقعی، اغلب سطح ۴ را نادیده می‌گیرید و به کد منبع واقعی ارجاع می‌دهید.

مرحله ۵: نمودارهای پشتیبان

نمودار پویا (مثال: جریان «مشاهده خلاصه حساب»)


@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml

title دیاگرام پویای نمایش خلاصه حساب کاربران شخصی

Person(customer, "مشتری بانکداری شخصی") {
Container(spa, "برنامه صفحه تکی") {
Container(api, "برنامه API") {
ContainerDb(db, "پایگاه داده") {
System_Ext(coreBanking, "سیستم بانکی اصلی")
}
}
}
}

Rel(customer, spa, "1. کلیک روی 'حساب‌ها'", "")
Rel(spa, api, "2. GET /accounts", "JSON/HTTPS")
Rel(api, db, "3. خواندن خلاصه ذخیره‌شده", "")
Rel(api, coreBanking, "4. دریافت آخرین داده‌ها", "")
Rel(api, spa, "5. بازگرداندن JSON", "")

SHOW_LEGEND()
@enduml

دیاگرام نصب (نقشه‌برداری فیزیکی سطح بالا):


@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml

title دیاگرام نصب برای سیستم بانکداری اینترنتی

Deployment_Node(aws, "Amazon Web Services", "ابر") {
Deployment_Node(ec2, "گروه خودکار مقیاس‌دهی EC2", "لینوکس") {
Container(api, "برنامه API", "Java Spring Boot")
}
Deployment_Node(rds, "RDS", "PostgreSQL") {
ContainerDb(db, "پایگاه داده")
}
}

Deployment_Node(customerDevice, "دستگاه مشتری", "وب/موبایل") {
Container(spa, "برنامه صفحه تکی")
Container(mobile, "اپلیکیشن موبایل")
}

System_Ext(coreBanking, "سیستم بانکی اصلی (ماشین اصلی داخلی)")

Rel(spa, api, "تماس‌های API انجام می‌دهد به", "HTTPS")
Rel(mobile, api, "تماس‌های API انجام می‌دهد به", "HTTPS")
Rel_U(api, spa, "تحویل به مرورگر مشتری")
Rel_U(api, mobile, "تحویل به اپلیکیشن موبایل")

SHOW_LEGEND()
@enduml

چگونه از این مطالعه موردی در عمل استفاده کنیم

  1. با یک کارگاه شروع کنید: متناظری را روی تخته سیاه رسم کنید.
  2. با استفاده از PlantUML C4 به سمت مخازن و اجزا تکرار کنید.
  3. دیاگرام‌ها را در مخزن کد (به عنوان کد!) نگه دارید تا به‌روز بمانند.
  4. مستندات زنده را به صورت خودکار تولید کنید.

این مثال دقیق سیستم بانکداری اینترنتی، مرجع رسمی ایجاد شده توسط سیمون براون است و در هزاران سازمان جهانی استفاده می‌شود. با دنبال کردن این مراحل، اکنون یک توصیف کامل و آماده بهره‌برداری از معماری دارید که هر کسی — از مدیرعامل تا توسعه‌دهنده جدید — می‌تواند در سطح مناسب جزئیات آن را درک کند.

مقاله‌های دیاگرام C4

This post is also available in Deutsch, English, Español, Français, English and 日本語.