چگونه یک سرویس خارجی کد خود را به چالش بکشید (بدون رنج در آینده)

حفظ یک سیستم غیرقابل درک از خدمات خارجی طراوت نیست ، این یک نیاز استبشر اگر می خواهید یک کد انعطاف پذیر ، قابل آزمایش و انعطاف پذیر تر داشته باشید ، باید برخی از روشهای خوب را دنبال کنید. بیایید مستقیم به نکته برویم:
1. از یک دروازه برای دسترسی متوسط استفاده کنید
یکی دروازه این اساساً یک واسطه بین کد آن و سرویس خارجی است. یعنی به جای تماس مستقیم با API سرویس ، کد شما با a صحبت می کند دروازه، این این ارتباط را مدیریت می کند.
🔹 این چه چیزی را حل می کند؟
✅ شما می توانید سرویس خارجی را بدون شکستن کد خود تغییر دهیدبشر
✅ اجرای آن را تسهیل می کند حافظه پنهان ، سیاههها و اعتبارسنجی هابشر
✅ وابستگی مستقیم به کاربرد در سرویس خارجی را کاهش می دهد.
در کتاب الگوهای معماری کاربرد شرکت تأکید می کند که آنها برای محاصره دسترسی به سیستم های خارجی ضروری هستند.
2. اصل واژگونی وابستگی را اعمال کنید (DIP)
DIP ، یکی از اصول محکم ، می گوید کد باید به انتزاع بستگی داشته باشد ، نه پیاده سازی های مشخصبشر
🔹 چگونه درخواست کنیم؟
✅ ایجاد رابط برای خدمات خارجی و تزریق از طریق وابستگی.
✅ از اتصال مستقیم برنامه خود به API های خارجی خودداری کنید.
test تست های واحد را تسهیل می کند ، زیرا می توانید به جای ضرب و شتم API سلطنتی ، رابط را مسخره کنیدبشر
مثال عملی: تصور کنید که درخواست شما به یک API خارجی برای پرداخت پرداخت بستگی دارد. به جای تماس با یک کلاس خاص که خدمات پرداخت را به عنوان مثال درج می کند: PagarMeservice.pay (), você pode criar uma interface
خدمات پرداختe injetar diferentes implementações (
پرداخت خدمات,
PaymenterVicePagseguro` و غیره).
3. arquitetura hexagonal (بنادر و آداپتورها) قوس تمیز
معماری بنادر و آداپتورها یک مشکل کلاسیک را حل می کند: منطق تجاری جدا از زیرساخت هابشر
🔹 چگونه کار می کند؟
✅ دره (درگاه ها) → رابط هایی که برنامه آن در معرض دید قرار می دهد یا مصرف می کند.
✅ آداپتورها (آداپتورها) → ترجمه بین کاربرد آن و خدمات خارجی.
مثال عملی:
- آیا برنامه شما نیاز به ارسال ایمیل دارد؟ شما یک رابط را تعریف می کنید
EmailService
بشر - سپس می توانید یک
SendGridEmailService
، بیان کاربرد آن از خدمات خاص.
این بدان معنی است که ، در آینده ، به عنوان مثال ، اگر نیاز به تغییر SendGrid برای SES دارید ، تأثیر آن بر روی کد حداقل خواهد بودبشر
4. از رویدادهای دامنه استفاده کنید (و کارهای غیر همزمان را انجام دهید)
اگر هنوز فکر می کنید نیاز به تماس با خدمات خارجی دارید همزمان تمام وقت، فرصتی عالی برای بهبود مقیاس پذیری و مقاومت در سیستم شما وجود ندارد.
🔹 چه کاری باید انجام شود؟
✅ به جای تماس مستقیم با API ، رویدادها را منتشر کنید.
✅ سرویس دیگری را برای مصرف این رویداد و تعامل با API بیرونی بگذارید.
✅ اگر سرویس خارجی پایین باشد ، می تواند بعداً این رویداد پردازش شود.
این کاهش می یابد جفت موقت، یعنی ، درخواست شما نیازی به پاسخ فوری از خدمات خارجی برای ادامه کار نداردبشر
5. دامنه را منزوی نگه دارید
🔹 این در عمل به چه معنی است؟
… شما مدل دامنه نباید داشته باشد هیچ مربوط به خدمات خارجی.
✅ هر ادغام باید در باشد لایه های خارجی معماریبشر
اگر دامنه شما پر از تماس با API های شخص ثالث است ، شما در حال ایجاد یک خطای طراحی جدی هستیدبشر یک عمل خوب این است که اطمینان حاصل شود لایه دامنه هیچ وارد کننده لایه های دیگر ندارد، نگه داشتن آن خالص و مستقلبشر
لایه ضد فساد (ACL): محافظت از دامنه خود در برابر “آلودگی خارجی”
وقتی دو سیستم ارتباط برقرار می کنند ، این خطر وجود دارد که یک مدل داده به “آلودگی” دیگر پایان می یابدبشر برای جلوگیری از این ، ما از لایه ضد فساد (ACL)بشر
act ACL چه کاری انجام می دهد؟
✅ داده ها را ترجمه و تطبیق می دهد بین سیستم های مختلف
✅ جلوگیری از قوانین تجاری از یک سرویس خارجی بر دامنه شما تأثیر می گذارد.
✅ به شما امکان می دهد داده ها را از چندین منبع اضافه کنید بدون اینکه برنامه خود را به هم ریخته باشید.
Alistair Cockburn حتی از نام “لایه ضد فساد” انتقاد می کند (فکر می کند منفی به نظر می رسد) ، اما از این ایده دفاع می کند: این یک لایه میانی است که ارتباط بین سیستم شما و یک سرویس خارجی را ترجمه می کند تا از “فاسد” دامنه آنها جلوگیری کند.
مثال عملی:
اگر درخواست شما نیاز به ادغام در ERP قدیمی دارد ، نباید آن را مستقیماً با آن تماس بگیرید. در عوض ، الف ACL که داده های ERP را به فرمی تبدیل می کند که برنامه شما می فهمد ، در عمل از آداپتور الگوی استفاده خواهید کرد.
زمینه های محدود: درک کنید که هر مفهوم در کجا معنی دارد
هیچ طراحی دامنه محور (DDD)، یکی زمینه محدود تعریف کردن جایی که یک مفهوم در سیستم شما معنی داردبشر
🔹 این چه چیزی را حل می کند؟
✅ از داشتن یک اصطلاح از معانی مختلف در همان سیستم جلوگیری کنید.
✅ در سازمان مدولار کد کمک می کند.
model مدل سازی خدمات مستقل را تسهیل می کند.
مثال عملی:
“مشتری” به چه معنی است؟ در بخش مالی یک بیمارستان می تواند به معنای بیمار پرداخت کننده باشد. در بخش بستری ، “مشتری” می تواند باشد هر بیماربشر متن کاملاً تغییر می کند!
هر یک زمینه محدود شما می توانید مدل داده ، قوانین و حتی تیم توسعه خود را داشته باشید.
نکته:
زمینه های خوب تعریف شده به طور خودکار به معنای میکروسرویس نیستاما می تواند کمک کند مدولار سازی و مقیاس پذیری از سیستم
4 سؤالی که هر معمار نرم افزاری باید بپرسد
هنگام ارزیابی یک پیشنهاد طراحی ، یک معمار نرم افزار باید به 4 سؤال اساسی پاسخ دهد:
1⃣ آیا این راه حل اهداف تجاری را برآورده می کند؟
- اگر جواب ندهید ، اجرای آن منطقی نیست. 2 آیا راه حل به محدودیت های پروژه احترام می گذارد؟
- استفاده از چیزی نیست که در محدودیت های سیستم قرار نگیرد. 3⃣ آیا این ویژگی های کیفیت را برآورده می کند؟
- عملکرد ، مقیاس پذیری ، امنیت و غیره 4⃣ آیا جایگزین ارزان تر یا کمتر خطرناک وجود دارد؟
- اگر موجود باشد ، به کلیپ بورد برگردید و برنامه ریزی را دوباره تنظیم کنید.
💡 اگر پاسخ به سوال چهارم “بله” است ، بهتر است دوباره راه حل را تجدید نظر کنید. یک معمار خوب نه تنها راه حل “بهترین” را جستجو می کند بلکه کارآمدترین راه حل در زمینه تجارتبشر
پایان
اگر می خواهید یک سیستم کمبود واقعی داشته باشید ، باید از شیوه های خوب معماری استفاده کنید.
🔹 از دروازه استفاده کنید برای محاصره ادغام های خارجی.
🔹 DIP را اعمال کنید برای جلوگیری از وابستگی مستقیم.
🔹 درگاه ها و آداپتورها برای جدا کردن دامنه خود از زیرساخت ها.
🔹 از رویدادهای ناهمزمان استفاده کنید برای بهبود مقیاس پذیری و مقاومت.
🔹 از دامنه خود با ACL محافظت کنید اشمیه زمینه های محدود شده را در DDD تعریف کنیدبشر
هدف نهایی ساده است: کد انعطاف پذیر ، نگهداری آسان و آماده سازی برای تغییربشر اگر سیستم شما هنوز مستقیماً با خدمات خارجی همراه است ، شما برای آینده یک مشکل بزرگ در حال ترک هستیدبشر
حال ، بیایید این کد را به روز کنیم! 🚀
لینک
معماری شش ضلعی (بنادر و آداپتورها) با Alistair Cockburn // Live #98
اصل وارونگی وابستگی جامد + آداپتور الگوهای طراحی
نحوه ایجاد و decople لایه های با استفاده از جامد
10 سوال در مورد طراحی دامنه محور
طراحی دامنه راه درست
DDD ، طراحی دامنه محور Com Elemar Jr. // Live #52
معماری رویداد محور ، میکروسرویس و CQR: ترکیب کامل