كيفية دمج API Gateway و Consul؟
Fei Han
February 25, 2022
معلومات أساسية
Consul هو حل لشبكة الخدمات. أحد مكوناته الأساسية، Consul KV، هو قاعدة بيانات موزعة لتخزين القيم المفتاحية، والغرض الرئيسي منها هو تخزين معلمات التكوين والبيانات الوصفية، بينما تسمح أيضًا للمستخدمين بتخزين الكائنات المفهرسة.
في نموذج بنية الخدمات الصغيرة، عندما تتغير الخدمات العلوية بسبب التوسع في السعة، أو فشل الأجهزة، إلخ، فإن الطريقة التي يتم بها الحفاظ على معلومات الخدمات العلوية عن طريق كتابة التكوين يدويًا يمكن أن تؤدي إلى زيادة كبيرة في تكاليف الصيانة. استجابةً لذلك، يوفر Apache APISIX سجل اكتشاف الخدمات للحصول بشكل ديناميكي على أحدث معلومات مثيلات الخدمة لتقليل تكاليف الصيانة للمستخدمين.
حاليًا، يدعم Apache APISIX سجل اكتشاف الخدمات القائم على Consul KV مع وحدة consul_kv
التي تم تقديمها من قبل المجتمع.
كيفية عملها
يستفيد Apache APISIX من وحدة consul_kv
الخاصة بقدرة تخزين القيم المفتاحية الموزعة في Consul KV لفصل مقدم الخدمة ومستهلكها وتنفيذ الوظيفتين الأساسيتين لسجل اكتشاف الخدمات.
- تسجيل الخدمة: يقوم مقدمو الخدمات بتسجيل خدماتهم في السجل.
- اكتشاف الخدمة: يجد مستهلكو الخدمات معلومات التوجيه لمقدمي الخدمات من خلال السجل.
بناءً على هذا الأساس، سيكون Apache APISIX أكثر مرونة وقدرة على التكيف مع بنى الخدمات الصغيرة الحالية لتلبية احتياجات المستخدمين بشكل أفضل.
كيفية تمكين Consul في Apache APISIX
تم بناء بيئات الاختبار في هذه المقالة في Docker باستخدام docker-compose.
-
تنزيل Apache APISIX.
# سحب مستودع Git الخاص بـ apisix-docker git clone https://github.com/apache/apisix-docker.git
-
إنشاء مجلد Consul وملفات التكوين.
# إنشاء مجلد Consul mkdir -p ~/docker-things/consul/ && cd $_ # إنشاء ملفات التكوين touch docker-compose.yml server1.json
-
تحرير ملف
docker-compose.yml
.version: '3.8' services: consul-server1: image: consul:1.9.3 container_name: consul-server1 restart: always volumes: - ./server1.json:/consul/config/server1.json:ro networks: - apisix ports: - '8500:8500' command: 'agent -bootstrap-expect=1' networks: apisix: external: true name: example_apisix
-
تحرير ملف
server1.json
.{ node_name: consul-server1, server: true, addresses: { http: 0.0.0.0 } }
-
إضافة معلومات التكوين المتعلقة بـ Consul إلى ملف تكوين Apache APISIX
apisix_conf/config.yaml
.# config.yml # ...تكوينات أخرى discovery: consul_kv: servers: - http://consul-server1:8500 prefix: upstreams
-
بدء Apache APISIX وConsul.
# الانتقال إلى المجلد example، consul، بدء APISIX وConsul docker-compose up -d
-
تسجيل خدمة الاختبار في Consul. يحتوي المثال على خدمتين ويب يمكن استخدامهما مباشرة للاختبار.
# التحقق من ملف docker-compose.yml الخاص بالمثال # يمكنك رؤية خدمتي ويب $ cat docker-compose.yml | grep web # المخرجات web1: - ./upstream/web1.conf:/etc/nginx/nginx.conf web2: - ./upstream/web2.conf:/etc/nginx/nginx.conf
-
تأكيد عناوين IP لخدمات الويب هذه.
$ sudo docker inspect -f='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(sudo docker ps -aq) | grep web # المخرجات /example-web1-1 - 172.26.0.7 /example-web2-1 - 172.26.0.2
-
تقديم طلب إلى واجهة برمجة تطبيقات HTTP الخاصة بـ Consul في الطرفية لتسجيل خدمة الاختبار.
# التسجيل مع عنوان IP المقابل curl \ -X PUT \ -d ' {weight: 1, max_fails: 2, fail_timeout: 1}' \ http://127.0.0.1:8500/v1/kv/upstreams/webpages/172.26.0.7:80 curl \ -X PUT \ -d ' {weight: 1, max_fails: 2, fail_timeout: 1}' \ http://127.0.0.1:8500/v1/kv/upstreams/webpages/172.26.0.2:80
المسار بعد
/v1/kv/
يتبع التنسيق{Prefix}/{Service Name}/{IP}:{Port}
.{Prefix}
هو البادئة المكتوبة عند تكوين Consul في APISIX، بينما{Service Name}
و{IP}:{Port}
يجب تحديدها من قبل المستخدم وفقًا لخدمة المصدر.تنسيق البيانات هو
{"weight": , "max_fails": , "fail_timeout": }
. -
التحقق مما إذا كانت خدمة الاختبار قد تم تسجيلها بنجاح.
curl http://127.0.0.1:8500/v1/kv/upstreams/webpages?keys
الرسالة التالية تشير إلى نجاح التسجيل.
[upstreams/webpages/172.26.0.2:80,upstreams/webpages/172.26.0.7:80]%
إنشاء مسار وتمكين Consul
إضافة Consul إلى المسار باستخدام واجهة برمجة التطبيقات الإدارية التي يوفرها Apache APISIX.
يجب تحديد X-API-KEY
و upstream.service_name
قبل إضافتها.
X-API-KEY
: رمز الوصول لواجهة برمجة التطبيقات الإدارية، في هذا المثال نستخدم القيمة الافتراضيةedd1c9f034335f136f87ad84b625c8f1
.upstream.service_name
: اسم خدمة المصدر، الذي يحدد الخدمة في السجل التي سيتم ربطها بمسار، يجب تعيينها إلى الرابط المستخدم لتسجيل خدمة الاختبار عند استخدام Consul، ويجب إزالة الجزء{IP}:{Port}
في النهاية. يمكننا أيضًا استخدام واجهة برمجة التطبيقات Memory Dump التي يوفرها Apache APISIX للحصول على رابط الخدمة والتأكد من اكتشاف خدمة المصدر بشكل صحيح.
$ curl http://127.0.0.1:9092/v1/discovery/consul_kv/dump | jq
# المخرجات
{
"services": {
# هذا المفتاح هو الرابط المطلوب
"http://consul-server1:8500/v1/kv/upstreams/webpages/": [
{
"port": 80,
"host": "172.26.0.7",
"weight": 1
},
{
"port": 80,
"host": "172.26.0.2",
"weight": 1
}
]
},
"config": {
# ...تكوينات
}
}
إضافة مسار
هنا يتم توجيه الطلب مع الرابط /consul/*
إلى http://consul-server1:8500/v1/kv/upstreams/webpages/
. أيضًا، يجب تعيين discovery_type
إلى consul_kv
لبدء الوحدة المقابلة.
curl http://127.0.0.1:9080/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X POST -d '
{
"uri": "/consul/*",
"upstream": {
"service_name": "http://consul-server1:8500/v1/kv/upstreams/webpages/",
"type": "roundrobin",
"discovery_type": "consul_kv"
}
}'
اختبار والتحقق من النتيجة
تظهر نتائج الطلب أن المسار الجديد في Apache APISIX قد تمكن من العثور على عنوان الخدمة الصحيح من خلال Consul وطلبها إلى كلا العقدتين بناءً على سياسة موازنة الحمل.
# الطلب الأول
curl -s http://127.0.0.1:9080/consul/
# المخرجات
hello web1%
# الطلب الثاني
curl -s http://127.0.0.1:9080/consul/
# المخرجات
hello web2%
# ملاحظة: من الممكن أيضًا أن يعود كلا الطلبين بنفس النتيجة مثل web1 أو web2.
# هذا ناتج عن طبيعة موازنة الحمل ويمكنك محاولة تقديم المزيد من الطلبات.
ملخص
النصف الأول من هذه المقالة يصف كيفية عمل Apache APISIX مع Consul لتنفيذ سجل اكتشاف الخدمات القائم على Consul KV لحل مشكلة إدارة وصيانة معلومات الخدمات. النصف الثاني من المقالة يركز على كيفية استخدام Apache APISIX في Docker مع Consul. بالطبع، التطبيق في السيناريو الفعلي يحتاج إلى تحليل وفقًا لسيناريو الأعمال وبنية النظام الحالية.
يمكن العثور على المزيد من التعليمات حول استخدام سجل Consul في Apache APISIX في الوثائق الرسمية.
يعمل Apache APISIX حاليًا أيضًا على إضافة المزيد من الإضافات لدعم تكامل خدمات إضافية، لذا إذا كنت مهتمًا، فلا تتردد في بدء مناقشة في GitHub Discussion، أو عبر قائمة البريد للتواصل.