در این پست قصد داریم تا با مفهوم API Gateway و کاربرد آن در صنعت نرم افزار آشنا شویم. سپس با مزایا و معایب استفاده از آن آشنا خواهیم شد و بعد از آن، ابزار های متن باز در این حوزه را معرفی خواهیم کرد. توجه داشته باشید که استفاده از API Gateway بیشتر در کنار معماری میکروسرویس رایج است، لذا اگر با معماری میکروسرویس آشنایی ندارید پیشنهاد می کنیم که ابتدا با این مفاهیم یک آشنایی اولیه پیدا کرده و سپس این پست را بخوانید.
ابتدا لازم است تا با مفهوم API آشنا بشویم. واژه API مخفف Application Programming Interface است و برای تبادل اطلاعات از سمت Client ها با Server ها استفاده می شود و مبتنی بر Request/Response است. استفاده از API بیشتر برای توسعه اپلیکیشن های موبایلی و یا در نرم افزار هایی که با معماری سرویس گرا و یا میکروسرویس توسعه داده شده اند رایج است. این API ها می توانند با پروتکل REST یا SOAP یا سایر پروتکل ها باشند. همچنین می تواند داده ها را در قالب JSON یا XML یا سایر فرمت ها در اختیار Client ها قرار بدهند. اکثر اپلیکیشن های موبایلی و اکثر سایت هایی که Backend آن ها با معماری میکروسرویس توسعه داده شده است از API استفاده می کنند.
حال فرض کنید که یک اپلیکیشن فروشگاهی داریم که Back-End آن با معماری میکروسرویس نوشته شده است. در این اپلیکیشن، صفحه مربوط به جزییات یک محصول را باز می کنیم. در صفحه جزییات محصول، اطلاعات مختلفی از جمله موارد زیر وجود دارد که هر کدام به کمک API از یک میکروسرویس دریافت می شود:
عکس و قیمت محصول که از میکروسرویس اطلاعات محصولات گرفته می شود.
لیست نظرات که از میکروسرویس نظرات گرفته می شود.
لیستی از محصولات مشابه آن کالا که به کاربر پیشنهاد داده می شود و از میکروسرویس پیشنهاد دهنده محصولات مشابه می شود.
اگر نخواهیم از API Gateway استفاده کنیم، باید سه تا Request مختلف به سه میکروسرویس مختلف که در بالا اسمشان ذکر شد بزنیم و Response هر کدام از آن میکروسرویس ها را دریافت کرده و در جایی که در صفحه جزییات محصول برای آن قسمت قرار داده شده است تعبیه کنیم. در این صورت هر کدام از Client ها باید به هر کدام از میکروسرویس ها یک درخواست مطابق شکل زیر بزنند:
همانطور که مشاهده می شود تعداد زیادی درخواست در جریان است. نکته منفی دیگری که می تواند وجود داشته باشد این است که هر کدام از این وب سرویس ها ممکن است با یک تکنولوژی خاص پیاده سازی شده باشند، مثلا ممکن است میکرسرویس اطلاعات محصول، با SOAP پیاده سازی شده باشد و داده ها را در فرمت XML خروجی بدهد و میکرسرویس نظرات با REST پیاده سازی شده باشد و داده ها را در فرمت JSON خروجی بدهد. در این صورت Client باید مدام فرمت ها را به فرمت دلخواه خودش تبدیل کند که زمان گیر و گاها سخت است.
اینجاست که API Gateway کاربرد خودش را نشان می دهد. اگر از API Gateway استفاده کنیم، دیگر نیازی نیست تا سه تا API را صدا بزنیم، بلکه یک بار درخواستمان را به API Gateway می فرستیم و API Gateway خودش این موضوعات را مدیریت می کند. ساز و کار کلی API Gateway در شکل زیر مشخص است:
همانطور که در شکل فوق مشخص است، Client ها به جای اینکه هر بار سه بار به هر کدام از میکروسرویس ها Request بزنند، یک بار به API Gateway درخواست می دهند و API Gateway این درخواست ها را به سه میکروسرویس مربوطه زده و در صورتی که نیاز به تبدیل فرمت هم باشد این کار را انجام داده و خروجی را به Client ها می دهد.
در این مثال سه تا Request به API های مختلف زده می شد که خودش عدد نسبتا زیادی است، اما تصور کنید که سایت یا اپلیکیشن دیگری داشته باشیم که در آن Client باید برای جمع آوری اطلاعات یک صفحه، تعدادی زیادی Request مثلا 7 یا 8 تا یا بیشتر Request بزند. (در سایت های بزرگی که از API استفاده می کنند واقعا این اتفاق می افتد و بعید نیست) در این صورت مشکلات زیادی از جمله افت کارآیی و کاهش سرعت و استفاده زیاد از منابع و سخت بودن مدیریت پاسخ های دریافتی به وجود خواهد آمد.
توجه داشته باشید که می توان برای هر نوع Client یک API Gateway مخصوص خود آن Client را تعریف کرد، این کار مزیت های دیگری به همراه دارد:
به عنوان مثال کاربران اپلیکیشن موبایل، کاربران سامانه های تحت وب و یا سایر اپلیکیشن ها و برنامه ها از API Gateway مختص خودشان استفاده می کنند. چون ممکن است اطلاعاتی که در یک صفحه از اپلیکیشن موبایل یک فروشگاه نشان داده می شوند، با اطلاعاتی که در یک صفحه از سایت همان فروشگاه نشان داده می شود تفاوت داشته باشد.
اما فرض کنید که یکی از سرویس ها در دسترس نباشد و API Gateway نتواند تمام داده های مرود نیاز را جمع آوری کند، آن وقت تکلیف چیست؟ آیا باید کلا خطا برگردانده شود؟ پاسخ "خیر" است، چنانچه یکی از سرویس ها فعال نباشد و پاخی ندهد (مثلا سرویس نظرات به درستی لیست نظرات را ندهد و دچار خطا شده باشد)، آن گاه خود API Gateway باید چاره ای بیندیشد تا این خطا را مدیریت کند. مثلا لیست خالی برگرداند و یا اعلام کند که دریافت داده های این بخش با خطا مواجه شد و در نهایت هر اطلاعاتی را که توانسته است به دست بیاورد را به Client برگرداند.
به طور کلی در نرم افزار های مقیاس وسیع که با معماری میکروسرویس توسعه داده شده اند استفاده از API Gateway پیشنهاد می شود و استفاده از آن مزیت های زیادی به همراه دارد که در ادامه برخی از آن ها را با هم خواهیم دید.
کاهش پیچیدگی: به کمک API Gateway دیگر نیازی به تبدیل فرمت های مختلف داده به یکدیگر و یا parse کردن چند مدل فرمت داده نیست. همچنین مسیریابی API ها و درک منطق آن ها نیز از رو دوش Client ها برداشته می شود و به API Gateway سپرده می شود. همچنین فرآیند احراز هویت Client ها و روال دریافت توکن هم کوتاه تر می شود.
افزایش امنیت: از آنجایی که API Gateway بین برنامههاط و میکروسرویسها قرار میگیرد، به عنوان یک مانع امنیتی عمل میکند و مطمئن میشود که API های حساس و مهم در معرض دید قرار نگیرند. همچنین از API میکروسرویس ها در برابر بردارهای حمله مخرب مانند حملات DoS و SQL Injection و چندین حمله مشابه دیگر محافظت می کند.
کاهش تعداد درخواست ها: استفاده از API Gateway باعث می شود تا تعداد درخواست هایی که Client ها باید برای دریافت داده ها داشته باشند کاهش بیاید و فقط یک درخواست به API Gateway زده می شود. در صورتی که قبل از استفاده از API Gateway باید هر کدام از API های میکروسرویس ها را به صورت جداگانه صدا می زدیم.
فراهم کردن امکان رصد و آنالیز: برخی از API Gateway ها با ابزارهایی برای تحلیل و نظارت دارند که به توسعهدهندگان کمک میکنند تا آسان تر اشکالزدایی کنند.
اما استفاده از API Gateway معایبی نیز به همراه دارد که با آن ها آشنا می شویم.
به وجود آمدن نقطه شکست: هنگامی که از API Gateway استفاده می کنیم، یک نقظه شکست یا Single Point Of Failure به وجود می آید. این به این معنی است که اگر روزی API Gateway دچار خرابی شود، آن گاه Client ها دیگر به هیچ کدام از سرویس ها دسترسی نداشته و در نتیجه کل سیستم از کار خواهد افتاد.
امکان کم شدن کارآیی: همان طور که استفاده از API Gateway می تواند باعث افزایش کارآیی بشود، می تواند در برخی موارد نتیجه برعکس نیز داشته باشد. مثلا ممکن است وقتی تعداد درخواست ها زیاد می شود، API Gateway نتواند به خوبی و با سرعت درخواست ها را انتقال بدهد. به طور کلی استفاده از API Gateway یک مرحله به فرآیند Request/Response اضافه می کند. برای مواجه با این مشکل باید از API Gateway ای استفاده کنیم که قدرتمند و توانمند باشد.
ابزار Kong Gateway:
ابزار Kong Gateway یک API Gateway متن باز و سبک و سریع می باشد. این ابزار با زبان Lua نوشته شده است و با کمک Nginx اجرا می شود. ابزار Kong این تضمین را به کاربردان داده است که عملکرد خوبی را برای همه برنامههایی که بر پایه میکروسرویس نوشته شده اند ارائه می دهد. این ابزار با انواع RESTFUL API ها سازگار است و می تواند از طریق ماژول ها و افزونه ها گسترش نیز بیابد و با انواع تکنولوژی ها سازگار است. از مهم ترین مزیت های این ابزار می توان به داشتن Admin API اشاره کرد. به طور کلی ساز و کار Kong به شکل زیر است:
همانطور که در شکل فوق مشخص است، استفاده از Kong (قسمت سمت راست شکل) باعث شده تا قابلیت ها یک جا تجمیع شوند که این باعث کار کردن راحت تر می شود و مزایای زیادی را به همراه دارد. ابزار Kong مزیت ها و ویژگی های بسیار زیادی دارد که برخی از این ویژگی ها عبارت اند از:
ابزار Apigee:
این ابزار در سال 2004 ساخته شد که بعده ها گوگل آن را خریداری کرد و هم اکنون یکی از سرویس های گوگل در حوزه API است که طرفداران زیادی دارد. استفاده از این ابزار بسیار راحت است و از لحاظ امنیت بسیار قوی است و با انواع پلتفرم ها سازگاری دارد. این ابزار مزایای زیادی دارد که برخی از آن ها عبارت اند از:
ساز و کار کلی این ابزار به شکل زیر است:
این ابزار میان برنامه های سمت Cllient و سرویس های Backend قرار می گیرد. سرویس های Backend می توانند شامل ESB و پایگاه داده و غیره باشند. همچنین Client ها نیز می توانند دستگاه های موبایل یا کامپیوتر یا سایر مشتریان باشند.
ابزار Apache APISIX:
ابزار APISIX ساخت کشور چین است. معاون این پروژه بیان می کند که این ابزار چالشهای مختلفی که سرویسهای بومی ابری و میکروسرویسها ایجاد میکنند را حل میکند. شرکت های معروف مختلفی از جمه از این ابزار استفاده می کنند. این ابزار هم مبتنی بر NGINX است و مزایای زیادی دارد که مهم ترین آن ها عبارت اند از:
البته ابزار های متن باز دیگری مانند KrakenD و Gloo Edge و WSO2 و Fusio و Apiman و ... وجود دارند که ما به معرفی سه ابزار معروف فوق اکتفا کردیم.
شرکت های درساکلاود (سیستم خبره درسا) و سورنا از جمله شرکت های ایرانی معتبر هستند که در این زمینه فعالیت می کنند. البته این مبحث تقریبا جدید است و در ایران نیز بسیار جای کار و پیشرفت دارد.
استفاده از API Gateway اجباری نیست و بدون آن هم نرم افزار کار می کند اما استفاده از آن مزایا و معایبی را به همراه دارد که با هم دیدیک. لذا باید دقت داشت که در هر نوع سیستم نرم افزاری ای استفاده از آن جایز نیست و تنها وقت هایی که وجود API Gateway باعث افزایش کارآیی و کاهش پیچیدگی می شود باید از آن استفاده کرد. همچنین انتخاب ابزار درست برای این کار بسیار مهم است و بهتر است تا نوسط یک شخص باتجربه انجام بگیرد. اما به طور کلی بهتر است که در مواقعی که نرم افزارمان با معماری میکروسرویس زده شده و تعداد زیادی میکروسرویس داریم از آن استفاده شود. در کل مفهوم API Gateway همچنان جدید است و جای تحقیق و ارتقای بسیار زیادی دارد. امیدواریم که این مطلب برای شما مفید بوده باشد.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است
[1] https://www.nginx.com/learn/api-gateway
[2] https://dashbird.io/knowledge-base/api-gateway/pros-and-cons-of-using-an-api-gateway
[3] https://microservices.io/patterns/apigateway.html
[4] https://geekflare.com/api-gateway/#anchor-apache-apisix
[5] https://www.baeldung.com/kong
[6] https://www.tecmint.com/open-source-api-gateways-and-management-tools/