توسيع نطاق دعم خدمات App Engine المجمّعة: الجزء 1 (الوحدة 17)

1. نظرة عامة

تهدف سلسلة الدروس التطبيقية حول الترميز بدون خادم (البرامج التعليمية العملية) والفيديوهات ذات الصلة إلى مساعدة مطوّري Google Cloud الذين لا يستخدمون خوادم على تحديث تطبيقاتهم من خلال إرشادهم خلال عملية واحدة أو أكثر من عمليات نقل البيانات، بعيدًا عن الخدمات القديمة في المقام الأول. يؤدي ذلك إلى تسهيل حمل التطبيقات وتوفير المزيد من الخيارات والمرونة، ما يتيح لك الدمج مع مجموعة أكبر من منتجات Cloud والوصول إليها والترقية بسهولة إلى الإصدارات الأحدث باللغات. مع تركيزنا في البداية على مستخدمي Cloud الأوائل، لا سيما مطوّري App Engine (البيئة العادية)، فإنّ هذه السلسلة واسعة بما يكفي لتشمل أنظمة أساسية أخرى بدون خادم، مثل Cloud Functions وCloud Run أو أي منصة أخرى إن وُجدت.

في السابق، كان على المطوّرين نقل البيانات من "الخدمات المجمّعة" القديمة في App Engine. مثل Datastore وMemcache قبل أن تتمكن من ترقية إصدارات اللغات، وهما محاولتان متشابهتان محتملتان. ومن خلال إتاحة العديد من الخدمات المُجمّعة للمفاتيح في خدمة App Engine من الجيل الثاني، يمكن للمطوّرين الآن نقل تطبيقاتهم إلى أحدث بيئات تشغيل مع الاستمرار في استخدام (معظم) الخدمات المجمّعة. يرشدك هذا الدرس التطبيقي إلى خطوات ترقية نموذج تطبيق من Python 2 إلى 3 مع الحفاظ على استخدام خدمة Datastore المجمّعة (عبر مكتبة App Engine NDB). لا يتطلب استخدام معظم الخدمات المجمّعة سوى إجراء تحديث بسيط للرمز كما سيتم تناوله في هذا البرنامج التعليمي، لكن هناك خدمات أخرى تتطلب تغييرات أكثر شمولاً. وسوف نتناولها في "الجزء 2"، وحدة متابعة ودرس تطبيقي حول الترميز.

ستتعرَّف على كيفية إجراء ما يلي:

  • نموذج المنفذ لتطبيق App Engine من Python 2 إلى 3
  • تحديث إعدادات التطبيق لتضمين حزمة تطوير البرامج (SDK) لـ App Engine
  • إضافة رمز حزمة SDK إلى التطبيق الذي يتوافق مع الخدمات المجمّعة في بيئات تشغيل الجيل الثاني مثل Python 3

المتطلبات

استطلاع

كيف ستستخدم هذا البرنامج التعليمي؟

القراءة فقط اقرأها وأكمِل التمارين

كيف تقيّم تجربتك مع Python؟

حديث متوسط بارع

ما هو تقييمك لتجربتك في استخدام خدمات Google Cloud؟

حديث متوسط بارع

2. الخلفية

خدمة App Engine الأصلية تم إطلاقها في عام 2008 وتضم مجموعة من واجهات برمجة التطبيقات القديمة (المعروفة الآن باسم الخدمات المجمّعة) لكي يتمكّن المطوّرون من إنشاء التطبيقات ونشرها على مستوى العالم بسهولة. وتشمل هذه الخدمات مخزن البيانات وMemcache وقائمة انتظار المهام. على الرغم من سهولة نقل التطبيقات، شعر المستخدمون بالقلق بشأن قابلية نقل تطبيقاتهم باستخدام واجهات برمجة تطبيقات خاصة تربطهم بـ App Engine وأرادوا زيادة إمكانية نقل تطبيقاتهم. هذا فضلاً عن حقيقة أنّ العديد من هذه الخدمات المجمّعة التي تحوّلت إلى منتجات Cloud مستقلة تابعة لها، ما دفع فريق App Engine إلى إطلاق منصة من الجيل التالي في عام 2018 بدونها.

