بناء تطبيقات لا مركزية قوية باستخدام AWS SAM وجافا: دليل شامل
مقدمة في عالم التطبيقات اللا مركزية مع AWS SAM وجافا
في مقال سابق، تناولنا كيفية بناء تطبيق لا مركزي يعتمد على لغة بايثون باستخدام أداة AWS Chalice ونشره على AWS في غضون دقائق معدودة. ورغم أن Chalice أداة ممتازة للنماذج الأولية السريعة والممتعة، إلا أن بايثون قد لا تكون الخيار المفضل للكثيرين عندما يتعلق الأمر بتشغيل تطبيقات إنتاجية واسعة النطاق. تعتمد العديد من المؤسسات على لغة جافا كلغة تطوير أساسية، كما يتجه الكثير من المطورين نحو لغات أحدث مثل Go.
في هذا المقال، سنستعرض الخطوات اللازمة لبناء ونشر نفس التطبيق اللا مركزي الذي يجلب آخر الأخبار من Google News. ولكن هذه المرة، سنستخدم نموذج تطبيق AWS Serverless Application Model (SAM) ولغة جافا في عملية التطوير. على غرار Chalice، توفر واجهة سطر الأوامر AWS SAM CLI مجموعة غنية من الأدوات التي تمكن المطورين من بناء تطبيقات لا مركزية بسرعة وكفاءة.
المتطلبات الأساسية لبدء العمل
يتطلب هذا الدليل وجود حساب AWS. إذا لم يكن لديك حساب بالفعل، يمكنك إنشاء واحد الآن. سيستخدم تطبيقنا موارد الطبقة المجانية (free-tier) فقط، لذا لا ينبغي أن تكون التكلفة مصدر قلق. ستحتاج أيضًا إلى تهيئة إعدادات الأمان وإنشاء مستخدمين وأدوار للوصول إلى موارد AWS.
كيفية تهيئة بيانات اعتماد AWS
تعتمد أداة SAM على واجهة سطر الأوامر AWS Command Line Interface (CLI) في الخلفية لنشر المشروع. إذا لم تكن قد استخدمت AWS CLI من قبل للتعامل مع موارد AWS، يمكنك تثبيتها باتباع الإرشادات المتوفرة هنا. بمجرد التثبيت، ستحتاج إلى تهيئة AWS CLI لاستخدام بيانات الاعتماد من حساب AWS الخاص بك.

كيفية تثبيت SAM
الخطوة التالية هي تثبيت SAM. سنستخدم جافا في هذا الدليل، ولكن يمكنك استخدام أي بيئة تشغيل لغة تدعمها خدمة AWS Lambda.
التحقق من تثبيت جافا
تأكد من تثبيت جافا على نظامك. يمكنك التحقق من ذلك باستخدام الأمر التالي في الطرفية:
$ java --version
openjdk 11.0.8 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.8+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.8+10, mixed mode)
تثبيت SAM CLI
تختلف تعليمات تثبيت SAM CLI باختلاف نظام التشغيل الخاص بك. يغطي هذا المقال تعليمات التثبيت على نظام macOS. النهج الموصى به لتثبيت SAM CLI على macOS هو استخدام مدير الحزم Homebrew. تحقق من تثبيت Homebrew لديك، كالتالي:
$ brew --version
Homebrew/homebrew-core (git revision fe68a; last commit 2020-10-15)
Homebrew/homebrew-cask (git revision 4a2c25; last commit 2020-10-15)
إذا لم يكن مثبتًا، يمكنك تثبيت Homebrew باستخدام الأمر التالي:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
بعد ذلك، قم بتثبيت SAM باستخدام الأوامر التالية:
brew tap aws/tap
brew install aws-sam-cli
التحقق من تثبيت SAM
تأكد من أن SAM قد تم تثبيته بنجاح عن طريق التحقق من إصداره:
$ sam --version
SAM CLI, version 1.6.2
كيفية إنشاء مشروع جديد
بعد تثبيت SAM، قم بتشغيل الأمر sam init لإنشاء مشروع جديد. سنقوم بتحديد بعض المعلمات الإضافية لضمان إنشاء مشروع جافا بدلاً من الافتراضي (بايثون):
sam init -r java11 -d maven --app-template hello-world -n daily-news-java
بشكل افتراضي، يقوم SAM بإنشاء مشروع بايثون. نظرًا لأننا نريد إنشاء مشروع جافا، سنحتاج إلى تمرير بعض المعلمات الإضافية. إليك شرح لهذه المعلمات:
-r java11: لاستخدام بيئة تشغيل جافا 11.-d maven: لاستخدامMavenكمدير للتبعيات.--app-template hello-world: لاستخدام قالب البدء السريعHelloWorld.-n daily-news-java: لتعيين اسم مشروعنا.
سيؤدي هذا إلى إنشاء مجلد باسم daily-news-java في دليلك الحالي. ستلاحظ أن SAM قد أنشأ العديد من الملفات داخل هذا المجلد.

