مقدمة عن التنسيق بدون خادم باستخدام Workflows

1. مقدمة

c9b0cc839df0bb8f.png

يمكنك استخدام سير العمل لإنشاء مهام سير عمل بدون خادم تربط سلسلة من المهام بدون خادم معًا بالترتيب الذي تحدِّده. يمكنك الجمع بين قوة واجهات برمجة التطبيقات في Google Cloud، والمنتجات بدون خادم، مثل Cloud Functions وCloud Run، والاتصال بواجهات برمجة التطبيقات الخارجية لإنشاء تطبيقات مرنة بدون خوادم.

لا تتطلّب سير العمل أي إدارة للبنية الأساسية، وتتوسّع بسلاسة مع الطلب، بما في ذلك تقليص الوقت إلى الصفر. من خلال نموذج تسعير الدفع لكل استخدام، لن تدفع إلا مقابل مدة التنفيذ.

في هذا الدرس التطبيقي حول الترميز، ستتعلم كيفية ربط خدمات Google Cloud المتعددة وواجهات برمجة تطبيقات HTTP الخارجية بـ Workflows. وبشكل أكثر تحديدًا، سيتم ربط خدمتَين عامتَين من خدمتَي Cloud Functions، وهما خدمة خاصة في Cloud Run وواجهة برمجة تطبيقات HTTP عامة خارجية ضِمن سير العمل.

ما ستتعرَّف عليه

  • أساسيات سير العمل.
  • كيفية ربط دوال السحابة الإلكترونية العامة بمنصة Workflows
  • كيفية ربط خدمات Cloud Run الخاصة بخدمة Workflows
  • كيفية اتصال واجهات برمجة تطبيقات HTTP الخارجية باستخدام Workflows

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب.)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID.

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.

بدء Cloud Shell

مع أنّه يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بالبيئة بضع لحظات فقط. عند الانتهاء، من المفترض أن يظهر لك شيء مثل هذا:

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل على Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ جميع أعمالك في هذا التمرين من خلال متصفح.

3- نظرة عامة على سير العمل

الأساسيات

يتكون سير العمل من سلسلة من الخطوات الموضحة باستخدام بناء الجملة المستند إلى YAML في سير العمل. هذا هو تعريف سير العمل. للحصول على شرح تفصيلي حول بنية YAML لسير العمل، يُرجى الاطّلاع على صفحة مرجع البنية.

عند إنشاء سير عمل، يتم نشره، ما يجعله جاهزًا للتنفيذ. التنفيذ هو عملية تشغيل واحدة للمنطق المضمّن في تعريف سير العمل. جميع عمليات تنفيذ سير العمل مستقلة ويدعم المنتج عددًا كبيرًا من عمليات التنفيذ المتزامنة.

تفعيل الخدمات

في هذا الدرس التطبيقي حول الترميز، ستربط دوال Cloud Functions وخدمات Cloud Run بمنصة Workflows. ستستخدم أيضًا Cloud Build وCloud Storage أثناء إنشاء الخدمات.

تفعيل جميع الخدمات اللازمة:

gcloud services enable \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  workflows.googleapis.com \
  cloudbuild.googleapis.com \
  storage.googleapis.com

في الخطوة التالية، عليك ربط وظيفتَي السحابة الإلكترونية معًا في سير عمل.

4. نشر أول دالة في السحابة الإلكترونية

الدالة الأولى هي منشئ أرقام عشوائية في بايثون.

أنشئ دليلًا وانتقل إليه لرمز الدالة:

mkdir ~/randomgen
cd ~/randomgen

أنشئ ملف main.py في الدليل يتضمّن المحتوى التالي:

import random, json
from flask import jsonify

def randomgen(request):
    randomNum = random.randint(1,100)
    output = {"random":randomNum}
    return jsonify(output)

عندما تتلقّى هذه الدالة طلب HTTP، تنشئ هذه الدالة رقمًا عشوائيًا بين 1 و100 وتُرجع بتنسيق JSON إلى المتصل.

تعتمد الدالة على Flask لمعالجة HTTP، ويجب إضافة ذلك كتبعية. تتم إدارة التبعيات في بايثون باستخدام pip ويتم التعبير عنها في ملف بيانات وصفية باسم requirements.txt.

أنشئ ملف requirements.txt في الدليل نفسه ويتضمّن المحتوى التالي:

flask>=1.0.2

انشر الدالة باستخدام مشغّل HTTP مع السماح بطلبات لم تتم مصادقتها باستخدام هذا الأمر:

gcloud functions deploy randomgen \
    --runtime python37 \
    --trigger-http \
    --allow-unauthenticated

بعد نشر الدالة، يمكنك الاطّلاع على عنوان URL الخاص بالدالة ضمن السمة httpsTrigger.url، وهو معروض في وحدة التحكّم أو معروضًا مع الأمر gcloud functions describe.

يمكنك أيضًا الانتقال إلى عنوان URL للدالة باستخدام الأمر curl التالي:

curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')

الدالة جاهزة لسير العمل.

5- نشر وظيفة السحابة الإلكترونية الثانية

الدالة الثانية هي المضاعف. تضرب المدخلات المستلمة في 2.

أنشئ دليلًا وانتقل إليه لرمز الدالة:

mkdir ~/multiply
cd ~/multiply

أنشئ ملف main.py في الدليل يتضمّن المحتوى التالي:

import random, json
from flask import jsonify

def multiply(request):
    request_json = request.get_json()
    output = {"multiplied":2*request_json['input']}
    return jsonify(output)

وعند تلقّي طلب HTTP، تستخرج هذه الدالة input من نص JSON، وتضربه في 2 وتعرضه بتنسيق JSON مرة أخرى إلى المتصل.

أنشئ ملف requirements.txt نفسه في الدليل نفسه ويتضمّن المحتوى التالي:

flask>=1.0.2

انشر الدالة باستخدام مشغّل HTTP مع السماح بطلبات لم تتم مصادقتها باستخدام هذا الأمر:

gcloud functions deploy multiply \
    --runtime python37 \
    --trigger-http \
    --allow-unauthenticated

بعد نشر الدالة، يمكنك أيضًا الانتقال إلى عنوان URL الخاص بالدالة باستخدام الأمر curl التالي:

curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \
-X POST \
-H "content-type: application/json" \
-d '{"input": 5}'

الدالة جاهزة لسير العمل.

6- الربط بوظيفتَي السحابة الإلكترونية

في سير العمل الأول، قم بربط الدالتين معًا.

أنشئ ملف workflow.yaml يتضمّن المحتوى التالي.

- randomgenFunction:
    call: http.get
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/randomgen
    result: randomgenResult
- multiplyFunction:
    call: http.post
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/multiply
        body:
            input: ${randomgenResult.body.random}
    result: multiplyResult
- returnResult:
    return: ${multiplyResult}

في سير العمل هذا، تحصل على رقم عشوائي من الدالة الأولى وتمرره إلى الدالة الثانية. والناتج هو العدد العشوائي الضرب.

نشر سير العمل الأول:

gcloud workflows deploy workflow --source=workflow.yaml

تنفيذ سير العمل الأول:

gcloud workflows execute workflow

بعد تنفيذ سير العمل، يمكنك الاطّلاع على النتيجة من خلال إدخال رقم تعريف التنفيذ الذي تم تقديمه في الخطوة السابقة:

gcloud workflows executions describe <your-execution-id> --workflow workflow

ستتضمّن النتائج result وstate:

result: '{"body":{"multiplied":108},"code":200 ... } 

...
state: SUCCEEDED

7. ربط واجهة برمجة تطبيقات HTTP خارجية

بعد ذلك، عليك ربط math.js كخدمة خارجية في سير العمل.

في math.js، يمكنك تقييم التعبيرات الحسابية مثل هذا:

curl https://api.mathjs.org/v4/?'expr=log(56)'

وفي هذه المرة، سيتم استخدام Cloud Console لتعديل سير العمل. البحث عن "Workflows" في Google Cloud Console:

7608a7991b33bbb0.png

ابحث عن سير العمل وانقر على علامة التبويب Definition:

f3c8c4d3ffa49b1b.png

تعديل تعريف سير العمل وتضمين طلب إلى math.js

- randomgenFunction:
    call: http.get
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/randomgen
    result: randomgenResult
- multiplyFunction:
    call: http.post
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/multiply
        body:
            input: ${randomgenResult.body.random}
    result: multiplyResult
- logFunction:
    call: http.get
    args:
        url: https://api.mathjs.org/v4/
        query:
            expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"}
    result: logResult
- returnResult:
    return: ${logResult}

يُرسل سير العمل الآن ناتج دالة الضرب في استدعاء دالة السجلّ في math.js.

سترشدك واجهة المستخدم لتعديل سير العمل ونشره. بعد نشر التطبيق، انقر على Execute لتنفيذ سير العمل. ستظهر تفاصيل عملية التنفيذ:

b40c76ee43a1ce65.png