تحدّث الآن مع مطوري Python 2 المتحمسين للترقية إلى Python 3. كان هناك حاجة إلى تطبيق 2.x الذي يستخدم الخدمات المجمّعة للابتعاد عن هذه الخدمات قبل أن يتم نقل تطبيقاتها إلى الإصدار 3.x، وهو ما يمثل عمليتَي نقل إجباريتَين متتاليتَين، وربما تحدّيًا كبيرًا أيضًا. للمساعدة في عملية الانتقال هذه، قدَّم فريق App Engine في خريف 2021 "ثقبًا دودًا". إلى الماضي، ما يسمح للتطبيقات التي تعمل في بيئات تشغيل من الجيل التالي بالوصول إلى العديد من تلك الخدمات المجمّعة. على الرغم من أنّ هذا الإصدار لا يشتمل على جميع الخدمات المتاحة في بيئات التشغيل الأصلية، تتوفّر جهات فاعلة رئيسية، مثل "مخزن البيانات" و"قائمة انتظار المهام" وMemcache.

يشرح هذا الدرس التطبيقي حول الترميز التغييرات اللازمة لترقية تطبيقك إلى Python 3 مع الحفاظ على استخدام الخدمات المجمّعة. والهدف من ذلك هو تشغيل تطبيقاتك على أحدث بيئات تشغيل، ما يسمح لك بعد ذلك بنقل البيانات من الخدمات المجمّعة إلى الخدمات المكافئة والمستقلة في السحابة الإلكترونية أو الخدمات البديلة التابعة لجهات خارجية حسب المخططات الزمنية الخاصة بك، بدلاً من جعلها أداة لحظر الترقية إلى إصدار 3.x. على الرغم من أنّ التبديل من الخدمات المجمّعة ليس مطلوبًا بعد الآن، يمنحك ذلك المزيد من قابلية النقل والمرونة في ما يتعلق بمكان استضافة التطبيقات، بما في ذلك الانتقال إلى المنصات التي قد تخدم أعباء العمل بشكل أفضل، أو ببساطة استخدام App Engine أثناء الترقية إلى إصدار لغة أكثر حداثة كما هو موضّح للتو.

الوحدة 1 - نموذج تطبيق Python 2 يستخدم خدمة تخزين البيانات المجمّعة عبر App Engine NDB. سبق أن نقل التطبيق أطر العمل من webapp2 إلى Flask، وتم إكماله في الدرس التطبيقي حول الترميز الخاص بالوحدة 1، ولكن مع الإبقاء على استخدام "مخزن البيانات" بدون تغيير.

يتضمن هذا الدليل التوجيهي الخطوات التالية:

  1. الإعداد/التمهيد
  2. تعديل الإعدادات
  3. تعديل رمز التطبيق

3- الإعداد/التمهيد

يوضّح هذا القسم كيفية تنفيذ ما يلي:

  1. إعداد مشروعك على Google Cloud
  2. الحصول على نموذج تطبيق أساسي
  3. (إعادة) نشر التطبيق الأساسي والتحقّق من صحته

تضمن هذه الخطوات بدء العمل بالتعليمة البرمجية.

1. إعداد المشروع

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

2. الحصول على نموذج تطبيق أساسي

أحد المتطلّبات الأساسية لهذا الدرس التطبيقي حول الترميز هو أن يكون لديك تطبيق App Engine صالح للوحدة 1: عليك إكمال الدرس التطبيقي حول الترميز للوحدة 1 (يُنصح به) أو نسخ تطبيق الوحدة 1 من المستودع. سواء كنت تستخدم رمزك أو رمزنا، فإن رمز الوحدة 1 هو المكان الذي سوف "تبدأ" فيه. يرشدك الدرس التطبيقي هذا حول الترميز خلال كل خطوة، وينتهي بتعليمة برمجية تشبه ما هو موجود في مجلد Repo للوحدة 7 "FINISH".

بغض النظر عن تطبيق الوحدة 1 الذي تستخدمه، يجب أن يبدو المجلد كما يلي، على الأرجح مع مجلد lib أيضًا:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

3- (إعادة نشر التطبيق الأساسي)

نفِّذ الخطوات التالية من أجل (إعادة) نشر تطبيق الوحدة 1:

  1. احذف مجلد "lib" في حال توفّره وشغِّل: pip install -t lib -r requirements.txt لإعادة تعبئة "lib". قد تحتاج إلى استخدام الأمر pip2 بدلاً من ذلك في حال تثبيت Python 2 وPython 3.
  2. تأكد من تثبيت أداة سطر الأوامر gcloud وإعدادها ومراجعة استخدامها.
  3. عليك ضبط مشروعك على Google Cloud في حقل gcloud config set project PROJECT_ID إذا كنت لا تريد إدخال PROJECT_ID مع كل أمر gcloud يتم إصداره.
  4. نشر نموذج التطبيق باستخدام "gcloud app deploy"
  5. التأكُّد من تشغيل تطبيق الوحدة 1 على النحو المتوقع بدون مشكلة في عرض آخر الزيارات (الموضّحة أدناه)

a7a9d2b80d706a2b.png

4. تعديل الإعدادات

بعد تنفيذ هذه الخطوات بنجاح والتأكّد من عمل تطبيق الويب، ستكون جاهزًا لنقل هذا التطبيق إلى Python 3، بدءًا من config.

إضافة حزمة SDK إلى ملفrequirements.txt

يقلل وقت تشغيل Python 3 من App Engine بشكل كبير من النفقات العامة لاستخدام مكتبات الجهات الخارجية. كل ما يلزم هو إدراجها في requirements.txt. لاستخدام الخدمات المجمّعة في Python 3، أضِف حزمة App Engine SDK (appengine-python-standard) إليها. تنضم حزمة SDK إلى Flask من الوحدة 1:

flask
appengine-python-standard

تحديث app.yaml

اتّبِع الخطوات أدناه لتطبيق تغييرات الإعدادات على ملف app.yaml:

  1. استبدال التوجيه runtime بإصدار Python 3 المتوافق على سبيل المثال، حدد python310 للغة Python 3.10.
  2. احذف التوجيهَين threadsafe وapi_version لأنّهما لم يتم استخدامهما في Python 3.
  3. احذف القسم handlers بالكامل لأنّ هذا التطبيق لا يحتوي إلا على معالِجات النصوص البرمجية. إذا كان تطبيقك يحتوي على معالِجات ملفات ثابتة، اتركها كما هي في handlers.
  4. لا يتوافق وقت تشغيل Python 3 مع مكتبات الجهات الخارجية المضمَّنة كما هو الحال في بيئة تشغيل Python 2. إذا كان تطبيقك يحتوي على قسم libraries في app.yaml، احذف القسم بأكمله. (يجب إدراج الحِزم المطلوبة في requirements.txt فقط، مثل المكتبات غير المضمّنة). لا يحتوي نموذج التطبيق على قسم libraries، لذا انتقِل إلى الخطوة التالية.
  5. يمكنك إنشاء توجيه app_engine_apis تم ضبطه على true لاستخدامه، وهذا يتوافق مع إضافة حزمة حزمة تطوير البرامج (SDK) لـ App Engine إلى requirements.txt أعلاه.

ملخّص التغييرات المطلوبة التي يجب إجراؤها على "app.yaml":

قبل:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

بعد:

runtime: python310
app_engine_apis: true

ملفات الإعداد الأخرى