تعديل ملفات المشروع الأساسية
لنلقِ نظرة على ملف App.java. أنشأ الأمر sam init دالة Lambda بسيطة تعيد نص JSON التالي: {"message": "hello world"} وعنوان IP للجهاز عند استدعائها. يمكننا الآن تعديل هذا القالب وإضافة المزيد من التعليمات البرمجية لقراءة الأخبار من Google News.
الآن دعنا نلقي نظرة على ملف template.yml. يحتوي هذا الملف على قالب CloudFormation الذي ينشئ موارد Amazon API Gateway و AWS Lambda الخاصة بنا. تحدد تهيئة Lambda أن لدينا دالة lambda باسم HelloWorldFunction تعمل على Java 11 وتستخدم ذاكرة بحجم 512 MB. تحدد تهيئة API Gateway طريقة GET واحدة بمسار /hello سنستخدمه لاستدعاء الواجهة البرمجية.
سنستخدم مكتبات HTTP و XML الداخلية في جافا، لذلك لا نحتاج إلى إضافة أي تبعيات إلى ملف pom.xml الخاص بنا. لاحظ أن ملف pom.xml الافتراضي المقدم كجزء من الكود الأساسي يأتي مع تعيين مصدر المترجم إلى 1.8. سنحتاج إلى تحديث ذلك إلى 11 حتى نتمكن من استخدام مكتبة HTTP الجديدة التي تعد جزءًا من جافا 11.
نظرًا لأن جافا لغة موجهة للكائنات، دعنا ننشئ أيضًا فئة NewsItem تحتوي على عنوان وتاريخ نشر الخبر. لاحظ أننا قمنا بتجاوز طريقة toString. هذا ينشئ تمثيل JSON للكائن ويتجنب استخدام أي مكتبات تحليل JSON.
بعد ذلك، تحتاج إلى إضافة طريقة لجلب موجز RSS من Google، وتحليله لاستخراج عنوان الخبر وتاريخ النشر، وإنشاء قائمة بعناصر الأخبار. للقيام بذلك، أضف الكود التالي إلى ملف App.java الخاص بك:
الآن دعنا نحدّث طريقة handleRequest في App.java لاستدعاء هذه الطريقة وإرجاع قائمة عناصر الأخبار كنتيجة. لا تنسَ تحديث اختبارات الوحدة أيضًا. لقد تم كتابتها لاختبار وجود “hello world” في الاستجابة وستبدأ في الفشل بعد تغييرنا.
كيفية بدء عملية البناء (Build)
من مجلد daily-news-java، قم بتشغيل الأمر sam build.

