الگوی طراحی دروازه API در میکروسرویس ها

مقدمهدر این مقاله با طراحی Microservices با استفاده از Gateway Pattern آشنا خواهید شد. الگوی دروازه چیست؟الگوی دروازه یا الگوی دروازه API یک الگوی یکپارچه سازی برای مشتریانی است که با سرویس های سیستم شما ارتباط برقرار می کنند و به عنوان یک نقطه ورودی واحد بین برنامه های مشتری و میکروسرویس ها عمل می کند. طراحی شده است تا یک بافر بین خدمات اساسی و نیازهای مشتری فراهم کند. این لایه واحد، رابطی برای دنیای بیرون به سیستم شما به عنوان یک کل می شود. این شبیه به الگوی نما از طراحی OOP است. مشکلبیایید مشکل ارتباط مستقیم بین اپلیکیشن مشتری و میکروسرویس ها را درک کنیم. در اینجا، ما سه سرویس داریم و آن سرویس‌ها مستقیماً با برنامه‌های مشتری در تعامل هستند. طراحی میکروسرویس ها با استفاده از الگوی دروازهدر این سناریو، مشتری این امکان را دارد که مستقیماً با هر سرویسی تماس بگیرد که می‌تواند هرج و مرج ایجاد کند، و هزینه‌های عملیاتی و نگهداری در سراسر سیستم به طور قابل‌توجهی بالاتر خواهد بود، زیرا ما به هر مشتری اجازه می‌دهیم مستقیماً از خدمات مطابق میل خود استفاده کند. این مشکل زمانی که تعداد مشتریان افزایش می‌یابد، بیشتر می‌شود، به خصوص اگر فروشندگان شخص ثالث شروع به مصرف API کنند. ثانیاً، ما باید IP عمومی برای هر میکروسرویس داشته باشیم و آن IPها از طریق اینترنت به صورت عمومی در معرض دید قرار می گیرند. در نتیجه، ما سطوح بیشتری را برای حمله مهاجمان فراهم می کنیم. همچنین، اجرای نگرانی‌های مقطعی مانند مجوز، تبدیل داده‌ها، و ارسال درخواست پویا به اپلیکیشن و سرویس‌های مشتری می‌تواند به تلاش توسعه قابل توجهی در هر سرویس نیاز داشته باشد. این بدان معناست که ما تعداد زیادی کد تکراری خواهیم داشت و در صورت هر گونه تغییری، دوباره کد مورد نیاز است. به طور کلی این تمرین خوبی نیست. گاهی اوقات برنامه های سرویس گیرنده برای پیاده سازی عملکرد خاصی نیاز به فراخوانی چندین سرویس دارند که به چندین تماس API نیاز دارد. تماس های چندگانه به معنای رفت و آمدهای چندگانه شبکه بین مشتری و سرور است که باعث تأخیر قابل توجهی می شود. علاوه بر این، چه می شود اگر برنامه های سرویس گیرنده با سرویسی که از پروتکل های غیر HTTP مانند AMQP استفاده می کند، ارتباط برقرار کنند. چرا API Gateway در معماری Microservices مفید است؟ برای غلبه بر کاستی‌های مختلف ارتباط مستقیم مشتری به میکروسرویس، می‌توانیم یک لایه پروکسی میانی طراحی و معرفی کنیم که می‌توان آن را دروازه API نامید. این می تواند چیزی شبیه به سرویس میزبان وب دیگری باشد که به عنوان یک ظرف در وسط اجرا می شود. دروازه API مانند یک پراکسی معکوس عمل می کند که درخواست مشتری را دریافت می کند و آن را به میکروسرویسی که برنامه های سرویس گیرنده می خواهند به آن متصل شوند هدایت می کند و هنگامی که getaway پاسخی را از آن سرویس دریافت می کند، دروازه API آن پاسخ را به برنامه وب برمی گرداند یا اپلیکیشن موبایل پروکسی معکوس مشکل امنیتی را حل می کند، زیرا ما نیازی به افشای IP های میکروسرویس به عنوان IP های عمومی از طریق اینترنت نداریم. ما فقط IP عمومی دروازه API را در معرض نمایش خواهیم گذاشت، آن میکروسرویس ها می توانند در یک شبکه مشترک با IP های خصوصی زندگی کنند و آن شبکه می تواند ایمن شود. ویژگی ها و عملکردهای کلیدی دروازه API عبارتند از:می‌تواند تماس‌ها را تغییر دهد، یا می‌تواند تماس‌ها را بر اساس آنچه که خود دروازه نشان می‌دهد محدود کند.می تواند امنیت و منطق مجوز را در یک نقطه یکپارچه قرار دهد.می تواند دسترسی درخواست را بر اساس مشتری و اعتبار آن محدود یا مجاز کند.می تواند چندین درخواست HTTP را در یک درخواست جمع کند که تعداد درخواست ها/رفت و برگشت را کاهش می دهد. دروازه داخلی تماس های اساسی را با خدمات مورد نیاز برقرار می کند و داده ها را در یک بار برای مشتری جمع می کند.همچنین می‌تواند محموله‌ها را تزئین کند، گاهی اوقات، ما نیاز داریم که سرصفحه‌های مشترک یا سایر نقاط داده‌ای در محموله داشته باشیم که لزوماً با سرویس اصلی مرتبط نیستند. با استفاده از دروازه، می‌توانیم آن دکوراسیون را در یک مکان به صورت ثابت اعمال کنیم.می‌تواند به ذخیره‌سازی پاسخ و استخراج تمام نگرانی‌های مقطعی میکروسرویس‌ها و افزودن آنها به دروازه API دست یابد.ادغام کشف سرویس را بهبود می بخشد زیرا دروازه API می تواند نقاط پایانی مختلف را از طریق تعریف Swagger API بشناسد و ما مجبور نیستیم برنامه وب را مستقیماً به روز کنیم که منجر به اتصال کمتر بین برنامه وب و سرویس های مختلف می شود.می توانند تعادل بار را در دروازه API پیاده سازی کنند و می توانند سیاست های متعددی را برای توزیع شارژ یا درخواست ها در بالای نمونه های مختلف میکروسرویس من تعریف کنند.می تواند ثبت، ردیابی و همبستگی را از هر درخواست انجام دهد.رویکرد پیاده سازیطراحی دقیق در واقع بسیار ساده است. الگوی دروازه یک نقطه API مبتنی بر قرارداد را به شما می دهد، آنها می توانند ثابت باشند در حالی که سرویس های زیربنایی می توانند در صورت نیاز تغییر کنند، مهاجرت کنند و حرکت کنند. پیاده سازی دروازه ممکن است تغییر کند، اما مشتریان شما نیازی به احساس درد آن تغییر ندارند، زیرا به قرارداد عمومی شما پایبند است. ابتدا باید قراردادهای API را تعریف کنیم و این نقطه تماس عمومی خواهد بود. سپس، تعریف آن APIها را در مولفه دروازه نمایش دهید (به عنوان مثال - این کار را می توان از طریق آپلود فایل Swagger JSON APIها انجام داد). برای ثابت نگه داشتن این قراردادهای API، می‌توانیم کنترل نسخه سخت‌گیرانه مانند نسخه‌سازی معنایی داشته باشیم تا APIها در حال رشد باشند. البته نسخه نویسی کافی نیست. ما باید تغییرات خود را نیز بر اساس آن استراتژی نسخه‌سازی غیرفعال کنیم. در حین اجرای الگوی دروازه API، گاهی اوقات ما نیاز داریم که لایه API Gateway را بر اساس مرزهای تجاری و برنامه های مشتری متعدد به چندین دروازه API تقسیم کنیم. با این حال، این کاملاً بر اساس نیاز و نیاز تجاری شما است. به همین دلیل است که بر اساس نوع برنامه مشتری که به عنوان الگوی "Backend for Frontend" (BFF) شناخته می شود، به چندین دروازه تقسیم می شود. نمونه ای از تصویر در زیر نشان داده شده است. از نظر محصولات API Gateway، ما چندین گزینه را به عنوان یک راه حل آماده در دسترس داریم که می توانیم به راحتی با میکروسرویس های خود ادغام کنیم. شما می توانید یکی از آنها را بر اساس نیاز و پشته فناوری خود انتخاب کنید.دروازه API Ambassadorدروازه کنگآپاچی APISIXOcelot (Gateway.NET API)دروازه API آمازونAzure API Managementچالش ها یکی از چالش های اصلی دروازه API این است که ما در حال ایجاد یک نقطه شکست برای کل برنامه خود هستیم. اگر دروازه API از کار بیفتد یا به هر دلیلی از کار بیفتد یا کار نکند، با وجود اینکه میکروسرویس ها فعال هستند، کل برنامه کار نخواهد کرد. این را می توان از طریق مقیاس گذاری دروازه API حل کرد، برای مثال، ممکن است چندین نمونه از دروازه API داشته باشید اگر یک نمونه پایین بیاید، نمونه دوم و سوم به جای اولین بار بارگیری را دریافت می کنند. اکنون ما درک روشنی در مورد سودمندی الگوی دروازه API در معماری Microservices داریم.امیدوارم این اطلاعات برای شما مفید باشد!