زنجیره درخواست های API با API Gateway

با افزایش تعداد APIهایی که نیاز به ادغام دارند، مدیریت پیچیدگی تعاملات API به طور فزاینده ای چالش برانگیز می شود. با استفاده از API Gateway میتوانیم دنبالهای از فراخوانهای API ایجاد کنیم که گردشهای کاری API را به مراحل کوچکتر و قابل مدیریتتر تقسیم میکند. به عنوان مثال، در یک وبسایت خرید آنلاین، زمانی که مشتری یک محصول را جستجو میکند، پلتفرم میتواند درخواستی را به API جستجوی محصول ارسال کند، سپس برای بازیابی اطلاعات بیشتر درباره محصولات، درخواستی را به API جزئیات محصول ارسال کند. در این مقاله، ما یک افزونه سفارشی ایجاد کنید برای Apache APISIX API Gateway برای رسیدگی به درخواست های مشتری که باید به ترتیب فراخوانی شوند.
اهداف یادگیری
در طول مقاله موارد زیر را خواهید آموخت:
- درخواست های API زنجیره ای چیست؟
- نمونه ای از تماس های متوالی API.
- چگونه یک پلاگین درخواست خط لوله سفارشی برای Apache APISIX بسازیم.
- نسخه ی نمایشی افزونه درخواست خط لوله.
درخواست API زنجیرهای چیست و چرا به آن نیاز داریم؟
زنجیرهای کردن درخواستهای API (یا درخواستهای خط لوله، یا فراخوانهای متوالی API) تکنیکی است که در توسعه نرمافزار برای مدیریت پیچیدگی تعاملات API استفاده میشود که در آن نرمافزار برای تکمیل یک کار به چندین تماس API نیاز دارد. این شبیه به پردازش درخواست دسته ای است که در آن چندین درخواست API را در یک درخواست گروه بندی می کنید و آنها را به عنوان یک دسته به سرور ارسال می کنید. اگرچه ممکن است مشابه به نظر برسند، یک درخواست خط لوله شامل ارسال یک درخواست واحد به سرور است که دنباله ای از درخواست های API را راه اندازی می کند. به ترتیب تعریف شده اجرا شود. هر درخواست API در دنباله می تواند داده های درخواست و پاسخ را تغییر دهد و پاسخ یک درخواست API به عنوان ورودی به درخواست API بعدی در دنباله ارسال می شود. درخواستهای خط لوله زمانی میتوانند مفید باشند که یک کلاینت نیاز به اجرای دنبالهای از درخواستهای API وابسته دارد که باید به ترتیب خاصی اجرا شوند.
در هر مرحله از خط لوله، ما می توانیم تبدیل یا دستکاری داده های پاسخ را قبل از انتقال به مرحله بعدی. این می تواند در شرایطی که داده ها باید وجود داشته باشند مفید باشد نرمال یا تبدیل شده است یا فیلتر کردن داده های حساس قبل از اینکه به مشتری بازگردانده شود. می تواند کمک کند کاهش تاخیر کلی. به عنوان مثال، یک تماس API را می توان در حالی که دیگری منتظر پاسخ است، برقرار کرد و زمان کلی مورد نیاز برای تکمیل گردش کار را کاهش داد.
پلاگین درخواست خط لوله سفارشی برای Apache APISIX
یک دروازه API می تواند مکان مناسبی برای پیاده سازی این عملکرد باشد زیرا می تواند تمام درخواست های برنامه مشتری را رهگیری کند و آنها را به مقصد مورد نظر ارسال کند. ما قصد داریم از Apache APISIX استفاده کنیم زیرا یک راهحل API Gateway منبع باز محبوب با مجموعهای از پلاگینهای داخلی است. با این حال، در زمان توسعه پست وبلاگ فعلی، APISIX پشتیبانی رسمی از افزونه درخواست خط لوله نداشت. با آگاهی از قابلیت های توسعه افزونه های سفارشی APISIX، تصمیم گرفتیم افزونه جدیدی را معرفی کنیم که می تواند همین ویژگی را ارائه دهد. یک مخزن در GitHub با کد منبع نوشته شده به زبان برنامه نویسی Lua و شرحی از افزونه درخواست خط لوله وجود دارد.
با استفاده از این افزونه، می توانید لیستی از APIهای بالادستی را مشخص کنید که باید به ترتیب برای رسیدگی به یک درخواست مشتری واحد فراخوانی شوند. هر API بالادستی میتواند دادههای درخواست و پاسخ را تغییر دهد و پاسخ یک API بالادستی به عنوان ورودی به API بالادستی بعدی در خط لوله ارسال میشود. خط لوله را می توان در یک پیکربندی مسیر تعریف کرد، و همچنین می توانید دستوراتی را برای URL های API در زمانی که خط لوله باید آنها را اجرا کند، تعریف کنید.
بیایید با یک مثال کاربرد این افزونه را درک کنیم. فرض کنید دو API دارید – یکی که GET را می سازد /credit_cards
درخواست برای بازیابی اطلاعات کارت اعتباری و دیگری که داده های پاسخ قبلی را در بدنه POST دریافت می کند /filter
درخواست کنید و سپس داده های حساس (مانند شماره کارت اعتباری و تاریخ انقضا) را قبل از بازگرداندن پاسخ به مشتری فیلتر می کند. زیرا نقطه پایانی API کارت اعتباری اطلاعات حساسی را برمیگرداند که نباید در معرض اشخاص غیرمجاز قرار گیرد. نمودار زیر جریان کلی داده را نشان می دهد:
- هنگامی که مشتری برای بازیابی تمام اطلاعات کارت اعتباری به نقطه پایانی API کارت اعتباری دروازه API درخواست میکند، API Gateway درخواستی را برای بازیابی اطلاعات کارت اعتباری از سرویس کارت اعتباری ارسال میکند.
- اگر درخواست موفقیت آمیز باشد و داده های کارت اعتباری را برگرداند، به مرحله بعدی در خط لوله که سرویس امنیتی است منتقل می شود
- هنگامی که پاسخ فیلتر شده از سرویس امنیتی دریافت می شود، پاسخ ترکیبی را به مشتری برمی گرداند.
نسخه ی نمایشی افزونه درخواست خط لوله
برای این نسخه آزمایشی، ما قصد داریم از پروژه آزمایشی آماده دیگری در GitHub استفاده کنیم که در آن میتوانید تمام نمونههای دستور curl استفاده شده در این آموزش را پیدا کنید، APISIX را اجرا کنید و یک پلاگین سفارشی را بدون پیکربندی اضافی با یک فایل Docker compose.yml فعال کنید.
پیش نیازها
-
Docker برای نصب etcd کانتینری و APISIX استفاده می شود.
-
از curl برای ارسال درخواست به APISIX Admin API استفاده می شود. همچنین می توانید از ابزارهای آسانی مانند Postman برای تعامل با API استفاده کنید.
مرحله 1: APISIX و etcd را نصب و اجرا کنید
شما می توانید به راحتی APISIX و etcd را با اجرا نصب کنید docker compose up
پس از فورک/کلون کردن پروژه از پوشه ریشه پروژه. ممکن است متوجه شوید که یک حجم وجود دارد ./custom-plugins:/opt/apisix/plugins:ro
مشخص شده در docker-compose.yml
فایل. این دایرکتوری محلی را نصب می کند*./custom-plugins
* جایی که ما pipeline-request.lua
فایل با اجرای پلاگین سفارشی به عنوان یک حجم فقط خواندنی در ظرف docker در مسیر /opt/apisix/plugins
. این اجازه می دهد تا پلاگین های سفارشی در زمان اجرا به APISIX اضافه شوند (این تنظیمات فقط در صورتی قابل اجرا است که APISIX را با docker اجرا کنید).
مرحله 2: اولین مسیر را با افزونه درخواست خط لوله ایجاد کنید
هنگامی که APISIX اجرا می شود، از دستور cURL استفاده می کنیم که برای ارسال درخواست HTTP PUT به APISIX Admin API استفاده می شود. /routes
نقطه پایانی برای ایجاد اولین مسیری که به مسیر URI گوش می دهد /my-credit-cards
.
curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \
--header 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
--header 'Content-Type: application/json' \
--data-raw '{
"uri":"/my-credit-cards",
"plugins":{
"pipeline-request":{
"nodes":[
{
"url":"https://random-data-api.com/api/v2/credit_cards"
},
{
"url":"http://127.0.0.1:9080/filter"
}
]
}
}
}'
بخش مهم پیکربندی، بخش “plugins” است که مشخص می کند پلاگین “pipeline-request” باید برای این مسیر API استفاده شود. پیکربندی پلاگین حاوی یک آرایه “گره ها” است که دنباله درخواست های API را که باید در خط لوله اجرا شوند را مشخص می کند. شما می توانید یک یا چند API را در آنجا تعریف کنید. در این مورد، خط لوله از دو گره تشکیل شده است: گره اول درخواستی را برای بازیابی اطلاعات کارت اعتباری به https://random-data-api.com/api/v2/credit_cards ****API ارسال می کند، و گره دوم درخواستی را برای بازیابی اطلاعات کارت اعتباری ارسال می کند. node درخواستی را به یک API محلی در http://127.0.0.1:9080/filter ارسال می کند تا داده های حساس را از اطلاعات کارت اعتباری فیلتر کند. API دوم فقط یک عملکرد بدون سرور با استفاده از پلاگین APISIX-pre-function بدون سرور خواهد بود. این فقط به عنوان یک سرویس پشتیبان برای تغییر پاسخ از اولین API عمل می کند.
مرحله 3: مسیر دوم را با افزونه بدون سرور ایجاد کنید
در مرحله بعد، مسیر جدیدی را با شناسه 2 پیکربندی میکنیم که درخواستها را مدیریت میکند /filter
نقطه پایانی در خط لوله همچنین افزونه موجود APISIX با عملکرد بدون سرور را فعال می کند که در آن ما یک تابع Lua را مشخص می کنیم که باید توسط افزونه اجرا شود. این تابع به سادگی بدنه درخواست را از پاسخ قبلی بازیابی می کند، فیلد شماره کارت اعتباری را جایگزین می کند و بقیه پاسخ را بدون تغییر می گذارد. در نهایت، بدنه پاسخ فعلی را روی بدنه درخواست اصلاح شده تنظیم می کند و یک پاسخ HTTP 200 را برای مشتری ارسال می کند. شما می توانید این اسکریپت را مطابق با نیازهای خود تغییر دهید، مانند استفاده از بدنه رمزگشایی شده برای انجام پردازش یا اعتبار سنجی بیشتر.
curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/2' \
--header 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
--header 'Content-Type: application/json' \
--data-raw '
{
"uri": "/filter",
"plugins":{
"serverless-pre-function": {
"phase": "access",
"functions": [
"return function(conf, ctx)
local core = require(\"apisix.core\")
local cjson = require(\"cjson.safe\")
-- Get the request body
local body = core.request.get_body()
-- Decode the JSON body
local decoded_body = cjson.decode(body)
-- Hide the credit card number
decoded_body.credit_card_number = \"****-****-****-****\"
core.response.exit(200, decoded_body);
end"
]
}
}
}'
مرحله 3: تنظیم تست
اکنون زمان آن است که پیکربندی کلی را آزمایش کنید. با دستور curl زیر، یک درخواست HTTP GET را به نقطه پایانی ارسال می کنیم http://127.0.0.1:9080/my-credit-cards
.
curl http://127.0.0.1:9080/my-credit-cards
ما مسیر مربوطه را در مرحله دوم برای استفاده از آن پیکربندی کرده ایم pipeline-request
افزونه با دو گره، این درخواست خط لوله را برای بازیابی اطلاعات کارت اعتباری از https://random-data-api.com/api/v2/credit_cards
نقطه پایانی، داده های حساس را با استفاده از فیلتر فیلتر کنید http://127.0.0.1:9080/filter
نقطه پایانی، و پاسخ اصلاح شده را به مشتری برگردانید. خروجی را ببینید:
{
"uid":"a66239cd-960b-4e14-8d3c-a8940cedd907",
"credit_card_expiry_date":"2025-05-10",
"credit_card_type":"visa",
"credit_card_number":"****-****-****-****",
"id":2248
}
همانطور که می بینید، شماره کارت اعتباری را در بدنه درخواست (در واقع، پاسخ اولین تماس API در زنجیره است) با ستاره جایگزین می کند.
خلاصه
تا به حال، ما یاد گرفتیم که پلاگین درخواست خط لوله سفارشی ما برای دروازه Apache APISIX API به ما اجازه می دهد تا دنباله ای از فراخوانی های API را به عنوان خط لوله در یک ترتیب خاص تعریف کنیم. همچنین میتوانیم از این افزونه جدید با ترکیبی از افزونههای موجود برای فعال کردن احراز هویت، امنیت و سایر ویژگیهای API Gateway برای نقاط انتهایی API خود استفاده کنیم.
منابع مرتبط
محتوای پیشنهادی
انجمن
🙋 به انجمن آپاچی APISIX بپیوندید
🐦 ما را در توییتر دنبال کنید
📝 ما را در Slack پیدا کنید
💁 صفحه نحوه مشارکت
درباره نویسنده
از وبلاگ من دیدن کنید: www.iambobur.com