كيفية دمج API Gateway و Consul؟

Fei Han

February 25, 2022

Ecosystem

معلومات أساسية

Consul هو حل لشبكة الخدمات. أحد مكوناته الأساسية، Consul KV، هو قاعدة بيانات موزعة لتخزين القيم المفتاحية، والغرض الرئيسي منها هو تخزين معلمات التكوين والبيانات الوصفية، بينما تسمح أيضًا للمستخدمين بتخزين الكائنات المفهرسة.

في نموذج بنية الخدمات الصغيرة، عندما تتغير الخدمات العلوية بسبب التوسع في السعة، أو فشل الأجهزة، إلخ، فإن الطريقة التي يتم بها الحفاظ على معلومات الخدمات العلوية عن طريق كتابة التكوين يدويًا يمكن أن تؤدي إلى زيادة كبيرة في تكاليف الصيانة. استجابةً لذلك، يوفر Apache APISIX سجل اكتشاف الخدمات للحصول بشكل ديناميكي على أحدث معلومات مثيلات الخدمة لتقليل تكاليف الصيانة للمستخدمين.

حاليًا، يدعم Apache APISIX سجل اكتشاف الخدمات القائم على Consul KV مع وحدة consul_kv التي تم تقديمها من قبل المجتمع.

كيفية عملها

يستفيد Apache APISIX من وحدة consul_kv الخاصة بقدرة تخزين القيم المفتاحية الموزعة في Consul KV لفصل مقدم الخدمة ومستهلكها وتنفيذ الوظيفتين الأساسيتين لسجل اكتشاف الخدمات.

  1. تسجيل الخدمة: يقوم مقدمو الخدمات بتسجيل خدماتهم في السجل.
  2. اكتشاف الخدمة: يجد مستهلكو الخدمات معلومات التوجيه لمقدمي الخدمات من خلال السجل.

بناءً على هذا الأساس، سيكون Apache APISIX أكثر مرونة وقدرة على التكيف مع بنى الخدمات الصغيرة الحالية لتلبية احتياجات المستخدمين بشكل أفضل.

هندسة Consul

كيفية تمكين Consul في Apache APISIX

تم بناء بيئات الاختبار في هذه المقالة في Docker باستخدام docker-compose.

  1. تنزيل Apache APISIX.

    # سحب مستودع Git الخاص بـ apisix-docker
    git clone https://github.com/apache/apisix-docker.git
    
  2. إنشاء مجلد Consul وملفات التكوين.

    # إنشاء مجلد Consul
    mkdir -p ~/docker-things/consul/ && cd $_
    # إنشاء ملفات التكوين
    touch docker-compose.yml server1.json
    
  3. تحرير ملف 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
    
  4. تحرير ملف server1.json.

    {
    node_name: consul-server1,
    server: true,
    addresses: {
    http: 0.0.0.0
    }
    }
    
  5. إضافة معلومات التكوين المتعلقة بـ Consul إلى ملف تكوين Apache APISIX apisix_conf/config.yaml.

    # config.yml
    # ...تكوينات أخرى
    discovery:
    consul_kv:
    servers:
      - http://consul-server1:8500
    prefix: upstreams
    
  6. بدء Apache APISIX وConsul.

    # الانتقال إلى المجلد example، consul، بدء APISIX وConsul
    docker-compose up -d
    
  7. تسجيل خدمة الاختبار في 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
    
  8. تأكيد عناوين 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
    
  9. تقديم طلب إلى واجهة برمجة تطبيقات 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": }.

  10. التحقق مما إذا كانت خدمة الاختبار قد تم تسجيلها بنجاح.

    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، أو عبر قائمة البريد للتواصل.

Tags: