دروازه‌ها را باز کنید/ مفهوم API Gateway و استفاده‌ها

بذارید شروع مطلب رو با تعریف‌های پایه شروع کنیم و به طرح مسئله‌مون برسیم. تعریف پایه‌مون رو هم بذاریم API.API, API in Systems, and Finally API Gateway! همونطور که میتونید API مخفف عبارت Application Programming Interface است. تعریف آن براساس چیزی که در ویکیپدیا به آن اشاره شده است به صورت زیر است:An application programming interface (API) is a connection between computers or between computer programs. It is a type of software interface, offering a service to other pieces of software.مبحث قابل بحث ما در حوزه وب است پس به زبان فارسی و در محدوده‌ای که قابل بحث این مطلب است API به واسط برنامه‌نویسی گفته می‌شود که بین دو عامل قرار می‌گیرد. دو عامل را در این قسمت Client و Server در نظر می‌گیریم. پس هر ارتباطی که بین این دو عامل صورت بگیرد را با کمک این مفهوم تعریف می‌کنیم. این ارتباط می‌تواند از چندین نوع مختلف کلاینت و با اهداف مختلف صورت گیرد. برای مثال فرض کنید شما یک سایت پخش آنلاین فیلم هستید که کاربران از طریق تلویزیون، گوشی، تبلت، لپتاپ یا هر وسیله ارتباطی دیگری از شما سرویس می‌گیرند. حال بگذارید یک سری از ویژگی‌هایی که در این ارتباطات مشاهده می‌شود را مشخص کنیم. مثلا ممکن است یکی از سرویس‌ها ( مثلا لاگین ) به دو API نیاز داشته باشد. یکی جهت تعیین هویت کاربر و دیگری جهت دریافت اطلاعات کاربر. برای این کار می‌توان چندین راه‌حل ارائه کرد. یکی از راه‌حل‌ها می‌تواند این باشد که در قسمت کلاینت ریکوئست اول حهت تعیین هویت کاربر زده شود و پس از تایید آن اطلاعات کاربر گرفته شود. اما این کار سربار ریکوئست‌ها را زیاد می‌کند و موجب شلوغ شدن سرور و حتی کند شدن آن می‌شود و همچنین رفت و آمد زیادی بین کلاینت و سرور ایجاد می‌کند. راه‌حل جایگزین می‌تواند این باشد که یک لایه میانی بین server و client قرار گیرد تا این لایه میانی هر دو ریکوئست را بزند و نتیجه نهایی را به client بزند. به این صورت دیگر رفت و آمد بین سرور و کلاینت کاهش می‌یابد و همچنین سرعت انتقال ریکوئست‌ها کمتر به سرعت اتصال کلاینت تا سرور مرتبط است زیرا اکثر ریکوئست‌ها در لایه بین لایه میانی و لایه سرور زده می‌شود. این لایه میانی که یکی از مسائل ما را در زمینه ارتباط بین entity های مختلف را حل می‌کند API Gateway نامیده می‌شود.هدف از ایجاد API Gateway بودن به عنوان یک لایه میانی است تا بتواند عوامل زیر را ویژگی‌های زیر را در سیستم‌ها مجهز کند:SecureScale Protocol TranslationLoad balancing Cachingبا کمک API Gateway ها می‌توان اپ را Secure کرد. برای این کار لایه میانی می‌تواند ارتباط مستقیمی که بین کلاینت و سرور بود را از بین ببرد و مطمئن شود تا ریکوئست ارسالی اعتبار کافی جهت ارسال ریکوئست به سرور را دارا است. این ویژگی می‌تواند در هر دو معماری Monolithic و Microservice پیاده‌سازی شود.از جهت Scale کارهای متعددی از سمت API Gateway صورت می‌گیرد. یکی از این کارها همانطور که در ابتدای مطلب به آن اشاره شد این است که به جای اینکه ریکوئست‌ها به صورت رفت و برگشتی باشند درخواست‌ها در قسمت API Gateway می‌زند و باعث می‌شود تا round trip و ریکوئست‌هایی که بین کلاینت و سرور به صورت پشت سر هم ارسال می‌شد کاهش یابد. این کاهش باعث می‌شود تا معماری در قسمت ارسال درخواست از API Gateway به سرور‌ها و سرویس‌های مختلف میکروسرویس ساده‌تر شود. یکی از این سادگی‌ها حذف بسیاری از موارد صحت کاربر در ریکوئست‌ها است. به این صورت که فقط ریکوئست ارسالی اول از سمت کلاینت مورد بررسی قرار می‌گیرد و بقیه ریکوئست‌ها با دیتا و payload کمتری ارسال می‌شود. این کاهش داده باعث می‌شود تا حجم پردازش چندین برابر کمتر شود. از طرفی حذف بسیاری از ریکوئست‌ها در لایه کلاینت باعث می‌شود تا سرعت برقراری اتصالات افزایش یابد و همین نیز موجب Scalability می‌شود.به دلیل وجود این لایه میانی میتوان پروتکل‌های مختلفی را پشتیبانی کرد. به این صورت که هر ریکوئستی با هر پروتکل و دیتایی که لازم است به API Gateway ریکوئست ارسال کند و API Gateway با تبدیل پروتکل به پروتکل‌هایی که توسط سرویس‌ها پشتیبانی می‌شود اطلاعات را ارسال کند و در هنگام پاسخ دهد این عکس این عمل را انجام دهد و دروازه‌های جدیدی جهت ارسال ریکوئست ایجاد کند. با این کار کلاینت‌های مختلف که نیازمند ارسال ریکوئست با پروتکل‌های متناسب با شرایط خود هستند امکان ارسال درخواست را دارا خواهند بود و این معماری باعث می‌شود تا پشتیبانی از این نوع درخواست‌ها مستقل از توسعه کد باشد که به ماژولار کردن بیشتر کد کمک می‌کند. همچنین می‌توان با کمک این معماری یک Load Balancer نیز داشته باشیم. با این هدف که بتوانیم ریکوئست‌های مختلف را بین سرور‌های مختلف پخش کنیم تا از حجوم درخواست به یک سرور مشخص و ایجاد سربار زیاد در آن جلوگیری شود. با این کار به اصلاح لود ریکوئست‌ها بالانس شده و باعث می‌شود تا بتوان به Scale سیستم نیز کمک شود. همچنین می‌توان با کمک این ویژگی بررسی کرد تا اگر دیتایی از سروری نیامد ریکوئست را به سرور دیگری ارسال کرد و با این کار از پایین بودن سرور و فرستاده نشدن ریسپانس به ریکوئست‌ها جلوگیری کرد.یکی از مواردی که به ما در ارسال پاسخ‌ها کمک می‌کند caching است. اگر بتوانیم پاسخ ریکوئست‌هایی را که قبلا ارسال شده ذخیره کنیم می‌توانیم در موارد متعددی از آن استفاده کنیم. در واقع لایه cache کمک می‌کند تا با کمک آن در مواردی که سرور پایین است یا نیازمند پاسخ‌دهی سریعتر هستیم با کمک آن سریعتر ریسپانس را ارسال کنیم. سرویس‌های ایرانی ارائه‌دهنده API Gateway: در ادامه به بیان دو سرویس‌دهنده ایرانی در این زمینه می‌پردازیم. این دو سرویس دهنده عبارتند از:سرویس ابر درسا سرویس وصلابر درسا: این سرویس دهنده محصولات متنوعی دارد. یکی از این محصولات به API Gateway اختصاص دارد که نحوه کار آن به صورت کار با پنلی‌است که در اختیار صاحب وب‌سایت قرار می‌دهد. نمایی از این پنل را در زیر مشاهده کنید:پنل ابر درساهمانطور که مشاهده می‌کنید جهت استفاده نباید رکوردی با هاست را در DNS سروری که دست شماست تنظیم کنید. ابتدا مقدار host را مشخص کنید که نشان‌دهنده همان ip سرور شماست که در دامنه‌ای با همان هاست موردنظر بالا آمده است. path را که همان ادرس صفحه موردنظرتان هست را وارد کنید. host و path با یکدیگر صفحه مشخص را مشخص می‌کنند ( host:path ) و شما می‌توانید در این قسمت با کمک الگوریتم‌های مشخصی تعیین کنید که برای دسترسی به صفحات مشخص به کدام سرور مشخص ریکوئست زده شود تا این ترافیک پخش شود و از مشکلات احتمالی آینده جلوگیری شود.الگوریتم‌هایی که این سامانه تاکنون از آنان پشتیبانی می‌کند به صورت زیر است: FirstRandomRoundRobinLeastRequestsPowerOfTwoChoicesاین سامانه می‌تواند در آینده امکانات بیشتری را اضافه کند (!).نحوه پرداخت نیز به این صورت است که پس از انتخاب سرویس موردنظر خود می‌توانید فاکتور آن را جهت استفاده در مدت زمان معین پرداخت کنید.وصل:شرکت وصل یک سامانه با نام سورنا جهت مدیریت API یا با استفاده مشخص‌تر API Gateway راه‌اندازی کرده است. پلتفرم مدیریت API سورنا توسعه‌دهندگان را قادر می‌سازد تا برنامه‌هایی مرتبط با سامانه‌های داخلی سازمان/سرویس‌دهنده طراحی و پیاده‌سازی نمایند. همچنین APIها در تکنولوژی‌های مختلف نظیر اینترنت اشیا، رایانش ابری و داده‌های حجیم نقشی کلیدی را ایفا می‌نماید. پلتفرم مدیریت API سورنا پایداری، امنیت و پشتیبانی ویژهای ارائه می‌کند تا شرکت‌های طرف ثالث، همکاران، شرکا و حتی توسعه‌دهندگان آزاد بتوانند با آسودگی خیال و اطمینان از آنها استفاده نمایند. ( برگرفته از توضیحات وب‌سایت وصل )امکاناتی که این سامانه و پلتفرم در اختیار کاربران می‌دهد به شرح زیر است:مدیریت چرخه APIها با یک پلتفرم واحدفروشگاه ; کسب درآمد از سرویس‌هاامنیت، اعتماد در ارائه خدماتراه‌حل برای اینترنت اشیاءمانیتورینگ قدرتمندپنل مدیریت پیشرفتهابزار‌های متن‌باز برای استفاده از API Gateway:یکی از ابزارهای متن‌باز جهت استفاده به عنوان API Gateway نرم‌افزار متن باز nginx است:لینک اصلی سایت nginx:https://www.nginx.com/resources/wiki/#:~:text=NGINX%20is%20a%20free%2C%20open,an%20IMAP%2FPOP3%20proxy%20server.&amp;amp;amp;amp;amp;text=NGINX%20is%20one%20of%20a,to%20address%20the%20C10K%20problem. لینک ریپازیتوری گیت‌هاب:https://github.com/nginxنرم افزار NGINX یک سرور رایگان، منبع باز و HTTP با کارایی بالا و پراکسی معکوس و همچنین یک سرور پراکسی IMAP/POP3 است. NGINX به دلیل عملکرد بالا، پایداری، مجموعه ویژگی های غنی، پیکربندی ساده و مصرف کم منابع شناخته شده است.این وب‌سرور که توسعه آن از اکتبر ۲۰۰۴ شروع شده است برای سرو کردن بسیاری از سامانه‌هایی که هم اکنون در حال فعالیت هستند استفاده می‌شود و به جز API Proxy بسیاری از قابلیت‌های دیگر را نیز در اختیار کاربران قرار می‌دهد و استفاده‌های متنوعی دارد.نرم‌افزار NGINX به عنوان پراکسی معکوس و متعادل کننده بار با کارایی بالا و سبک وزن، دارای قابلیت های پیشرفته پردازش HTTP مورد نیاز برای مدیریت ترافیک API است. این باعث می شود NGINX به پلتفرم ایده آلی برای ساخت یک دروازه API تبدیل شود. جهت پیاده‌سازی ساده یک API Gateway تنها لازم است با کمک دستور proxy pass در nginx آشنا شوید. به قطعه کد زیر دقت کنید:location /api/warehouse/inventory { proxy_pass http://warehouse_inventory; } با همین دستور ساده می‌توان آدرس /api/warehouse/inventory آدرس را به آدرس ware_house_inventory پراکسی کرد. با کمک دستورات دیگر می‌توان استفاده‌های کامل‌تری از این نرم‌افزار کرد.برای آشنایی بیشتر می‌توانید به لینک زیر مراجعه کنید: Deploygin Nginx as an API Gateway - https://www.nginx.com/blog/deploying-nginx-plus-as-an-api-gateway-part-1/ یکی دیگر از گزینه‌های متن‌باز برای استفاده به عنوان API Gateway میتواند kong باشد. ریپازیتوری این نرم‌افزار در لینک زیر قابل دسترسی است:kong - open source API Gatewayking - https://github.com/Kong/kongاز جمله کارهایی که توسعه‌دهندگان kong انجام داده است این است که تمامی فیچر‌های نام‌برده برای proxy را به صورت پیش‌فرض برنامه‌نویسی کرده‌اند و برنامه‌نویس می‌تواند تنها با کمک دانستن api بیان شده توسط kong کانفیگ موردنظر خود را مشخص کند و از هرکدام از فیچر‌های از قبل برنامه‌نویسی شده استفاده کند. این امکان باعث می‌شود تا توسعه دهندگان دیگر به اختراع کردن چرخ از اول نپردازند و تمرکز خود را بر روی حل مسائل پیچیده‌تر بگذارند. از جمله مواردی که این نرم‌افزار پیاده‌سازی کرده است موارد زیر است:Advanced routing: این فیچر همان ریدایرکت کردن یا پروکسی را با امکانات بیشتر در اختیار قرار می‌دهدload balancing: https://docs.konghq.com/getting-started-guide/2.1.x/load-balancing/health checking: https://docs.konghq.com/gateway-oss/2.5.x/health-checks-circuit-breakers/Proxy, SSL/TLS termination, and connectivity support for L4 or L7 traffic.Plugins for enforcing traffic controls: با کمک این قسمت به کنترل مشخص‌تر روی ترافیک و حتی گذاشتن ریت‌لیمیت روی ریکوئست‌ها می‌توان کمک کردمنابع:What Is an API Gateway? - https://www.youtube.com/watch?v=1vjOv_f9L8IWhat is API gateway really all about? Java Brains - Brain Bytes : https://www.youtube.com/watch?v=1vjOv_f9L8Inginx - https://www.nginx.com/resources/wiki/nginx - API Gateway: https://www.nginx.com/learn/api-gateway/این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است.