تحدثت الميكروسيرفيسز والحاويات ثورة في كيفية بناء التطبيقات الحديثة ونشرها وإدارتها في السحابة. ومع ذلك، يمكن أن يؤدي تطوير وتشغيل الميكروسيرفيسز إلى تعقيد كبير، غالبًا ما يتطلب من المطورين قضاء وقت ثمين في القضايا المتقاطعة مثل اكتشاف الخدمات، إدارة الحالة، والرصد.
دابر، أو Runtime التطبيقات الموزعة، هو بيئة تشغيل مفتوحة المصدر لبناء الميكروسيرفيسز في بيئات السحابة والحافة. يوفر دابر مكونات أساسية غير مرتبطة بالمنصة مثل اكتشاف الخدمات، إدارة الحالة، رسائل النشر/الاشتراك، والرصد من دون أي إعداد. انتقل دابر إلى مستوى النضج المتخرج من CNCF (مؤسسة الحوسبة الأصلية للسحاب) ويستخدم حاليًا من قبل العديد من المؤسسات.
عند دمجه مع خدمة أمازون إلكتريك كوبرنيتس (Amazon EKS)، وهي خدمة كوبرنيتس مُدارة من أمازون ويب سيرفيسز، يمكن لدابر تسريع اعتماد الميكروسيرفيسز والحاويات، مما يمكّن المطورين من التركيز على كتابة منطق الأعمال دون القلق بشأن البنية التحتية. تجعل خدمة Amazon EKS إدارة مجموعات كوبرنيتس سهلة، مما يمكّن من التوسع بسهولة مع تغير الأحمال.
في هذه المدونة، سنستكشف كيف يبسط دابر تطوير الميكروسيرفيسز على Amazon EKS. سنبدأ بالتعمق في مكونين أساسيين: استدعاء الخدمة و إدارة الحالة.
استدعاء الخدمة
الاتصال السلس والموثوق بين الخدمات الصغيرة أمر حاسم. ومع ذلك، غالبًا ما يواجه المطورون صعوبات في المهام المعقدة مثل اكتشاف الخدمات، وتوحيد واجهات البرمجة التطبيقية، وتأمين قنوات الاتصال، والتعامل مع الأخطاء بأناقة، وتنفيذ قابلية الملاحظة.
مع استدعاء الخدمة في Dapr، تصبح هذه المشاكل من الماضي. يمكن لخدماتك التواصل بسهولة مع بعضها البعض باستخدام بروتوكولات صناعية معيارية مثل gRPC وHTTP/HTTPS. يتولى استدعاء الخدمة كل الأعباء الثقيلة، بدءًا من تسجيل الخدمة واكتشافها إلى إعادة المحاولات للطلبات، والتشفير، ومراقبة الوصول، وتتبع التوزيع.
إدارة الحالة
يبسط كتلة بناء إدارة الحالة في Dapr الطريقة التي يعمل بها المطورون مع الحالة في تطبيقاتهم. يوفر واجهة برمجة تطبيقات متسقة لتخزين البيانات واسترجاعها، بغض النظر عن متجر الحالة الأساسي (مثل Redis، AWS DynamoDB، Azure Cosmos DB).
تمكن هذه التجريد المطورين من بناء تطبيقات تحتفظ بالحالة دون القلق بشأن تعقيدات إدارة وتوسيع متاجر الحالة.
المتطلبات الأساسية
من أجل متابعة هذه المقالة، يجب أن تكون لديك ما يلي:
- حساب AWS. إذا لم يكن لديك حساب، يمكنك التسجيل للحصول على واحد.
- مستخدم IAM بصلاحيات مناسبة. يجب أن يكون المبدأ الأمني IAM الذي تستخدمه لديه إذن للعمل مع أدوار IAM الخاصة بـ Amazon EKS والأدوار المرتبطة بالخدمة و AWS CloudFormation و VPC والموارد ذات الصلة. لمزيد من المعلومات، انظر Actions, resources, and condition keys for Amazon Elastic Container Service for Kubernetes و Using service-linked roles في دليل مستخدم AWS Identity and Access Management.
هندسة التطبيقات
في الرسم البياني أدناه، لدينا خدمتين صغيرتين: تطبيق Python وتطبيق Node.js. يقوم تطبيق Python بإنشاء بيانات الطلب ويستدعي نقطة النهاية /neworder
التي يتعرض لها تطبيق Node.js. يكتب تطبيق Node.js البيانات الواردة للطلب في مخزن حالة (في هذه الحالة، Amazon ElastiCache) ويُعيد معرف الطلب إلى تطبيق Python كاستجابة.
من خلال استغلال كتلة بناء استدعاء الخدمة في Dapr، يمكن لتطبيق Python التواصل بسلاسة مع تطبيق Node.js دون القلق بشأن اكتشاف الخدمة، توحيد واجهة برمجة التطبيقات، أمان قناة الاتصال، التعامل مع الأخطاء، أو قابلية المراقبة. ينفذ mTLS لتوفير تواصل آمن بين الخدمات.
يتعامل Dapr مع هذه القضايا العابرة، مما يتيح للمطورين التركيز على كتابة منطق الأعمال الأساسي.
بالإضافة إلى ذلك، يبسط كتلة بناء إدارة حالة Dapr كيفية تفاعل تطبيق Node.js مع متجر الحالة (Amazon ElastiCache). يوفر Dapr واجهة برمجة تطبيقات متسقة لتخزين البيانات واسترجاعها، مجردةً عن تعقيدات إدارة وتوسيع متجر الحالة الأساسي. تمكين المطورين من بناء تطبيقات تحتفظ بالحالة دون القلق بشأن تفاصيل إدارة متجر الحالة.
تستضيف مجموعة Amazon EKS مساحة اسم تسمى dapr-system
، تحتوي على مكونات خطة التحكم Dapr. يقوم dapr-sidecar-injector
تلقائيًا بحقن تشغيل Dapr إلى الأشرطة لخدمات الميكروسيرفيسات التي تدعم Dapr.
خطوات استدعاء الخدمة
- يقوم تطبيق مُنشئ الطلبات (تطبيق Python) باستدعاء طريقة تطبيق الـ Node،
/neworder
. يتم إرسال هذا الطلب إلى الأشرطة المحلية لـ Dapr، التي تعمل في نفس الأشرطة التي يعمل فيها تطبيق Python. - يُحل Dapr التطبيق المستهدف باستخدام موفر خدمة DNS لمجموعة Amazon EKS ويرسل الطلب إلى الأشرطة لتطبيق الـ Node.
- ثم يرسل أشرطة تطبيق الـ Node الطلب إلى ميكروسيرفيس تطبيق الـ Node.
- يكتب تطبيق الـ Node ثمرة الطلب الهوية التي تلقاها من تطبيق Python إلى Amazon ElasticCache.
- يُرسل تطبيق الـ Node الرد إلى أشرطته المحلية لـ Dapr.
- يُوجه أشرطة تطبيق الـ Node الرد إلى أشرطة تطبيق Python.
- تُعيد أشرطة تطبيق Python الرد إلى تطبيق Python، الذي بدأ الطلب إلى طريقة تطبيق الـ Node
/neworder
.
خطوات النشر
إنشاء وتأكيد عنقود EKS
لإعداد عنقود أمازون EKS (خدمة كوبيرنيتيس المرنة)، ستحتاج إلى اتباع عدة خطوات. إليك نظرة عامة على العملية:
المتطلبات الأولية
- قم بتثبيت وضبط AWS CLI
- قم بتثبيت
eksctl
،kubectl
، ومصادق AWS IAM
1. إنشاء عنقود EKS. استخدم eksctl
لإنشاء عنقود أساسي باستخدام أمر مثل:
eksctl create cluster --name my-cluster --region us-west-2 --node-type t3.medium --nodes 3
2. ضبط kubectl. قم بتحديث kubeconfig
للاتصال بالعنقود الجديد:
aws eks update-kubeconfig --name my-cluster --region us-west-2
3. التحقق من العنقود. تحقق مما إذا كانت العقد جاهزة:
kubectl get nodes
تثبيت DAPR على عنقودك EKS
1. تثبيت DAPR CLI:
wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash
2. التحقق من التثبيت:
dapr -h
3. تثبيت DAPR والتحقق:
dapr init -k --dev
dapr status -k
تم إنشاء مكونات Dapr statestore
و pubsub
في النطاق الافتراضي. يمكنك التحقق من ذلك باستخدام الأمر التالي:
dapr components -k
ضبط Amazon ElastiCache كـ Dapr StateStore الخاص بك
قم بإنشاء Amazon ElastiCache لتخزين الحالة للخدمة المصغرة. في هذا المثال، نحن نستخدم ElastiCache لاختيار خوادم، التي تنشئ بسرعة ذاكرة مؤقتة تتطابق تلقائيًا مع متطلبات حركة مرور التطبيق دون وجود خوادم لإدارتها.
قم بتكوين مجموعة الأمان لـ ElastiCache للسماح بالاتصالات من خادم EKS الخاص بك. لأسباب بسيطة، احتفظ بها في نفس VPC الخاص بكادر EKS. احرص على الحفاظ على عنوان الذاكرة المؤقتة، الذي سنحتاجه في الخطوات التالية.
تشغيل تطبيق عينة
1. استنسخ مستودع Git لتطبيق العينة:
git clone https://github.com/dapr/quickstarts.git
2. أنشئ redis-state.yaml
وقم بتوفير عنوان Amazon ElasticCache لـ redisHost
:
apiVersion dapr.io/v1alpha1
kind Component
metadata
name statestore
namespace default
spec
type state.redis
version v1
metadata
name redisHost
value redisdaprd-7rr0vd.serverless.use1.cache.amazonaws.com6379
name enableTLS
value true
قم بتطبيق تكوين yaml
لمكون متجر الحالة باستخدام kubectl
.
kubectl apply -f redis-state.yaml
3. نشر خدمات صغيرة مع السايدكار.
بالنسبة لتطبيق العقدة الصغيرة، انتقل إلى الملف /quickstarts/tutorials/hello-kubernetes/deploy/node.yaml
وستلاحظ الإعلامات أدناه. تخبر سطح التحكم في Dapr بحقن سايدكار وتعيين اسم لتطبيق Dapr.
annotations
dapr.io/enabled"true"
dapr.io/app-id"nodeapp"
dapr.io/app-port"3000"
أضف تعليقًا service.beta.kubernetes.io/aws-load-balancer-scheme: “internet-facing” في node.yaml
لإنشاء AWS ELB.
kind Service
apiVersion v1
metadata
name nodeapp
annotations
service.beta.kubernetes.io/aws-load-balancer-scheme"internet-facing"
labels
app node
spec
selector
app node
ports
protocol TCP
port80
targetPort3000
type LoadBalancer
نشر تطبيق العقدة باستخدام kubectl
. انتقل إلى المجلد /quickstarts/tutorials/hello-kubernetes/deploy
وقم بتنفيذ الأمر أدناه.
kubectl apply -f node.yaml
احصل على AWS NLB، الذي يظهر تحت عنوان IP الخارجي، في الإخراج من الأمر أدناه.
kubectl get svc nodeapp http://k8s-default-nodeapp-3a173e0d55-f7b14bedf0c4dd8.elb.us-east-1.amazonaws.com
انتقل إلى المجلد /quickstarts/tutorials/hello-kubernetes
، الذي يحتوي على ملف sample.json
لتنفيذ الخطوة أدناه.
curl --request POST --data "@sample.json" --header Content-Type:application/json http://k8s-default-nodeapp-3a173e0d55-f14bedff0c4dd8.elb.us-east-1.amazonaws.com/neworder
يمكنك التحقق من الناتج عن طريق الوصول إلى نقطة النهاية /order
باستخدام جهاز الوزن في المتصفح.
http://k8s-default-nodeapp-3a173e0d55-f7b14bedff0c4dd8.elb.us-east-1.amazonaws.com/order
سوف ترى الناتج كـ {“OrderId”:“42”}
بعد ذلك، قم بنشر تطبيق Python للخدمات الصغيرة الثاني، الذي يحتوي على منطق تجاري لإنشاء هوية طلب جديدة كل ثانية واستدعاء طريقة التطبيق Node /neworder
.
انتقل إلى الدليل /quickstarts/tutorials/hello-kubernetes/deploy
وقم بتنفيذ الأمر أدناه.
kubectl apply -f python.yaml
4. التحقق من صحة واختبار نشر تطبيقك.
الآن بعد أن قمنا بنشر كل من التطبيقات الصغيرة، التطبيق Python يقوم بإنشاء الطلبات واستدعاء /neworder
كما هو واضح من السجلات أدناه.
kubectl logs --selector=app=python -c daprd --tail=-1
time"2024-03-07T12:43:11.556356346Z" levelinfo msg"HTTP API Called" app_idpythonapp instancepythonapp974db9877dljtw method"POST /neworder" scopedapr.runtime.httpinfo typelog useragentpythonrequests2.31.0 ver1.12.5
time"2024-03-07T12:43:12.563193147Z" levelinfo msg"HTTP API Called" app_idpythonapp instancepythonapp974db9877dljtw method"POST /neworder" scopedapr.runtime.httpinfo typelog useragentpythonrequests2.31.0 ver1.12.5
يمكننا رؤية أن التطبيق Node يستقبل الطلبات ويكتب إلى مخزن الحالة Amazon ElasticCache في مثالنا.
kubectl logs —selector=app=node -c node —tail=-1
Got a new order Order ID: 367
Successfully persisted state for Order ID: 367
Got a new order Order ID: 368
Successfully persisted state for Order ID: 368
Got a new order Order ID: 369
Successfully persisted state for Order ID: 369
لتأكيد ما إذا كانت البيانات محفوظة في Amazon ElasticCache، نصل إلى النقطة النهائية /order
أدناه. يُعيد ذلك هوية الطلب الأحدث التي تم إنشاؤها بواسطة تطبيق Python.
http://k8s-default-nodeapp-3a173e0d55-f7b14beff0c4dd8.elb.us-east-1.amazonaws.com/order
سوف ترى الناتج مع أحدث طلب كـ {“OrderId”:“370”}
.
تنظيف
قم بتشغيل الأمر أدناه لحذف تطبيقات Node و Python مع مكون مخزن الحالة.
انتقل إلى الدليل /quickstarts/tutorials/hello-kubernetes/deploy
لتنفيذ الأمر أدناه.
kubectl delete -f node.yaml
kubectl delete -f python.yaml
يمكنك إزالة مجموعة EKS الخاصة بك باستخدام أمر eksctl
وحذف Amazon ElastiCache.
انتقل إلى الدليل الذي يحتوي على ملف cluster.yaml
المستخدم لإنشاء المجموعة في الخطوة الأولى.
eksctl delete cluster -f cluster.yaml
الاستنتاج
يشكل Dapr وAmazon EKS تحالفًا قويًا لتطوير خدمات ميكرو. يبسط Dapr الاهتمامات العابرة، بينما يدير EKS بنية Kubernetes، مما يتيح للمطورين التركيز على منطق الأعمال الأساسي وزيادة الإنتاجية.
تسرع هذه الجمعية إنشاء تطبيقات قابلة للتوسعة ومتينة وقابلة للملاحظة، مما يقلل بشكل كبير من العبء التشغيلي. إنها أساس مثالي لرحلتك في خدمات الميكرو. ترقب المشاركات القادمة التي تستكشف قدرات Dapr وEKS في تتبع التوزيع والملاحظة، مما يقدم رؤى أعمق وأفضل الممارسات.
Source:
https://dzone.com/articles/streamline-microservices-development-with-dapr-amazon-eks