لن تحتاج إلى حذف جميع الحِزم التابعة لجهات خارجية، لأنّها غير مدرَجة في requirements.txt إلا إذا كان لديك عنصر خاص في appengine_config.py. وبالمثل، نظرًا لأن جميع المكتبات التابعة لجهات خارجية يتم تثبيتها تلقائيًا أثناء عملية التصميم، ما مِن حاجة إلى نسخها أو إنشاء مورّد لها، ما يعني أنّه لن تعود هناك حاجة إلى الأمر pip install أو مجلد lib، لذا يمكنك حذف هذه المكتبات. التلخيص:

  • حذف ملف appengine_config.py
  • حذف مجلد واحد (lib)

وبهذا نكون قد انتهينا من جميع تغييرات الضبط اللازمة.

5- تعديل رمز التطبيق

يتطلب الوصول إلى معظم الخدمات المجمّعة المتاحة في بيئة وقت تشغيل Python 3 رمزًا قصيرًا يتضمّن كائن تطبيق واجهة بوابة خادم الويب (WSGI) في main.py. دالة برنامج التضمين هي google.appengine.api.wrap_wsgi_app()، ويمكنك استخدامها عن طريق استيرادها وإحاطة كائن WSGI بها. أدخِل التغييرات أدناه لعرض التحديث المطلوب لتطبيق Flask في main.py:

قبل:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

app = Flask(__name__)

بعد:

from flask import Flask, render_template, request
from google.appengine.api import wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)

يمكنك الاطّلاع على المستندات الخاصة بأمثلة حول التفاف WSGI لأُطر عمل Python الأخرى.

على الرغم من أنّ هذا المثال يتيح لتطبيقك إمكانية الوصول إلى معظم الخدمات المجمّعة في Python 3، تتطلب خدمات أخرى، مثل Blobstore وMail، رمزًا إضافيًا. وسنتناول هذه العينات في وحدة نقل أخرى.

وبهذا، نختتم جميع التغييرات اللازمة لإضافة استخدام خدمات App Engine المجمّعة إلى نموذج تطبيق الوحدة 1. هذا التطبيق متوافق بالفعل مع بايثون 2 و3، لذا لا توجد تغييرات إضافية لنقله إلى بايثون 3 غير ما قمت به بالفعل في التهيئة. الخطوة الأخيرة: نشر هذا التطبيق المعدَّل في الجيل التالي من بيئة تشغيل App Engine Python 3 والتأكّد من نجاح التحديثات.

6- الملخّص/تنظيف البيانات

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

نشر التطبيق والتحقق منه

انشر تطبيق Python 3 باستخدام gcloud app deploy، وتأكَّد من أنّ التطبيق يعمل على النحو المطلوب في Python 2. لا يتغير أي من الوظائف، لذا يجب أن يكون الناتج مطابقًا لتطبيق الوحدة 1:

a7a9d2b80d706a2b.png

الملاحظات النهائية

تهانينا على اتخاذك الخطوة الأولى لنقل تطبيقات Python 2 App Engine إلى Python 3 مع الاحتفاظ باستخدامها للخدمات المجمّعة في الوقت الحالي.

تَنظيم

بنود عامة

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

للإفصاح الكامل عن المعلومات، يتحمّل النشر على منصة حوسبة بدون خادم في Google Cloud مثل App Engine تكاليف بسيطة لإنشاء المحتوى وتخزينه. تمتلك خدمة Cloud Build حصتها المجانية الخاصة، كما هي الحال في Cloud Storage. يستهلك تخزين تلك الصورة بعضًا من هذه الحصة. ومع ذلك، قد تكون مقيمًا في منطقة لا يتوفر بها هذا المستوى المجاني، لذا عليك الانتباه إلى استخدام مساحة التخزين لتقليل التكاليف المحتملة. "مجلدات" محددة في Cloud Storage التي يجب عليك مراجعتها ما يلي:

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • تعتمد روابط مساحة التخزين أعلاه على PROJECT_ID و *LOC*، على سبيل المثال "us". إذا كان التطبيق مستضافًا في الولايات المتحدة الأمريكية

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

خصوصيّة هذا الدرس التطبيقي حول الترميز

الخدمات المدرَجة أدناه هي خدمات فريدة لهذا الدرس التطبيقي حول الترميز. ارجع إلى وثائق كل منتج لمزيد من المعلومات:

الخطوات التالية

هناك عدة اتجاهات للانطلاق من هنا:

  1. تحديث الرمز باستخدام خدمات مضمّنة تتطلب المزيد من التغييرات في الرموز
  2. نقل البيانات من الخدمات المجمّعة إلى منتجات Cloud المستقلة
  3. نقل البيانات من App Engine إلى نظام أساسي آخر بدون خادم على السحابة الإلكترونية

يتطلب الوصول إلى الخدمات المجمّعة الأخرى مثل Blobstore والبريد والمؤجلة مزيدًا من التغييرات على الرمز. تشمل وحدات نقل البيانات التي تركّز على التوقف عن استخدام خدمات App Engine القديمة التي يجب أخذها في الاعتبار ما يلي:

لم يعد App Engine النظام الأساسي الوحيد بدون خوادم في Google Cloud. إذا كان لديك تطبيق App Engine صغير أو تطبيق ذو وظائف محدودة وتريد تحويله إلى خدمة مصغّرة مستقلة، أو إذا كنت تريد تقسيم تطبيق متجانس إلى عدة مكوّنات قابلة لإعادة الاستخدام، هذه هي الأسباب الوجيهة للانتقال إلى وظائف السحابة الإلكترونية. إذا أصبحت عملية التطوير جزءًا من سير عمل تطوير التطبيقات، خاصةً إذا كانت تتألف من مسار CI/CD (التكامل المستمر أو العرض أو النشر المستمر)، ننصحك بنقل البيانات إلى تشغيل السحابة الإلكترونية. تغطي الوحدات التالية هذه السيناريوهات:

  • نقل البيانات من App Engine إلى Cloud Functions: راجِع الوحدة 11.
  • نقل البيانات من App Engine إلى Cloud Run: راجِع الوحدة 4 لتضمين تطبيقك مع Docker، أو الوحدة 5 لتنفيذ ذلك بدون حاويات أو معلومات Docker أو Dockerfiles.

إنّ التبديل إلى نظام أساسي آخر بدون خادم هو إجراء اختياري، وننصحك بالتفكير في أفضل الخيارات لتطبيقاتك وحالات الاستخدام قبل إجراء أي تغييرات.

بغض النظر عن وحدة نقل البيانات التي تفكر فيها بعد ذلك، يمكن الوصول إلى كل محتوى محطة النقل بدون خادم (الدروس التطبيقية حول الترميز والفيديوهات ورمز المصدر [عند توفّره]) من خلال مستودع البرامج المفتوحة المصدر. يوفّر README الخاص بالمستودع أيضًا إرشادات حول عمليات نقل البيانات التي يجب أخذها في الاعتبار وأي "طلب" ذي صلة. لوحدات النقل.

7. مراجع إضافية

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

مشاكل أو ملاحظات حول درس تطبيقي حول الترميز

إذا وجدت أي مشاكل في هذا الدرس التطبيقي حول الترميز، يُرجى البحث عن مشكلتك أولاً قبل ملء النموذج. روابط للبحث وإنشاء مشاكل جديدة:

موارد نقل البيانات

يمكن العثور على روابط لمجلدات repo للوحدة 1 (START) والوحدة 1b (FINISH) في الجدول أدناه. ويمكن الوصول إليها أيضًا من المستودع الخاص بجميع عمليات نقل البيانات على درس تطبيقي حول الترميز في App Engine.

Codelab

Python 2

Python 3

الوحدة 1

الرموز البرمجية

لا ينطبق

الوحدة 17 (هذا الدرس التطبيقي حول الترميز)

لا ينطبق

code (الرمز) (mod1b-flask)

مراجع على الإنترنت

في ما يلي موارد على الإنترنت قد تكون ذات صلة بهذا البرنامج التعليمي:

خدمات App Engine المجمّعة

المستندات العامة لـ App Engine

معلومات أخرى عن السحابة الإلكترونية

الفيديوهات

الترخيص

هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.