نقل موقع إلكتروني متجانس إلى خدمات مصغّرة على Google Kubernetes Engine

1. مقدمة

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

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

في ما يلي بعض العيوب عند مقارنتها بالبُنى المتكاملة:

  • بما أنّ التطبيق المستند إلى الخدمات المصغّرة هو شبكة من الخدمات المختلفة التي تتفاعل غالبًا بطرق غير واضحة، يزداد التعقيد العام للنظام.
  • على عكس الأجزاء الداخلية من بنية متكاملة، تتواصل الخدمات المصغّرة عبر شبكة. في بعض الحالات، يمكن اعتبار ذلك مصدر قلق أمني. يحلّ Istio هذه المشكلة من خلال تشفير البيانات تلقائيًا بين الخدمات المصغّرة.
  • قد يكون من الصعب تحقيق مستوى الأداء نفسه الذي تحقّقه البنية المتكاملة بسبب حالات التأخير بين الخدمات.
  • لا يحدث سلوك نظامك بسبب خدمة واحدة، بل بسبب العديد من الخدمات وتفاعلاتها. لهذا السبب، يصعب فهم طريقة عمل نظامك في مرحلة الإنتاج (إمكانية المراقبة). يُعدّ Istio أيضًا حلاً لهذه المشكلة.

في هذا التمرين العملي، سنشغّل الخدمات المصغّرة في Google Kubernetes Engine (GKE). ‫Kubernetes هي منصة لإدارة الحاويات واستضافتها وتوسيع نطاقها ونشرها. الحاويات هي طريقة محمولة لتغليف التعليمات البرمجية وتشغيلها. وهي مناسبة تمامًا لنمط الخدمات المصغّرة، حيث يمكن تشغيل كل خدمة مصغّرة في الحاوية الخاصة بها.

في هذا المختبر، سننشر تطبيقًا موحّدًا حاليًا في مجموعة Google Kubernetes Engine، ثم سنقسّمه إلى خدمات مصغّرة.

مخطّط البنية للخدمات الدقيقة

سنبدأ بتقسيم التطبيق المتكامل إلى ثلاث خدمات مصغّرة، واحدة في كل مرة. تشمل الخدمات المصغّرة الطلبات والمنتجات وواجهة المستخدم. ننشئ صورة Docker لكل خدمة مصغّرة باستخدام Cloud Build، ونفعّلها من داخل Cloud Shell. بعد ذلك، سننشر خدماتنا المصغّرة ونعرضها على Google Kubernetes Engine (GKE) باستخدام نوع خدمة Kubernetes LoadBalancer. سننفّذ ذلك لكل خدمة مع إعادة تصميمها في الوقت نفسه خارج البنية المتجانسة. أثناء العملية، سيتم تشغيل كلّ من البنية المتكاملة والخدمات المصغّرة إلى أن نتمكّن من حذف البنية المتكاملة.

636a2d58588b2b87.png

أهداف الدورة التعليمية

  • كيفية تقسيم بنية Monolith إلى خدمات مصغّرة
  • كيفية إنشاء مجموعة Google Kubernetes Engine
  • كيفية إنشاء صورة Docker
  • كيفية نشر صور Docker على Kubernetes

المتطلبات الأساسية

  • حساب على Google Cloud Platform لديه إذن وصول إداري لإنشاء مشاريع أو مشروع لديه دور "مالك المشروع"
  • فهم أساسي لـ Docker وKubernetes

2. إعداد البيئة

إعداد البيئة بوتيرة ذاتية

إذا لم يكن لديك حساب Google (Gmail أو Google Apps)، عليك إنشاء حساب. سجِّل الدخول إلى "وحدة تحكّم Google Cloud Platform" (console.cloud.google.com) وأنشِئ مشروعًا جديدًا:

53dad2cefdae71da.png

لقطة شاشة من 2016-02-10 12:45:26.png

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

بعد ذلك، عليك تفعيل الفوترة في Developers Console من أجل استخدام موارد Google Cloud وتفعيل Container Engine API.

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

يمكن للمستخدمين الجدد في Google Cloud Platform الاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

Google Cloud Shell

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

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

  1. لتفعيل Cloud Shell من Cloud Console، ما عليك سوى النقر على تفعيل Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (يستغرق توفير البيئة والاتصال بها بضع لحظات فقط).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تمّت المصادقة عليك وأنّ المشروع تمّ ضبطه مسبقًا على PROJECT_ID.