يقوم هذا الأمر بتجميع التعليمات البرمجية المصدر الخاصة بك وبناء أي تبعيات لديك في التطبيق. ثم ينقل جميع الملفات إلى مجلد .aws-sam/build بحيث تكون جاهزة للتعبئة والنشر. كما يقوم بتحديث ملف template.yml وفقًا لذلك.
كيفية اختبار تطبيقك محليًا
هنا تكمن الميزة الرائعة لـ SAM: يمكنك نشر واختبار تطبيقك محليًا! هذا مفيد حقًا خلال مرحلة التطوير عندما ترغب في اختبار التعليمات البرمجية الخاصة بك دون الحاجة إلى نشرها على AWS. توفر واجهة SAM CLI الأمر sam local لتشغيل تطبيقك محليًا. يستخدم هذا داخليًا Docker لمحاكاة بيئة تنفيذ Lambda. إذا لم يكن لديك Docker مثبتًا، يمكنك الحصول عليه من هنا.
يمكننا اختبار تطبيقنا محليًا بطريقتين:
- استضافة الواجهة البرمجية (
API) محليًا. - استدعاء دالة
Lambdaمباشرةً.
دعنا نلقي نظرة على كلا الخيارين.
الاستضافة المحلية (Local Hosting)
استخدم الأمر التالي لبدء تشغيل الواجهة البرمجية محليًا:
sam local start-api
يقوم هذا داخليًا بإنشاء خادم محلي ويعرض نقطة نهاية محلية تحاكي واجهة REST API الخاصة بك.

بمجرد تحميل حاوية Docker، يمكنك الوصول إلى الواجهة البرمجية على localhost، كالتالي:
curl http://127.0.0.1:3000/hello
الاستدعاء المباشر (Direct Invocation)
استخدم الأمر التالي لاستدعاء دالة Lambda مباشرةً:
sam local invoke "HelloWorldFunction" -e events/event.json

يقوم هذا الأمر باستدعاء دالة Lambda مباشرة (تمامًا كما نستدعي طريقة main) ويمرر ملف event.json كحمولة (payload).
كيفية نشر المشروع
الآن، لننشر التطبيق. من مجلد daily-news-java، قم بتشغيل الأمر sam deploy --guided. اتبع التعليمات وقدم المدخلات المطلوبة (أو اضغط Enter لقبول الإعدادات الافتراضية).

يقوم هذا بنشر تطبيقنا على AWS باستخدام Amazon API Gateway و AWS Lambda. يأخذ هذا الأمر مخرجات النشر التي بنيناها باستخدام الأمر sam build، ويقوم بتعبئتها ورفعها إلى سلة Amazon S3 التي أنشأتها AWS SAM CLI، ثم ينشر التطبيق باستخدام AWS CloudFormation.


واجهة API للأخبار اليومية (daily-news API) في API Gateway

دالة Lambda للأخبار اليومية (daily-news Lambda Function)
يمكننا الآن محاولة الوصول إلى الواجهة البرمجية باستخدام عنوان URL لنقطة النهاية المقدم أعلاه.

كيفية تنظيف الموارد
يمكننا استخدام الأمر aws cloudformation delete-stack لحذف مكدس AWS CloudFormation جنبًا إلى جنب مع جميع الموارد التي أنشأها عندما قمنا بتشغيل الأمر sam deploy.

الخلاصة التقنية
تهانينا! لقد قمت للتو بنشر تطبيق لا مركزي بالكامل على AWS باستخدام AWS SAM ولغة جافا. على الرغم من أن العملية تطلبت جهدًا أكبر قليلاً مقارنة بـ AWS Chalice، إلا أنها لم تكن معقدة بشكل مفرط. لقد أظهر هذا الدليل قوة SAM في تبسيط دورة حياة تطوير التطبيقات اللا مركزية، من الإنشاء والاختبار المحلي إلى النشر والإدارة. إن القدرة على محاكاة بيئة Lambda محليًا باستخدام Docker هي ميزة لا تقدر بثمن تسرّع عملية التطوير بشكل كبير. يمثل هذا النهج خطوة مهمة نحو بناء تطبيقات قابلة للتوسع، عالية الأداء، وفعالة من حيث التكلفة في بيئة AWS السحابية. يمكنك الآن المضي قدمًا وإجراء أي تعديلات على ملف App.java الخاص بك وإعادة تشغيل sam deploy لإعادة نشر تغييراتك بسهولة.