الوصول إلى الملفات في Cloud Storage باستخدام تجريد Spring Resource

1. نظرة عامة

يوفّر Spring Framework ResourceLoader تجريدًا لقراءة الملفات وكتابتها بسهولة من مصادر مختلفة، مثل نظام الملفات أو مسار الفئة أو الويب. ما عليك سوى تحديد معرّف الموارد المنتظم (URI) للمرجع باستخدام بادئة البروتوكول المعروفة. على سبيل المثال، للوصول إلى ملف في نظام الملفات على الجهاز، عليك تحديد معرّف موارد منتظم (URI) مثل file:/data/config.yaml.

ستكتب تطبيق Spring Boot يمكنه الوصول إلى الملفات المخزَّنة في Cloud Storage باستخدام تجريد Spring Resource وبادئة البروتوكول gs:.

يمكنك إجراء ذلك باستخدام Cloud Shell وأداة سطر الأوامر gcloud في Cloud SDK.

ما ستتعلمه

  • كيفية استخدام حزمة Cloud Storage Spring Boot starter
  • كيفية الوصول إلى الملفات في Cloud Storage باستخدام Spring
  • كيفية استخدام تجريدات Resource وWritableResource في Spring

المتطلبات

  • مشروع Google Cloud
  • متصفّح، مثل Google Chrome
  • الإلمام بأدوات تحرير النصوص العادية في Linux، مثل Vim وEmacs وGNU Nano

كيف ستستخدم هذا الدرس التطبيقي حول الترميز؟

إذن بالقراءة فقط قراءة التمارين وإكمالها

ما هو تقييمك لتجربة إنشاء تطبيقات ويب باستخدام HTML وCSS؟

مبتدئ متوسط متقن

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

مبتدئ متوسط متقدّم

2. الإعداد والمتطلبات

إعداد البيئة بالسرعة التي تناسبك

  1. سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZwci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

لن تكلفك تجربة هذا الدرس البرمجي الكثير من المال، إن وُجدت تكلفة على الإطلاق. احرص على اتّباع أي تعليمات في قسم "التنظيف" الذي ينصحك بكيفية إيقاف الموارد حتى لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

Cloud Shell

ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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

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

  1. نفِّذ الأمر التالي في 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:

cloud-editor.png

$ 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 Starter لخدمة Cloud Storage التي تتيح هذه الوظيفة.

مزيد من المعلومات

الترخيص

يخضع هذا العمل لترخيص Creative Commons Attribution 2.0 Generic License.