1. نظرة عامة
يوفّر Spring Framework تجريد ResourceLoader لقراءة الملفات وكتابتها بسهولة من مصادر مختلفة، مثل نظام الملفات أو مسار الفئة أو الويب. ما عليك سوى تحديد معرّف URI للمورد باستخدام بادئة البروتوكول المعروفة. على سبيل المثال، للوصول إلى ملف في نظام الملفات المحلي، عليك تحديد معرّف URI مثل file:/data/config.yaml.
ستكتب تطبيق Spring Boot سيصل إلى الملفات المخزّنة في Cloud Storage باستخدام تجريد Spring Resource وبادئة البروتوكول gs:.
يمكنك إجراء ذلك باستخدام Cloud Shell وأداة سطر الأوامر gcloud في Cloud SDK.
المواضيع التي ستتعرّف عليها
- كيفية استخدام أداة بدء تشغيل Spring Boot في Cloud Storage
- كيفية الوصول إلى الملفات في Cloud Storage باستخدام Spring
- كيفية استخدام تجريدَي
ResourceوWritableResourceفي Spring
المتطلبات
- مشروع على Google Cloud
- متصفّح، مثل Google Chrome
- الإلمام بمحرّرات النصوص العادية على Linux، مثل Vim وEmacs وGNU Nano
كيف ستستخدم الدرس التطبيقي؟
ما مدى رضاك عن تجربتك في إنشاء تطبيقات الويب المستندة إلى HTML وCSS؟
ما مدى رضاك عن تجربتك في استخدام خدمات Google Cloud؟
2. الإعداد والمتطلبات
إعداد البيئة ذاتية السرعة
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب.)
احفظ رقم تعريف المشروع، وهو اسم فريد لجميع المشاريع على Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، لذا يُرجى اختيار اسم آخر). سيُشار إليه لاحقًا في هذا الدرس التطبيقي باسم PROJECT_ID.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.
من المفترَض ألا تتكبّد تكلفة كبيرة، إن وُجدت، عند إكمال هذا الدرس التطبيقي. احرص على اتّباع أي تعليمات في قسم "التنظيف" الذي يقدّم لك إرشادات حول كيفية إيقاف الموارد حتى لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي. يصبح المستخدمون الجدد في Google Cloud مؤهّلين للاستفادة من برنامج الإصدار التجريبي المجاني بقيمة 300 دولار أمريكي.
Cloud Shell
ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل على Google Cloud.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.
إذا لم يسبق لك بدء Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف هذه البيئة. في هذه الحالة، انقر على متابعة (ولن تظهر لك هذه الشاشة مرة أخرى). في ما يلي شكل هذه الشاشة التي تظهر مرة واحدة:
يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.
يتم تحميل هذا الجهاز الافتراضي مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه البيئة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل على Google Cloud، ما يحسّن بشكل كبير أداء الشبكة والمصادقة. يمكنك إكمال معظم أعمالك في هذا الدرس التطبيقي، إن لم يكن كلّها، باستخدام متصفّح أو جهاز Chromebook فقط.
بعد الاتصال بـ Cloud Shell، من المفترَض أن تلاحظ أنّه تمّت مصادقتك وأنّ المشروع تم ضبطه على رقم تعريف مشروعك.
- شغِّل الأمر التالي في Cloud Shell للتأكّد من أنّك مصادق:
gcloud auth list
ناتج الأمر
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
ناتج الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
ناتج الأمر
Updated property [core/project].
3. إنشاء ملف في Cloud Storage
بعد تشغيل Cloud Shell، يمكنك البدء في إنشاء الملفات ونقلها إلى Cloud Storage.
أنشِئ ملفًا باسم my-file.txt:
$ echo "Hello World from GCS" > my-file.txt
بعد ذلك، أنشِئ حزمة فريدة جديدة في Cloud Storage وانقل الملف إليها باستخدام gsutil.
$ BUCKET=spring-bucket-$USER $ gsutil makebucket gs://$BUCKET $ gsutil copy my-file.txt gs://$BUCKET
انتقِل إلى متصفّح التخزين في Cloud Storage وتأكَّد من وجود الحزمة والملف.
4. إعداد تطبيق Spring Boot
ابدأ كتابة التطبيق باستخدام سطر الأوامر لإنشاء تطبيق Spring Boot جديد باستخدام Spring Initializr:
$ curl https://start.spring.io/starter.tgz \ -d type=maven-project \ -d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -
يُرجى العِلم أنّ Initializr سيضيف تلقائيًا spring-boot-starter-web وspring-cloud-gcp-starter-storage إلى الاعتماديات في pom.xml لتطبيق النموذج.
انتقِل إلى دليل تطبيق النموذج:
$ cd spring-gcs
تأكَّد من ضبط JAVA_HOME على إصدار JDK الصحيح:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
أنشِئ التطبيق وشغِّله باستخدام Maven.
$ ./mvnw spring-boot:run
سيبدأ التطبيق في الاستماع على المنفذ 8080. افتح علامة تبويب جديدة في Cloud Shell وشغِّل curl للوصول إلى التطبيق.
$ curl localhost:8080
من المفترَض أن تحصل على استجابة 404 لأنّ التطبيق لا ينفّذ أي إجراء مفيد بعد.
عُد إلى علامة تبويب Cloud Shell السابقة التي يتم فيها تشغيل التطبيق وأوقِفه باستخدام Control+C (Command+C على أجهزة Macintosh).
5. قراءة الملف في Cloud Storage
عدِّل تطبيق Spring Boot للوصول إلى my-file.txt، وهو الملف الذي سبق لك تخزينه في Cloud Storage. هدفك هو عرض محتوى الملف ببساطة عبر HTTP.
في التعليمات التالية، ستستخدم Vim لتعديل الملفات، ولكن يمكنك أيضًا استخدام Emacs أو GNU Nano أو أداة تعديل الرموز البرمجية المضمّنة في Cloud Shell:

$ cd ~/spring-gcs
أضِف وحدة تحكّم REST GcsController إلى التطبيق.
$ vi src/main/java/com/example/demo/GcsController.java
ألصِق الرمز البرمجي التالي ولا تنسَ إصلاح معرّف URI للمورد باستخدام الحزمة التي أنشأتها سابقًا. يمكنك الاطّلاع على الحزمة من خلال تشغيل الأمر echo $BUCKET.
src/main/java/com/example/demo/GcsController.java
package com.example.demo;
import java.io.IOException;
import java.nio.charset.Charset;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GcsController {
@Value("gs://REPLACE_WITH_YOUR_BUCKET/my-file.txt")
private Resource gcsFile;
@GetMapping("/")
public String readGcsFile() throws IOException {
return StreamUtils.copyToString(
gcsFile.getInputStream(),
Charset.defaultCharset());
}
}
أنشِئ التطبيق وشغِّله باستخدام Maven:
$ ./mvnw spring-boot:run
يبدأ التطبيق في الاستماع على المنفذ 8080. افتح علامة تبويب جديدة في Cloud Shell وشغِّل curl للوصول إلى التطبيق.
$ curl localhost:8080
من المفترَض أن يظهر لك الآن محتوى الملف الذي تم عرضه من التطبيق. انتقِل إلى علامة تبويب Cloud Shell السابقة التي يتم فيها تشغيل التطبيق وأوقِفه باستخدام Control+C (Command+C على أجهزة Macintosh).
6. الكتابة في الملف في Cloud Storage
لقد قرأت محتوى الملف في Cloud Storage وعرضته من خلال وحدة تحكّم Spring REST. الآن، غيِّر محتوى الملف من خلال نشر محتوى الملف الجديد على نقطة نهاية HTTP نفسها.
عليك إضافة طريقة أخرى إلى GcsController ستستجيب لطلبات HTTP POST وتكتب البيانات في ملفك في Cloud Storage. في هذه المرة، عليك تحويل Spring Resource إلى WritableResource.
عدِّل GcsController باستخدام عمليات الاستيراد الإضافية التي تحتاج إليها.
src/main/java/com/example/demo/GcsController.java
import java.io.OutputStream;
import org.springframework.core.io.WritableResource;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PostMapping;
أضِف طريقة نقطة النهاية الجديدة إلى وحدة التحكّم.
src/main/java/com/example/demo/GcsController.java
@RestController
public class GcsController {
@PostMapping("/")
String writeGcs(@RequestBody String data) throws IOException {
try (OutputStream os = ((WritableResource) gcsFile).getOutputStream()) {
os.write(data.getBytes());
}
return "file was updated\n";
}
...
}
أنشِئ التطبيق وشغِّله باستخدام Maven:
$ ./mvnw spring-boot:run
يبدأ التطبيق في الاستماع على المنفذ 8080. افتح علامة تبويب جديدة في Cloud Shell وشغِّل curl لنشر رسالة إلى التطبيق.
$ curl -d 'new message' -H 'Content-Type: text/plain' localhost:8080
من المفترَض أن يظهر لك تأكيد بأنّه تم تعديل محتوى الملف. ومع ذلك، تأكَّد من ذلك من خلال إجراء طلب GET.
$ curl localhost:8080
من المفترَض أن يظهر لك محتوى الملف المعدَّل الذي تم عرضه من التطبيق. عُد إلى علامة تبويب Cloud Shell السابقة التي يتم فيها تشغيل التطبيق وأوقِفه باستخدام Control+C (Command+C على أجهزة Macintosh).
7. تهانينا!
لقد تعلّمت كيفية استخدام تجريد Spring Resource للوصول بسهولة إلى الملفات في Cloud Storage. لقد كتبت تطبيق ويب Spring Boot يمكنه القراءة والكتابة في ملف في Cloud Storage. تعرّفت أيضًا على أداة بدء تشغيل Spring Boot في Cloud Storage التي تتيح هذه الوظيفة.
مزيد من المعلومات
- Cloud Storage
- Spring Framework على Google Cloud
- مستودع Spring على Google Cloud على GitHub
- Java على Google Cloud
الترخيص
يخضع هذا العمل للرخصة العامة Creative Commons Attribution 2.0.