ابتدا میخواهیم API Gateway را به زبان ساده شرح دهیم. API Gateway یکی از ابزارهای API Management است که بین کلاینت و مجموعهای از سرویسهای back-end مینشیند. API Gateway جلوی API مینشیند و تنها راه ورودی APIهای back-end و میکروسرویسها میباشد. API Gateway با نشستن در جلوی API مانند یک محافظ تامینکنندهی امنیت، مقیاسپذیری و در دسترسپذیری عمل میکند. به عبارتی API Gateway مانند یک پروکسی معکوس عمل میکند، به اینصورت که تمام سرویسهای لازم برای API های فراخوانی شده را تجمیع کرده و در قالب یک نتیجهی مناسب به کاربر بر میگرداند.
یک API Gateway جزئی از API Management است. API Gateway تمام درخواستها را یکی کرده و به سیستم API Management میدهد. اینکه API Gateway چه کار میکند به پیادهسازی آن بستگی دارد. به طور کلی کارهایی مانند اعتبارسنجی (Authentication)، پایش (Monitoring)، تحلیل و کارهای دیگر انجام میدهد. [1]
اگر هنوز متوجه نشدهاید که API Gateway دقیقا چه کار میکند، این مثال را دنبال کنید. فرض کنید میخواهیم یک فروشگاه اینترنتی مانند آمازون راهاندازی کنیم و در حال طراحی صفحهی مشاهدهی جزئیات یک محصول میباشیم. اول از همه باید دو نسخه از رابط کاربری این صفحه داشته باشیم. یکی برای کاربران web-application و دیگری برای کاربران اندروید و آیفون. علاوه بر این مورد، در این صفحه اطلاعات زیادی را میتوانیم به نمایش بگذاریم. برای مثال فرض کنید این محصول یک کتاب است. اطلاعاتی که میتوانیم در صفحهی مشاهدهی اطلاعات یک کتاب مشاهده کنیم، مواردی مانند اطلاعات پایهای کتاب مانند عنوان، نویسنده، قیمت و غیره، در دسترس بودن یا نبودنش، گزینههای خرید، کتابهای مشابه، کتابهایی که خریداران این کتاب خریدهاند، نظرات و دیدگاهها و موارد دیگر.
اگر فرض کنیم این فروشگاه از الگوی معماری میکروسرویس استفاده میکند، آنگاه این اطلاعات در سرویسهای مختلفی پخش شدهاند. برای مثال سرویس Product Info که اطلاعات پایهای کتاب مانند عنوان، نویسنده، قیمت و غیره را ارائه میدهد.
در حال حاضر میدانیم که کاربران با یک فراخوانی REST برای مثال GET api.company.com/productdetails/productId به این صفحه و تمام اطلاعات آن دسترسی دارند.
چگونه کاربران به این سرویسها دسترسی داشته باشند؟
دو راهحل برای این مساله ارائه میدهیم و به بررسی هر دو میپردازیم.
فرض کنیم در راهحل اول کاربر میتواند هر کدام از سرویسهای میکروسرویسها را مستقیما فراخوانی کند. کاربر برای مشاهدهی صفحهی اطلاعات یک کتاب همهی سرویسها را از میکروسرویس مربوطه با url مربوطه فراخوانی میکند. هر url هم به load balancer میکروسرویس نگاشت میشوند که این بالانسر درخواستها را بین نمونههای در دسترس توزیع میکند.
متاسفانه این راهحل چالشها و محدودیتهای زیادی دارد. نکتهی اول که در قسمت قبلی ذکر شد و باید مورد توجه قرار گیرد نقض شده است. یعنی کاربر برای مشاهدهی یک محصول لازم است تا چندین سرویس را خود فراخوانی کند. در این مثال خاص کاربر باید ۷ سرویس را فراخوانی کند. در برنامههای پیچیدهتر لازم است تا سرویسهای بسیار بیشتری را فراخوانی کند. نکتهی سوم از قسمت قبلی هم نقض میشود. شاید این راهحل با در نظر نگرفتن مشکل قبلی برای کابرانی که از طریق LAN به اینترنت متصل شدهاند مناسب باشد ولی برای کاربرانی که از طریق اینترنت همراه متصل شدهاند عملا غیرقابل پیادهسازی خواهد بود. از طرفی این رویکرد کد سمت کاربر را بسیار پیچیدهتر خواهد کرد.
مسالهی بعدی مشکلتر شدن ریفکتور کردن سرویسها میباشد. اگر بعد از مدتی تصمیم به تغییر سرویسها گرفتیم به دلیل درگیری مستقیم کاربر با سرویسها این کار بسیار دشوار خواهد بود. این مشکل ناقض نکتهی چهارم در قسمت قبلی است.
به دلیل این مشکلات و محدودیتها، این راهحل به نظر منطقی نیست.[4]
راهحل دوم پیادهسازی یک API Gateway است که یک نقطهی ورود برای همهی کلاینتها میباشد. این راهحل معماری داخلی را از دید کاربر مخفی میکند. همانطور که قبلا گفتیم، API Gateway تمام درخواستهای کلاینت را تجمیع کرده و یک نتیجه برای مثال یک صفحهی مشاهدهی اطلاعات یک محصول را برمیگرداند. API Gateway علاوهبر هدایت درخواستها، ترجمهی پروتکلها میتواند مسئولیتهای دیگری مانند اعتبارسنجی، پایش، load balancing، ذخیره در حافظهی نهان و غیره داشته باشد.
به جای اینکه یک API مناسب برای همهی کاربران بنویسیم، API Gateway میتواند APIهای موردنیاز، متناسب و خاص هر کاربر را ارائه دهد.
تمام درخواستها ابتدا از API Gateway عبور میکنند. سپس API Gateway آنها را به میکروسرویس مربوطه هدایت میکند. گاهی API Gateway یک درخواست را به چندین میکروسرویس میفرستد و نتایج را تجمیع کرده و برمیگرداند.
یک مثال بسیار خوب برای API Gateway ، API Gateway نتفلیکس میباشد. سرویس استریم نتفلیکس بر روی دستگاههای متنوعی مانند تلویزیونها، تلفنهمراههای هوشمند، سیستمهای بازی، تبلتها و غیره در دسترس است. در ابتدا نتفلیکس سعی داشت از one-size-fits-all API استفاده کند ولی بعدها متوجه شدند که به دلیل تعداد زیاد دستگاهها و نیازهای یکتای هریک این روش مناسب نیست. نتفلیکس امروزه از API Gateway استفاده میکند که API خاص هر دستگاه را فراهم میکند. API Gatewayنتفلیکس روزانه چندین میلیارد درخواست را پاسخ میدهد. [4]
همانطور که میدانید استفاده از API GateWay هم مزایا و معایب خود را دارد.
با وجود معایب و چالشهای API Gateway، این ابزار برای رفع مشکل موجود منطقی به نظر میآید.
نمونههای API Gateway زیادی وجود دارد که ما فقط به ذکر دو مورد از آنها بسنده کردیم.
یکی از شرکتهای ایرانی که API Gateway همراه اول را ارائه داده است، شرکت تجارت ایران گستر رایکا میباشد.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.
[1] https://www.redhat.com/en/topics/api/what-does-an-api-gateway-do
[2] https://www.axway.com/en/products/api-management/gateway
[3] https://microservices.io/patterns/apigateway.html
[4] https://www.nginx.com/blog/building-microservices-using-an-api-gateway/
[5] https://geekflare.com/api-gateway/