إدارة GraphQL API بكفاءة باستخدام API Gateway
March 21, 2023
GraphQL هي لغة استعلام قوية للواجهات البرمجية للواجهات البرمجية (APIs) تسمح للمطورين بتحديد هيكل البيانات التي يحتاجونها من الخادم، ويقوم الخادم بالرد بتلك البيانات فقط. هذا يجعلها أكثر كفاءة ومرونة من واجهات برمجية REST التقليدية، والتي غالبًا ما تتطلب طلبات متعددة لاسترداد نفس البيانات. ومع ذلك، يمكن أن يكون إدارة واجهات برمجية GraphQL معقدًا ويستغرق وقتًا طويلاً، خاصة على نطاق واسع. هنا يأتي دور بوابة API.
إحدى الميزات الرئيسية لبوابات API الحديثة مثل Apache APISIX هي دعمها لواجهات برمجية GraphQL. يجعل APISIX من السهل إدارة وتوسيع واجهات برمجية GraphQL باستخدام نظام التكوين المرن والإضافات القوية. إحدى هذه الإضافات هي degrapghql التي تسمح لنا بتحويل واجهة برمجية GraphQL إلى واجهة برمجية REST. في هذا المنشور، سنستكشف هذه الميزة مع مثال.
أهداف التعلم
ستتعلم وتجد إجابات للأسئلة التالية خلال المقال:
- ما هي إضافة DeGraphQL؟
- ما هي حالات الاستخدام والميزات الخاصة بإضافة DeGraphQL؟
- كيفية استخدام إضافة DeGraphQL.
- كيفية تحويل REST إلى GraphQL؟
- كيفية إدارة حركة مرور واجهة برمجية GraphQL؟
لماذا نستخدم إضافة DeGraphQL؟
هذه الإضافة قادرة على تحويل واجهات برمجية معروضة بواسطة خدمة خلفية GraphQL إلى نقطة نهاية REST تقليدية عن طريق تعيين URIs إلى استعلامات GraphQL. استدعاء واجهات برمجية REST من عميل عادي يفتح فوائد GraphQL لمزيد من الأشخاص، فكر في حالات الاستخدام التالية:
حالة الاستخدام 1: عملاؤك الحاليون معتادون على استهلاك واجهات برمجية REST وليسوا على دراية بكيفية كتابة استعلامات GraphQL. من أجل تبسيط الأمور لهم، يمكنك استخدام بوابة Apache APISIX API لتحويل واجهة برمجية GraphQL إلى واجهة برمجية REST.
حالة الاستخدام 2: أنت في فريق تطوير الواجهة الأمامية الذي يرغب في تجربة وظائف واجهة برمجية GraphQL الحالية دون طلب من فريق الخلفية تنفيذ خادم GraphQL جديد.
حالة الاستخدام 3: ليس لديك حق الوصول لتغيير الخلفية لأنها مجموعة موجودة من واجهات برمجية GraphQL، ربما يتم إدارتها بواسطة طرف ثالث.
حالة الاستخدام 4: لديك بنية تحتية لواجهة برمجية REST موجودة، ولكنك تبحث عن تقييم ما إذا كان GraphQL يمكن أن يعمل لاحتياجاتك.
حالة الاستخدام 5: لديك قاعدة كود كبيرة، ويحدث الانتقال إلى GraphQL في الخلفية، ولكنك تريد استخدام GraphQL الآن دون الانتظار.
حالة الاستخدام 6: لديك خدمات صغيرة متعددة وتستخدم مزيجًا من النهجين. تريد تمكين التواصل السلس بينها.
ما هي ميزات إضافة DeGraphQL؟
توفر إضافة DeGraphQL عددًا من الميزات المفيدة التي تجعل من السهل تكوين وإدارة واجهة برمجية GraphQL الخاصة بك، بما في ذلك:
التحقق من الطلبات: يمكنها التحقق من طلبات GraphQL الواردة للتأكد من أنها تفي بمعايير معينة. يمكن أن يشمل ذلك التحقق من هيكل الاستعلام، وإنفاذ قيود نوع الإدخال، والمزيد. من خلال التحقق من الطلبات، يمكنك التأكد من أن واجهة برمجيتك تتلقى دائمًا طلبات صالحة وجيدة التكوين.
تحليل الاستعلامات: يمكنها أيضًا تحليل استعلامات GraphQL، مما يسمح لك باستخراج معلومات محددة من الاستعلام واستخدامها لإعلام سلوك واجهة برمجيتك. يمكن أن يشمل ذلك أشياء مثل اختيار خدمة الخلفية المناسبة بناءً على البيانات المطلوبة، أو تعديل الاستجابة بناءً على معلمات استعلام معينة.
تحويل الاستجابة: أخيرًا، يمكنها تحويل استجابات GraphQL قبل إعادتها إلى العميل. يمكن أن يكون هذا مفيدًا لأشياء مثل توحيد هياكل البيانات، وإزالة المعلومات الحساسة، أو إضافة بيانات إضافية إلى الاستجابة.
مع هذه القدرة، لا يجعل Apache APISIX من السهل استخدام REST وGraphQL معًا فحسب، بل يمكنك أيضًا تحديد حدود المعدل، وإنفاذ المصادقة والتفويض، وحظر العملاء الذين يحاولون إساءة استخدام واجهة برمجية، وضمان عمل واجهات برمجية بسلاسة أثناء تحديثها بمساعدة الإضافات المدمجة الأخرى.
كيفية استخدام إضافة DeGraphQL (تجربة عملية)
مع وجود معرفة نظرية كافية في الاعتبار، يمكننا الآن الانتقال إلى تجربة عملية لإضافة DeGraphQL. تحتاج DeGraphQL إلى نقطة نهاية GraphQL للاستعلام. كمثال، سنستخدم إحدى واجهات برمجية GraphQL العامة المجانية التي تسترد معلومات عن الدول والقارات واللغات https://countries.trevorblades.com/
.
إذا قمت بالانتقال إلى رابط واجهة برمجية الدول أعلاه، فسيتم فتح ملعب حيث يمكنك كتابة بعض الاستعلامات ضد واجهة برمجية GraphQL على الواجهة.
يمكنك أيضًا بناء واجهة برمجية GraphQL الخاصة بك باستخدام StepZen أو ApollographQL التي توفر استوديوهات GraphQL التي تساعدك في بناء ونشر واجهة برمجية GraphQL الخاصة بك عن طريق دمج واجهات برمجية مسبقة الصنع مثل Accuweather، Airtable، GitHub، Twitter، Trello، والمزيد. على سبيل المثال، يمكنك دمج واجهتي Accuteweather وCountries معًا لجمع معلومات الطقس التي توفرها اسم دولة/مدينة ووضع APISIX في المقدمة لاستعلام الواجهة البرمجية من REST.
الآن مهمتنا هي تحويل تعريف الاستعلام أعلاه إلى استدعاء REST بسيط وإرساله كبيانات JSON. كنتيجة، تعرض بوابة Apache APISIX API نقطة نهاية REST ويجب أن تكون قادرة على توجيه جميع الطلبات إلى واجهة برمجية GraphQL.
على سبيل المثال، جميع طلبات REST إلى مسار URI /country-info
في بوابة API مع استعلام أساسي برمز دولة يجب تحويلها وتمريرها إلى واجهة برمجية GraphQL للدول https://countries.trevorblades.com/graphql
.
مثال على أمر curl يبدو كالتالي:
curl -i http://127.0.0.1:9080/country-info -X POST -d \
'{
"code": "EE"
}'
ويجب أن نحصل على استجابة من الواجهة البرمجية كما يلي:
{
"data": {
"country": {
"code": "EE",
"capital": "Tallinn",
"currency": "EUR",
"languages": [
{
"name": "Estonian"
}
]
}
}
}
في الأقسام التالية، سنتعلم كيفية تحقيق هذا خطوة بخطوة.
لنبدأ بتشغيل Apache APISIX
قبل أن تتمكن من استخدام إضافة degrapghql، ستحتاج إلى تثبيت Apache APISIX. يمكنك اتباع تعليمات التثبيت على موقع Apache APISIX للبدء.
المتطلبات الأساسية
- Docker يستخدم لتثبيت etcd وAPISIX في حاويات.
- curl يستخدم لإرسال طلبات إلى APISIX للتحقق. يمكنك أيضًا استخدام أدوات سهلة مثل Postman للتفاعل مع الواجهة البرمجية.
يمكن تثبيت APISIX بسهولة وبدء تشغيله باستخدام البرنامج النصي التالي:
curl -sL https://run.api7.ai/apisix/quickstart | sh
سيؤدي هذا إلى إنشاء حاويتين Docker – etcd لتخزين التكوين وبوابة APISIX نفسها. بمجرد رؤية رسالة "✔ APISIX is ready!"، يمكننا تكوين خدمة خلفية، إضافة ومسار عبر واجهة برمجية إدارة APISIX التي تعمل كوسيط للطلبات إلى واجهة برمجية GraphQL.
إنشاء خدمة خلفية
بعد ذلك، سنقوم بإنشاء كائن خدمة خلفية لتسجيل واجهة برمجية GraphQL للدول في بوابة API:
curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" -X PUT -d '
{
"name": "GraphQL API upstream",
"desc": "Register Countries GraphQL API as the upstream",
"type": "roundrobin",
"scheme": "https",
"nodes": {
"countries.trevorblades.com": 1
}
}'
إنشاء تكوين إضافة
بعد ذلك، نقوم بإعداد كائن تكوين إضافة جديد. سنستخدم إضافتين للتحويل proxy-rewrite وdegraphql لإعادة كتابة المضيف ومسار الطلب وإجراء استعلام إلى واجهة برمجية GraphQL على التوالي.
curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PUT -d '
{
"plugins":{
"proxy-rewrite":{
"uri":"/graphql",
"host":"countries.trevorblades.com"
},
"degraphql":{
"query":"query Country($code: ID!) {
country(code: $code) {
code
capital
currency
languages {
name
}
}
}",
"variables":[
"code"
]
}
}
}'
في تكوين إضافة DeGraphQL أعلاه، قمنا بتعيين سمتين مثل query
وvariables
. يمكن تعريف متغيرات استعلام GraphQL في جسم طلب POST أو URIs في استدعاء REST.
الاستعلام الذي ننفذه في هذه الحالة يبدو كالتالي ويمكنك استبداله باستعلامك الخاص:
query ($code: ID!) {
country(code: $code) {
code
capital
currency
languages {
name
}
}
}
إنشاء مسار مع إضافة DeGraphQL
تتضمن هذه الخطوة إعداد مسار جديد يستخدم تكوين الإضافة، وتكوين المسار للعمل مع الخدمة الخلفية (عن طريق الإشارة إلى معرفاتها) التي أنشأناها في الخطوات السابقة:
curl -i http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d '
{
"name":"GraphQL API route",
"desc":"Create a new route in APISIX for the Countries GraphQL API",
"uri":"/country-info",
"upstream_id":"1",
"plugin_config_id":1
}'
اختبار تفعيل إضافة DeGraphQL
الآن دعونا نختبر هذا الإعداد الجديد باستخدام أمر curl التالي.
curl -i http://127.0.0.1:9080/country-info -X POST -d \
'{
"code": "EE"
}'
سنحصل على استجابة من APISIX:
{
"data": {
"country": {
"code": "EE",
"capital": "Tallinn",
"currency": "EUR",
"languages": [
{
"name": "Estonian"
}
]
}
}
}
يمكن أيضًا توفير متغير code
كوسائط GET:
curl -i http://127.0.0.1:9080/country-info?code=EE
تحويل الاستجابة
بمساعدة إضافة response-rewrite من Apisix، يمكن تحويل استجابات GraphQL قبل إعادتها إلى العميل. دعونا نستخدم هذه الإضافة لإزالة المفتاح والقيمة currency
من استجابة JSON لإظهار كل شيء آخر فقط. للقيام بذلك، نحتاج إلى إضافة إضافة response-rewrite
إلى تكوين الإضافة الحالي.
curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PATCH -d '
{
"plugins":{
"response-rewrite": {
"filters":[
{
"regex":"(?:\"currency\":\")(.*?)(?:\")",
"scope":"once",
"replace":""
}
],
"vars":[
[
"status",
"==",
200
]
]
}
}
}'
بعد تثبيت هذه الإضافة، يمكنك إجراء طلب إلى /country-info
مرة أخرى ورؤية الاستجابة المحولة:
{
"data": {
"country": {
"code": "EE",
"capital": "Tallinn",
"languages": [
{
"name": "Estonian"
}
]
}
}
}
ملخص
بشكل عام، تعد إضافة DeGraphQL أداة أساسية لأي مطور يقوم ببناء واجهة برمجية GraphQL باستخدام APISIX. تتمتع بميزات قوية وتكوين سهل الاستخدام يجعلها سهلة التكامل مع بوابة API الحالية الخاصة بك، بينما يدعمها لوظائف محددة لـ GraphQL يضمن أن واجهة برمجيتك تكون عالية الأداء وموثوقة وقابلة للتوسع.