لاحظ رمز الحالة 200 وbody مع ناتج دالة السجل.

رائع جدًا لقد دمجت خدمة خارجية في سير العمل لدينا.

8. نشر خدمة Cloud Run

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

تعرض خدمة تشغيل السحابة الإلكترونية math.floor للرقم الذي تم تمريره.

أنشئ دليلاً لرمز الخدمة وانتقِل إليه:

mkdir ~/floor
cd ~/floor

أنشئ ملف app.py في الدليل يتضمّن المحتوى التالي:

import json
import logging
import os
import math

from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['POST'])
def handle_post():
    content = json.loads(request.data)
    input = float(content['input'])
    return f"{math.floor(input)}", 200

if __name__ != '__main__':
    # Redirect Flask logs to Gunicorn logs
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers = gunicorn_logger.handlers
    app.logger.setLevel(gunicorn_logger.level)
    app.logger.info('Service started...')
else:
    app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

ينشر Cloud Run حاويات، لذا تحتاج إلى Dockerfile ويجب ربط الحاوية بمتغيّر بيئة 0.0.0.0 وPORT، وبالتالي يكون الرمز أعلاه.

عندما تتلقّى هذه الدالة طلب HTTP، تستخرج هذه الدالة input من نص JSON، وتستدعي Mat.floor وترجع النتيجة إلى المتصل.

في الدليل نفسه، أنشئ Dockerfile التالي:

# Use an official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.7-slim

# Install production dependencies.
RUN pip install Flask gunicorn

# Copy local code to the container image.
WORKDIR /app
COPY . .

# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app

إنشاء الحاوية:

export SERVICE_NAME=floor
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

وبعد إنشاء الحاوية، يمكنك نشره على Cloud Run. لاحِظ علامة no-allow-unauthenticated. يضمن ذلك أن الخدمة لا تقبل سوى المكالمات التي تمت مصادقتها:

gcloud run deploy ${SERVICE_NAME} \
  --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
  --platform managed \
  --no-allow-unauthenticated

بعد نشر الخدمة، تصبح جاهزة لسير العمل.

9. ربط خدمة Cloud Run

قبل أن تتمكن من تهيئة سير العمل لاستدعاء خدمة Cloud Run الخاصة، يجب إنشاء حساب خدمة لكي تستخدمه خدمة Workflows:

export SERVICE_ACCOUNT=workflows-sa
gcloud iam service-accounts create ${SERVICE_ACCOUNT}

امنح الدور "run.invoker" لحساب الخدمة. سيتيح ذلك لحساب الخدمة الاتصال بخدمات Cloud Run التي تمت مصادقتها:

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role "roles/run.invoker"

تعديل تعريف سير العمل في workflow.yaml لتضمين خدمة Cloud Run لاحظ كيف يتم تضمين الحقل auth أيضًا للتأكد من تمرير سير العمل في الرمز المميز للمصادقة في عمليات الاستدعاء إلى خدمة تشغيل السحابة الإلكترونية:

- randomgenFunction:
    call: http.get
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/randomgen
    result: randomgenResult
- multiplyFunction:
    call: http.post
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/multiply
        body:
            input: ${randomgenResult.body.random}
    result: multiplyResult
- logFunction:
    call: http.get
    args:
        url: https://api.mathjs.org/v4/
        query:
            expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"}
    result: logResult
- floorFunction:
    call: http.post
    args:
        url: https://floor-<random-hash>.run.app
        auth:
            type: OIDC
        body:
            input: ${logResult.body}
    result: floorResult
- returnResult:
    return: ${floorResult}

تعديل سير العمل مرور هذه الوقت في حساب الخدمة:

gcloud workflows deploy workflow \
    --source=workflow.yaml \
    --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

تنفيذ سير العمل:

gcloud workflows execute workflow

ويمكنك خلال بضع ثوانٍ إلقاء نظرة على عملية تنفيذ سير العمل لمعرفة النتيجة:

gcloud workflows executions describe <your-execution-id> --workflow workflow

وسيتضمّن الناتج عددًا صحيحًا result وstate:

result: '{"body":"5","code":200 ... } 

...
state: SUCCEEDED

10. تهانينا

تهانينا على إكمال الدرس التطبيقي حول الترميز.

النقاط التي تناولناها

  • أساسيات سير العمل.
  • كيفية ربط دوال السحابة الإلكترونية العامة بمنصة Workflows
  • كيفية ربط خدمات Cloud Run الخاصة بخدمة Workflows
  • كيفية اتصال واجهات برمجة تطبيقات HTTP الخارجية باستخدام Workflows