gcloud auth list

ناتج الأمر

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

ناتج الأمر

[core]
project = <PROJECT_ID>

إذا لم يتم ضبط المشروع لسبب ما، ما عليك سوى تنفيذ الأمر التالي:

gcloud config set project <PROJECT_ID>

هل تبحث عن PROJECT_ID؟ يمكنك الاطّلاع على المعرّف الذي استخدمته في خطوات الإعداد أو البحث عنه في لوحة بيانات Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

يضبط Cloud Shell أيضًا بعض متغيرات البيئة تلقائيًا، ما قد يكون مفيدًا عند تنفيذ الأوامر المستقبلية.

echo $GOOGLE_CLOUD_PROJECT

ناتج الأمر

<PROJECT_ID>
  1. أخيرًا، اضبط المنطقة التلقائية وإعدادات المشروع.
gcloud config set compute/zone us-central1-f

يمكنك اختيار مجموعة متنوعة من المناطق المختلفة. لمزيد من المعلومات، يُرجى الاطّلاع على الأقاليم والمناطق.

3- استنساخ مستودع المصدر

نستخدم تطبيقًا موحّدًا حاليًا لموقع إلكتروني وهمي للتجارة الإلكترونية، مع صفحة ترحيب بسيطة وصفحة منتجات وصفحة سجلّ الطلبات. ما علينا سوى استنساخ المصدر من مستودع git، حتى نتمكّن من التركيز على تقسيمه إلى خدمات مصغّرة ونشره على Google Kubernetes Engine (GKE).

نفِّذ الأوامر التالية لاستنساخ مستودع git إلى مثيل Cloud Shell والانتقال إلى الدليل المناسب. سنثبّت أيضًا التبعيات في NodeJS حتى نتمكّن من اختبار التطبيق المتكامل قبل نشره. قد يستغرق تنفيذ هذا النص البرمجي بضع دقائق.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

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

4. إنشاء مجموعة GKE

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

gcloud services enable container.googleapis.com

نحن الآن جاهزون لإنشاء مجموعتنا. نفِّذ الأمر أدناه لإنشاء مجموعة GKE باسم fancy-cluster تضم 3 عقد.

gcloud container clusters create fancy-cluster --num-nodes 3

قد يستغرق إنشاء المجموعة عدة دقائق. بعد اكتمال الأمر، نفِّذ الأمر التالي واطّلِع على مثيلات VM الثلاث الخاصة بعُقد العامل في المجموعة:

gcloud compute instances list

إخراج:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

يمكنك أيضًا الاطّلاع على مجموعة Kubernetes ومعلوماتها ذات الصلة في "وحدة تحكّم Google Cloud". انقر على زر القائمة في أعلى يمين الصفحة، ثم انتقِل للأسفل إلى Kubernetes Engine وانقر على "المجموعات". من المفترض أن يظهر اسم مجموعتك fancy-cluster.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

تهانينا! لقد أنشأت للتوّ مجموعة Kubernetes الأولى.

5- نشر بنية متجانسة حالية

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

cd ~/monolith-to-microservices
./deploy-monolith.sh

الوصول إلى The Monolith

للعثور على عنوان IP الخارجي لتطبيقنا المتكامل، نفِّذ الأمر التالي.

kubectl get service monolith

ينبغي أن تظهر مُخرجات مشابهة لما يلي:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

ملاحظة: يجب توفير موازن تحميل خارجي وعنوان IP لإجراء ذلك، لذا سيستغرق الأمر بعض الوقت. إذا كانت المخرجات تعرض عنوان IP الخارجي على النحو التالي:

<pending> انتظر بضع دقائق وأعِد المحاولة.

