۳-۱- مزایا و معایب استفاده از API Gateway:
مثل هر کار دیگری استفاده از API Gateway هم مزایا و معایب خاص خود را دارد که ابتدا به مزایای آن میپردازیم. بزرگترین مزیت آن از بین بردن معایب روش دسترسی مستقیم است. عدم وابستگی به معماری داخلی سیستم ما باعث میشود کار Refactoring سادهتر قابل اجرا باشد و دیگر برای ترکیب یا تجزیه سرویسهای مختلف دغدغههای قبل را نداشته باشیم( پیدا کردن جایی تا زمانی که آبها از آسیاب بیوفتد). ارائه API تخصصی برای هر Client باعث افزایش بهرهوری و بهبود خروجیها و در یک کلام UX بهتر میشود. کاهش تعداد درخواستهای ارسالی از Client هم مورد بعدی است که بهرهوری کار را بالاتر میبرد.
در کنار این مزایا اما چند ایراد نیز میتوان به استفاده از این روش گرفت. بزرگترین ایراد این روش اضافه شدن یک ماژول بزرگ به سیستم است که باید همیشه سرحال و آنلاین باشد و در صورتی که عملکرد درستی ارائه نکند کل سیستم با مشکل مواجه خواهد شد. با توجه به اینکه تعامل با هرکدام از میکروسرویسها باید در API Gateway پیاده سازی شود و به ازای هر Clientهم نیاز داریم که پیاده سازی اختصاصی داشته باشیم این احتمال وجود دارد که همین API Gateway به سدی برای تیم توسعه تبدیل شود. زمانی که یک سرویس به روز میشود clientها باید منتظر بمانند تا این به روزرسانی در Gateway ارائه شود. به همین دلیل باید توسعه API Gateway ما طوری باشد که به سادگی قابل تغییر و به روزرسانی باشد.
با وجود تمامی این مشکلات اما نکات مثبت استفاده از این الگو به قدری زیاد است که نمیتوان به سادگی از این الگو چشم پوشی کرد.
۳-۲ پیاده سازی API Gateway:
حال که با مزایا و معایب API Gateway آشنا شدیم به بررسی چند نکته در رابطه با پیاده سازی آن خواهیم پرداخت.
۳-۲-۱- مسئله بهرهوری و مقیاس پذیری:
احتمالا تعداد انگشتشماری شرکت در دنیا مانند Netflix وجود دارند که نیاز دارند روزانه به میلیونها و میلیاردها درخواست پاسخ بدهند و از دسترس خارج شدن آنها حتی برای چند لحظه غیر قابل قبول باشد. با این حال با توجه به شرایطی که بررسی شد،بهره وری بالا و قابلیت مقیاس پذیری از نیازهای اولیه هر API Gateway است. ابزارها و زبانهای مختلفی وجود دارد که میتواند این ویژگیها را در اختیار شما قرار دهد که برای مثلا میتوان به .net core و Node.js اشاره کرد.
۳-۲-۲- استفاده از مدل برنامه نویسی Reactive:
در بعضی موارد میتوان به سادگی درخواستهای ورودی را به یک مسیر جدید ارسال کرد و نتیجه را دریافت کرد و به کاربر بازگرداند. در بعضی موارد هم ممکن است یک درخواست ورودی به چندین سرویس ارجاع داده شود و در نهایت نتیجه تمامی این درخواستها با هم ترکیب شود و به کاربر بازگردانده شود. در بعضی موارد هم ممکن است یک درخواست نیاز باشد از چند سرویس استفاده کند اما ترتیب و توالی استفاده از این سرویسها اهمیت داشته باشد. برای مثال زمانی که قرار است به کاربری کالا پیشنهاد داده شود ابتدا لازم است تنظیمات و علائق کاربر از سرویس کاربران دریافت شده و سپس با اطلاعات دریافتی کالاهای پیشنهادی پیدا شده و در اختیار کاربر قرار بگیرد.
با توجه به شرایط توضیح داده شده احتمالا استفاده از روشهای معمول برنامه نویسی خیلی زود ما را وارد جهنمی از کدهای پیچیده و غیرقابل خواندن و تغییر میکند. پس بهتر است به روشی توسعه خود را انجام دهیم که مناسب شرایط باشد. در این شرایط به نظر میرسد Reactive Programming راهکار بهینهتری نسبت به روش معمول برنامه نویسی باشد.
۳-۳-۳- راهکارهای تعامل:
در یک API Gateway نیاز است با سرویسهای مختلف تعامل انجام شود و اصطلاحا Inter-Process Communication انجام شود. سرویسهای مختلف ممکن است راهکارهای متفاوتی برای تعامل در اختیار ما قرار دهند. ممکن است از روشهای Async مثل AMQP یا روشهای sync مثل HTTP و Thrift استفاده شود. به هر حال بدون توجه به روشهای تعامل API Gateway مورد نظر ما باید بتواند با تمامی این روشها ارتباط برقرار کند.
۳-۳-۴- یافتن آدرس سرویسها:
وقتی Gateway را پیاده سازی میکنیم باید به این موضوع فکر کنیم که نیاز داریم آدرس سرویس های مختلف را پیدا کنیم. در روشهای قدیمی احتمالا نرم افزارهای ما به راحتی روی یک سرور نصب میشوند و دانستن آدرس آنها کار سختی نخواهد بود. اما در روشهای جدید و استفاده از سرویسهای ابری آدرس دیگر به سادگی و ثابت به دست نمیآید پس باید قبل از هر مسئلهای به یافتن آدرس میکروسرویسها بیاندیشیم. در قسمتهای بعد به طور مفصل راجع به این مشکل و راه حل آن صحبت خواهیم کرد.
۳-۳-۵- مدیریت خطاها:
مشکل دیگری که هنگام توسعه یک API Gateway باید به آن بیاندیشیم partial failure است. یعنی زمانی که یک درخواست کلی میآید و بخشی از درخواست قابل پاسخ گویی نیست. مثلا در سیستم فروشگاه و صفحه جزئیات فروشگاه یکی از سرویسها در دسترس نباشد. مثلا سرویس پیشنهاد کالا در دسترس نباشد. API Gateway باید این قابلیت را داشته باشد که در این شرایط به جای اینکه کل درخواست را لغو کند،دادههای بخشهای صحیح را به دست آورد و برای بخشهای مشکل دار خطا را مدیریت کند. برای مثال دادههای کش شده داشته باشد که در این شرایط جایگزین دادههای آنلاین شود. یا مثلا در صورتی که سرویس پیشنهاد کالا قطع باشد ۱۰ کالای پرفروش را بازگرداند.
۴- جمع بندی:
در این قسمت راجع به یکی از الگوهای پرکاربرد و شرایط و نیازمندیهای توسعه آن صحبت کردیم. پیاده سازی یک API Gateway خالی از لطف نیست و میتواند به درک بهتر چگونگی پیاده سازی این الگو کمک کند. با این حال برای پروژههای عملیاتی با توجه به شرایط و نیازهای پروژه استفاده از ابزارهای آماده برای این کار مانند Kong، aws api gateway یا Ocelot گزینههای بهتری است.
منبع:nikamooz