بعد تحديد عنوان IP الخارجي لنظامك المتكامل، انسخ عنوان IP. وجِّه متصفّحك إلى عنوان URL هذا (مثل http://203.0.113.0) للتحقّق مما إذا كان بإمكانك الوصول إلى التطبيق المتكامل.

9ed25c3f0cbe62fa.png

من المفترض أن تظهر لك صفحة الترحيب الخاصة بالموقع الإلكتروني المتكامل تمامًا كما هو موضّح في الصورة أعلاه. صفحة الترحيب هي صفحة ثابتة سيعرضها تطبيق Frontend المصغّر لاحقًا. أصبح بإمكانك الآن تشغيل تطبيقك المتكامل بالكامل على Kubernetes.

6. نقل الطلبات إلى خدمة مصغّرة

بعد أن أصبح لدينا موقعنا الإلكتروني المتكامل الحالي يعمل على GKE، يمكننا البدء في تقسيم كل خدمة إلى خدمة مصغّرة. عادةً، يجب بذل جهد تخطيطي لتحديد الخدمات التي سيتم تقسيمها إلى أجزاء أصغر، وعادةً ما يكون ذلك حول أجزاء معيّنة من التطبيق، مثل مجال النشاط التجاري. لأغراض توضيحية، أنشأنا مثالاً بسيطًا وقسّمنا كل خدمة إلى نطاق النشاط التجاري، أي الطلبات والمنتجات وواجهة المستخدم. تمت عملية نقل الرمز البرمجي، وسنركّز على إنشاء الخدمات ونشرها على Google Kubernetes Engine (GKE).

إنشاء خدمة مصغّرة جديدة للطلبات

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

إنشاء حاوية Docker باستخدام Google Cloud Build

بما أنّنا نقلنا قاعدة الرموز البرمجية نيابةً عنك، ستكون خطوتنا الأولى هي إنشاء حاوية Docker لخدمة الطلبات باستخدام Google Cloud Build.

في العادة، عليك اتّخاذ خطوتَين تتضمّنان إنشاء حاوية Docker ونقلها إلى سجلّ لتخزين الصورة التي يمكن لخدمة GKE استردادها منه. ولكن يمكننا تسهيل الأمر، إذ يمكننا استخدام Google Cloud Build لإنشاء حاوية Docker ووضع الصورة في Google Cloud Container Registry باستخدام أمر واحد. يتيح لنا ذلك إصدار أمر واحد لإنشاء صورتنا ونقلها إلى سجلّ الحاويات. للاطّلاع على العملية اليدوية لإنشاء ملف docker ونشره، يمكنك الانتقال إلى هذه الصفحة.

ستضغط خدمة Google Cloud Build الملفات من الدليل وتنقلها إلى حزمة Google Cloud Storage. ستأخذ عملية التصميم بعد ذلك جميع الملفات من الحزمة وتستخدم Dockerfile لتشغيل عملية إنشاء Docker. بما أنّنا حدّدنا العلامة --tag مع المضيف gcr.io لصورة Docker، سيتم إرسال صورة Docker الناتجة إلى Google Cloud Container Registry.

نفِّذ الأوامر التالية لإنشاء حاوية Docker ونقلها إلى Google Container Registry:

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0 .

ستستغرق هذه العملية بضع دقائق، ولكن بعد اكتمالها، سيظهر في الوحدة الطرفية ناتج مشابه لما يلي:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/orders:1.0.0  SUCCESS

للاطّلاع على سجلّ عمليات الإنشاء أو مشاهدة العملية في الوقت الفعلي، يمكنك الانتقال إلى Google Cloud Console. انقر على زر القائمة في أعلى يمين الصفحة وانتقِل للأسفل إلى "الأدوات" (Tools) → "Cloud Build" (إنشاء على السحابة الإلكترونية) وانقر على "السجلّ" (History). يمكنك هنا الاطّلاع على قائمة بجميع الإصدارات السابقة، ويجب أن يكون هناك إصدار واحد فقط أنشأته للتو.

4c753ede203255f6.png

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

من صفحة تفاصيل الإصدار، يمكنك عرض صورة الحاوية التي تم إنشاؤها من خلال النقر على اسم الصورة في قسم معلومات الإصدار.

6e88ed1643dfe629.png

نشر الحاوية على GKE

بعد أن أنشأنا حاوية لموقعنا الإلكتروني وأرسلناها إلى "سجلّ حاويات Google"، حان الوقت لنشرها على Kubernetes.

تمثّل Kubernetes التطبيقات على شكل وحدات Pod، وهي وحدات تمثّل حاوية (أو مجموعة من الحاويات المرتبطة بإحكام). ‫Pod هي أصغر وحدة قابلة للنشر في Kubernetes. في هذا البرنامج التعليمي، لا تحتوي كل وحدة Pod إلا على حاوية الخدمات المصغّرة.

لنشر التطبيقات وإدارتها على مجموعة GKE، عليك التواصل مع نظام إدارة مجموعات Kubernetes. يمكنك إجراء ذلك عادةً باستخدام أداة سطر الأوامر kubectl من داخل Cloud Shell.

أولاً، سننشئ مورد Deployment. تتولّى عملية النشر إدارة نُسخ متعددة من تطبيقك، تُعرف باسم النُسخ المتماثلة، وتجدولها ليتم تشغيلها على العُقد الفردية في مجموعتك. في هذه الحالة، لن يتم تشغيل سوى وحدة Pod واحدة من تطبيقك. تضمن عمليات النشر ذلك من خلال إنشاء ReplicaSet. تكون ReplicaSet مسؤولة عن التأكّد من أنّ عدد النسخ المتماثلة المحدّد يعمل دائمًا.

يتسبّب الأمر kubectl create deployment أدناه في أن ينشئ Kubernetes عملية نشر باسم orders على مجموعتك مع نسخة طبق الأصل 1.

نفِّذ الأمر التالي لنشر تطبيقك:

kubectl create deployment orders --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0

التحقّق من عملية النشر

للتحقّق من إنشاء عملية النشر بنجاح، شغِّل الأمر التالي. قد يستغرق ظهور حالة الحزمة على أنّها "قيد التشغيل" بضع لحظات:

kubectl get all

إخراج:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-779c8d95f5-dxnzl   1/1     Running   0          15h
pod/orders-5bc6969d76-kdxkk     1/1     Running   0          21s
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.39.240.1     <none>         443/TCP        19d
service/monolith     LoadBalancer   10.39.241.130   34.74.209.57   80:30412/TCP   15h
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1/1     1            1           15h
deployment.apps/orders     1/1     1            1           21s
NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-779c8d95f5   1         1         1       15h
replicaset.apps/orders-5bc6969d76     1         1         1       21s

يوضّح لنا هذا الناتج عدة أمور. يمكننا الاطّلاع على عملية النشر الحالية، وReplicaSet مع عدد الوحدات المطلوب من 1، والوحدة التي يتم تشغيلها. يبدو أنّه تم إنشاء كل شيء بنجاح.

عرض حاوية GKE

لقد نشرنا تطبيقنا على GKE، ولكن ليس لدينا طريقة للوصول إليه خارج المجموعة. بشكلٍ تلقائي، لا يمكن الوصول إلى الحاويات التي تشغّلها على GKE من الإنترنت، لأنّها لا تتضمّن عناوين IP خارجية. يجب أن تعرض تطبيقك بشكل واضح لعدد الزيارات من الإنترنت من خلال مورد خدمة. توفّر الخدمة إمكانية الربط بالشبكة وعناوين IP لوحدات Pod في تطبيقك. ينشئ GKE عنوان IP خارجيًا وجهاز موازنة حمل ( يخضع للفوترة) لتطبيقك.

عندما نشرنا خدمة "الطلبات"، أتحناها على المنفذ 8081 داخليًا من خلال عملية نشر Kubernetes. لعرض هذه الخدمة خارجيًا، علينا إنشاء خدمة Kubernetes من النوع LoadBalancer لتوجيه حركة البيانات من المنفذ 80 خارجيًا إلى المنفذ 8081 الداخلي لخدمة الطلبات. نفِّذ الأمر التالي لإتاحة موقعك الإلكتروني على الإنترنت:

kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081

الوصول إلى الخدمة

يخصّص GKE عنوان IP خارجيًا لمورد الخدمة، وليس لعملية النشر. إذا أردت معرفة عنوان IP الخارجي الذي وفّره GKE لتطبيقك، يمكنك فحص الخدمة باستخدام الأمر kubectl get service:

kubectl get service orders

إخراج:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
orders       10.3.251.122    203.0.113.0     80:30877/TCP     3d

بعد تحديد عنوان IP الخارجي لتطبيقك، انسخ عنوان IP. احفظه للخطوة التالية عندما نغيّر نظامنا المتكامل للإشارة إلى خدمة "الطلبات" الجديدة.

إعادة ضبط البنية المتجانسة

بما أنّنا أزلنا خدمة "الطلبات" من البنية المتكاملة، علينا تعديل البنية المتكاملة للإشارة إلى خدمة "الطلبات" الخارجية الجديدة.

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

علينا تعديل ملف الإعداد في نظامنا المتكامل للإشارة إلى عنوان IP الجديد لخدمات الطلبات المصغّرة. استخدِم برنامج nano editor لاستبدال عنوان URL المحلي بعنوان IP الخاص بخدمة Orders المصغّرة الجديدة. نفِّذ الأمر التالي لتعديل

cd ~/monolith-to-microservices/react-app
nano .env.monolith

عند فتح المحرّر، يجب أن يظهر ملفك على النحو التالي:

REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

استبدِل REACT_APP_ORDERS_URL بالتنسيق الجديد مع استبداله بعنوان IP الخاص بخدمة Orders المصغّرة ليتطابق مع ما يلي:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

اضغط على CTRL+O، ثم على ENTER، ثم على CTRL+X لحفظ الملف في محرر nano.

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

بعد ذلك، علينا إعادة إنشاء الواجهة الأمامية المتكاملة وتكرار عملية الإنشاء لإنشاء الحاوية الخاصة بها وإعادة نشرها في مجموعة GKE. نفِّذ الأوامر التالية لإكمال هذه الخطوات:

إعادة إنشاء ملفات إعداد Monolith

npm run build:monolith

إنشاء حاوية Docker باستخدام Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

نشر الحاوية على GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

يمكنك التأكّد من أنّ تطبيقك يستهدف الآن خدمة Orders المصغّرة الجديدة من خلال الانتقال إلى تطبيق monolith في المتصفّح ثم إلى صفحة Orders. يجب أن تنتهي جميع معرّفات الطلبات باللاحقة ‎-MICROSERVICE كما هو موضّح أدناه:

1cdd60bb0d4d1148.png

7. نقل المنتجات إلى الخدمات المصغّرة

Create New Products Microservice

يمكننا مواصلة تقسيم خدماتنا من خلال نقل خدمة "المنتجات" أولاً. سنتبع العملية نفسها كما في الخطوة السابقة. شغِّل الأوامر التالية لإنشاء حاوية Docker ونشرها وإتاحتها من خلال خدمة Kubernetes.

إنشاء حاوية Docker باستخدام Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0 .

نشر الحاوية على GKE

kubectl create deployment products --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0

عرض حاوية GKE

kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082

ابحث عن عنوان IP العام لخدمات "المنتجات" بالطريقة نفسها التي اتّبعناها لخدمة "الطلبات" باستخدام الأمر التالي:

kubectl get service products

إخراج:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
products     10.3.251.122    203.0.113.0     80:30877/TCP     3d

احفظ عنوان IP للخطوة التالية عندما نعيد ضبط البنية المتكاملة لتشير إلى خدمة Products المصغّرة الجديدة.

إعادة ضبط البنية المتجانسة

استخدِم محرر nano لاستبدال عنوان URL المحلي بعنوان IP الخاص بخدماتنا المصغّرة الجديدة للمنتجات:

cd ~/monolith-to-microservices/react-app
nano .env.monolith

عند فتح المحرّر، يجب أن يظهر ملفك على النحو التالي:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

استبدِل REACT_APP_PRODUCTS_URL بالتنسيق الجديد مع استبداله بعنوان IP الخاص بخدمة Product المصغّرة ليتطابق مع ما يلي:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products

اضغط على CTRL+O، ثم على ENTER، ثم على CTRL+X لحفظ الملف في محرر nano.

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

بعد ذلك، علينا إعادة إنشاء الواجهة الأمامية المتكاملة وتكرار عملية الإنشاء لإنشاء الحاوية الخاصة بها وإعادة نشرها في مجموعة GKE. نفِّذ الأوامر التالية لإكمال هذه الخطوات:

إعادة إنشاء ملفات إعداد Monolith

npm run build:monolith

إنشاء حاوية Docker باستخدام Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0 .

نشر الحاوية على GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0

يمكنك التأكّد من أنّ تطبيقك يستهدف الآن خدمة Products المصغّرة الجديدة من خلال الانتقال إلى تطبيق monolith في المتصفّح ثم إلى صفحة Products. يجب أن تكون جميع أسماء المنتجات مسبوقة بـ MS- كما هو موضّح أدناه:

5389b29f4b8c7c69.png

8. نقل الواجهة الأمامية إلى خدمة مصغّرة

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

إنشاء خدمة مصغّرة جديدة للواجهة الأمامية

لنتبع الإجراء نفسه كما في الخطوتَين الأخيرتَين لإنشاء خدمة مصغّرة جديدة للواجهة الأمامية.

في السابق، عندما أعدنا بناء نظامنا المتكامل، عدّلنا الإعدادات لتشير إلى النظام المتكامل، ولكن الآن علينا استخدام الإعدادات نفسها لخدمة Frontend المصغّرة. نفِّذ الأوامر التالية لنسخ ملفات إعداد عناوين URL الخاصة بالخدمات المصغّرة إلى قاعدة رموز الخدمة المصغّرة للواجهة الأمامية:

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build

بعد إكمال ذلك، سنتبع العملية نفسها كما في الخطوات السابقة. شغِّل الأوامر التالية لإنشاء حاوية Docker ونشرها وإتاحتها من خلال خدمة Kubernetes.

إنشاء حاوية Docker باستخدام Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0 .

نشر الحاوية على GKE

kubectl create deployment frontend --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0

عرض حاوية GKE

kubectl expose deployment frontend --type=LoadBalancer --port 80 --target-port 8080

Delete The Monolith

بعد أن أصبحت جميع خدماتنا تعمل كخدمات مصغّرة، يمكننا حذف تطبيقنا المتكامل. يُرجى العِلم أنّه في عملية نقل البيانات الفعلية، سيستلزم ذلك أيضًا إجراء تغييرات على نظام أسماء النطاقات وغير ذلك من أجل توجيه أسماء النطاقات الحالية إلى الخدمات المصغّرة الجديدة للواجهة الأمامية لتطبيقنا. نفِّذ الأوامر التالية لحذف التطبيق المتكامل:

kubectl delete deployment monolith
kubectl delete service monolith

اختبار عملك

للتحقّق من أنّ كل شيء يعمل بشكل سليم، يجب ألا يعمل عنوان IP القديم من خدمة التطبيق المتكامل، وأن يستضيف عنوان IP الجديد من خدمة الواجهة الأمامية التطبيق الجديد. للاطّلاع على قائمة بجميع الخدمات وعناوين IP، استخدِم الأمر التالي:

kubectl get services

يجب أن تبدو مخرجاتك مشابهة لما يلي:

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
frontend     LoadBalancer   10.39.246.135   35.227.21.154    80:32663/TCP   12m
kubernetes   ClusterIP      10.39.240.1     <none>           443/TCP        18d
orders       LoadBalancer   10.39.243.42    35.243.173.255   80:32714/TCP   31m
products     LoadBalancer   10.39.250.16    35.243.180.23    80:32335/TCP   21m

بعد تحديد عنوان IP الخارجي لخدمة Frontend المصغّرة، انسخ عنوان IP. انتقِل بمتصفّحك إلى عنوان URL هذا (مثل http://203.0.113.0) للتحقّق مما إذا كان بإمكانك الوصول إلى الواجهة الأمامية. يجب أن يكون موقعك الإلكتروني كما كان قبل تقسيم البنية المتكاملة إلى خدمات مصغّرة.

9- تنظيف

بعد الانتهاء، أسهل طريقة لتنظيف جميع الأنشطة التي تم تنفيذها هي حذف المشروع. يؤدي حذف المشروع إلى حذف جميع الموارد التي تم إنشاؤها في هذا الدرس التطبيقي حول الترميز لضمان عدم حدوث أي رسوم متكررة غير متوقعة. نفِّذ ما يلي في Cloud Shell، حيث يكون PROJECT_ID هو رقم تعريف المشروع الكامل وليس اسم المشروع فقط.

gcloud projects delete [PROJECT_ID]

أكِّد الحذف من خلال إدخال الحرف "Y" عندما يُطلب منك ذلك.

10. تهانينا!

لقد قسّمت تطبيقك المتكامل بنجاح إلى خدمات مصغّرة ونشرتها على Google Kubernetes Engine.

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

يمكنك الاطّلاع على دروس البرمجة التالية لمعرفة المزيد عن Kubernetes:

موارد إضافية