"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > Turbocharge Java Microservices مع Quarkus وGraalVM Native Image

Turbocharge Java Microservices مع Quarkus وGraalVM Native Image

تم النشر بتاريخ 2024-09-03
تصفح:867

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

ما هي الصورة الأصلية GraalVM؟

تعد GraalVM Native Image إحدى الميزات الرئيسية لـ GraalVM، وهو وقت تشغيل عالي الأداء يوفر الدعم لمختلف لغات البرمجة وأنماط التنفيذ. على وجه التحديد، تسمح لك GraalVM Native Image بتجميع تطبيقات Java مسبقًا إلى ملفات تنفيذية أصلية مستقلة، مما يتجاوز الحاجة إلى جهاز Java الظاهري (JVM) أثناء وقت التشغيل. ينتج عن هذا الأسلوب المبتكر ملفات قابلة للتنفيذ تظهر أوقات بدء تشغيل فورية تقريبًا وتقلل بشكل كبير من استهلاك الذاكرة مقارنة بنظيراتها التقليدية في JVM. تم تصميم هذه الملفات التنفيذية الأصلية بدقة، وتحتوي فقط على الفئات الأساسية والأساليب والمكتبات التابعة التي لا غنى عنها لوظائف التطبيق. وبعيدًا عن براعتها التقنية، تظهر GraalVM Native Image كحل استراتيجي له آثار بعيدة المدى. فهو لا يتغلب على التحديات التقنية فحسب، بل يقدم أيضًا حالة مالية مقنعة. من خلال تسهيل تطوير تطبيقات Java الأصلية السحابية الفعالة والآمنة والقابلة للتطوير على الفور، تصبح GraalVM فعالة في تحسين استخدام الموارد وتعزيز فعالية التكلفة. في جوهرها، تلعب دورًا محوريًا في رفع الأداء والكفاءة المالية للحلول البرمجية في البيئات الديناميكية المعاصرة.

التحديات الفنية والآثار المالية

1. آثار ذاكرة كبيرة

التأثير الفني
غالبًا ما تتحمل الخدمات التقليدية المستندة إلى JVM حملًا كبيرًا للذاكرة بسبب تحميل الفئات والبيانات الوصفية للفئات المحملة.


الحالة المالية
يؤدي ارتفاع استهلاك الذاكرة إلى زيادة تكاليف البنية التحتية. تؤدي إزالة GraalVM للبيانات التعريفية للفئات المحملة والتحسينات الأخرى إلى استخدام أكثر كفاءة للموارد، مما يؤدي إلى توفير محتمل في التكاليف.

2. أوقات البدء الممتدة

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


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

3. استخدام عالي لوحدة المعالجة المركزية

التأثير الفني
غالبًا ما تحرق أجهزة JVM التقليدية دورات وحدة المعالجة المركزية للتوصيف والتجميع في الوقت المناسب (JIT) أثناء بدء التشغيل.


الحالة المالية
يؤدي الاستخدام المفرط لوحدة المعالجة المركزية إلى زيادة تكاليف البنية التحتية السحابية. يساهم تجنب GraalVM للتوصيف وأعباء JIT بشكل مباشر في تقليل استهلاك وحدة المعالجة المركزية، مما يترجم إلى توفير محتمل في التكاليف في استخدام السحابة.

معالجة مشكلة البداية الباردة

غالبًا ما تواجه الخدمات الصغيرة، خاصة في البيئات التي لا تحتوي على خادم أو في حاويات، مشكلة البداية الباردة، مما يؤثر على أوقات الاستجابة وتجربة المستخدم. يعالج GraalVM هذا التحدي من خلال تنفيذ العديد من التحسينات:

1. لا يوجد تحميل إضافي للفصل الدراسي

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

2. إزالة التعليمات البرمجية المفسرة

تعتمد أجهزة Java الافتراضية التقليدية على وضع التنفيذ المفسر قبل تطبيق التحويل البرمجي Just-In-Time (JIT). يمكن أن يساهم هذا في تأخير بدء التشغيل وزيادة استخدام وحدة المعالجة المركزية. لا تحتوي الملفات التنفيذية الأصلية على تعليمات برمجية مفسرة، مما يساهم في زيادة سرعة بدء التشغيل.

3. لا توجد ملفات تعريف وJIT-ing النفقات العامة

يتجاوز GraalVM الحاجة إلى تشغيل مترجم Just-In-Time (JIT)، مما يقلل من استخدام وحدة المعالجة المركزية أثناء بدء التشغيل.

4. إنشاء كومة الصور في وقت البناء

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

أظهرت أداة الصور الأصلية لـ Oracle GraalVM أوقات بدء تشغيل أسرع بحوالي 100 مرة من التطبيقات التقليدية المستندة إلى JVM. يوضح الرسم البياني أدناه الانخفاض الكبير في متطلبات ذاكرة وقت التشغيل، ويعرض كفاءة GraalVM مقارنة بـ HotSpot(الشكل 1).

Turbocharge Java Microservices with Quarkus and GraalVM Native Image

الشكل 1 – تشغيل الملفات التنفيذية الأصلية على الفور تقريبًا (Oracle.com)


تحقيق بصمة ذاكرة أصغر حجما

يساهم GraalVM في تقليل آثار الذاكرة من خلال التحسينات التالية:

1. لا توجد بيانات وصفية للفئات المحملة

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

2. لا توجد بيانات ملفات تعريف أو تحسينات JIT

نظرًا لأن الكود الثانوي موجود بالفعل في الكود الأصلي، فإن GraalVM يلغي الحاجة إلى جمع بيانات ملفات التعريف لتحسينات JIT، مما يقلل من حمل الذاكرة.

3. تقنية العزل

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

بشكل عام، يستهلك ما يصل إلى 5 مرات ذاكرة أقل مقارنة بالعمل على JVM(الشكل 2)

Turbocharge Java Microservices with Quarkus and GraalVM Native Image

الشكل 2 - ذاكرة الملفات التنفيذية الأصلية مقارنة بـ Go أو Java HotSpot(oracle.com)


في الختام، توفر أداة الصور الأصلية لـ GraalVM حلاً تحويليًا للتحديات التي تطرحها الخدمات الصغيرة، ومعالجة وقت بدء التشغيل، وبصمة الذاكرة، ومخاوف استخدام وحدة المعالجة المركزية. من خلال اعتماد GraalVM، يمكن للمطورين إنشاء تطبيقات Java سحابية لا تتسم بالكفاءة والأمان فحسب، بل توفر أيضًا تجربة مستخدم فائقة.

جافا الأصلية مع Quarkus

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

قبل الشروع في أي أسلوب لإنشاء صورة أصلية، من الضروري إعداد ملف التعريف الأصلي المناسب في ملف pom.xml الخاص بك. أضف الملف الشخصي التالي:

nativenative

إنتاج ملف تنفيذي أصلي باستخدام GraalVM المثبت

تحقق من إصدار GraalVM الخاص بك باستخدام الأمر التالي:

./gu info native-image

سيعرض هذا الأمر إصدار GraalVM المثبت:

Downloading: Component catalog from www.graalvm.org
Filename : https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.0/native-image-installable-svm-java19-linux-amd64-22.3.0.jar
Name     : Native Image
ID       : native-image
Version  : 22.3.0
GraalVM  : 22.3.0
Stability: Experimental
Component bundle native-image cannot be installed
        - The same component Native Image (org.graalvm.native-image[22.3.0.0/55b341ca1bca5219aafa8ed7c8a2273b81d184dd600d8261c837fc32d2dedae5]) is already installed in version 22.3.0

ولإنشاء ملف تنفيذي أصلي، استخدم:

./mvnw install -Dnative

تنشئ هذه الأوامر ملفًا ثنائيًا *-runner في الدليل الهدف، مما يسمح لك بتشغيل الملف القابل للتنفيذ الأصلي:

./target/*-runner

إنشاء ملف تنفيذي أصلي بدون تثبيت GraalVM

إذا كان تثبيت GraalVM محليًا يشكل تحديات، فيمكن استخدام إنشاء داخل الحاوية:

./mvnw install -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=graalvm

يبدأ هذا الأمر الإنشاء داخل حاوية Docker ويوفر ملف الصورة الضروري. يمكنك بعد ذلك بدء التطبيق بـ:

./target/*-runner

في الحالات التي يكون فيها بناء الصورة الأصلية أمرًا صعبًا، يوفر فريق RedHat توزيعًا متخصصًا لـ GraalVM مصممًا لإطار عمل Quarkus يسمى Mandrel. شياق يبسط
GraalVM، مع التركيز فقط على إمكانات الصورة الأصلية الضرورية لتطبيقات Quarkus. لاستخدام الماندريل، اتبع الخطوات التالية:

  1. تحديد إصدار Mandrel المناسب لمستودع Mandrel

  2. قم بتعيين إصدار Mandrel في ملف application.properties الخاص بك:

quarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-mandrel-builder-image:23.0.1.2-Final-java17

3. قم بتشغيل أمر بناء Maven:

./mvnw clean install -Pnative

إنشاء حاوية يدويًا

بالنسبة لأولئك الذين يفضلون التحكم اليدوي في إنشاء الحاوية، يمكن استخدام بناء Docker متعدد المراحل.

FROM quay.io/quarkus/ubi-quarkus-mandrel-builder-image:23.0.1.2-Final-java17 AS build
COPY --chown=quarkus:quarkus mvnw /app/mvnw
COPY --chown=quarkus:quarkus .mvn /app/.mvn
COPY --chown=quarkus:quarkus pom.xml /app/
USER quarkus
WORKDIR /app
RUN ./mvnw -B org.apache.maven.plugins:maven-dependency-plugin:3.6.1:go-offline
COPY src /app/src
RUN ./mvnw package -Dnative

FROM quay.io/quarkus/quarkus-micro-image:2.0
WORKDIR /app/
COPY --from=build /app/target/*-runner /app/application

RUN chmod 775 /app /app/application \
  && chown -R 1001 /app \
  && chmod -R "g rwX" /app \
  && chown -R 1001:root /app

EXPOSE 8080
USER 1001

CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

ينسق ملف Dockerfile هذا إنشاءًا متعدد المراحل، مما ينتج عنه صورة Docker مع تطبيق Quarkus الخاص بك. قم بتنفيذ ملف Dockerfile هذا لإنتاج صورة Docker، جاهزة لتشغيل تطبيق Quarkus الخاص بك.

ملخص

GraalVM Native Image هي تقنية قوية يمكنها إحداث ثورة في طريقة تطوير ونشر خدمات Java الصغيرة. من خلال اعتماد GraalVM Native Image، يمكنك إنشاء خدمات صغيرة هي:

  • أسرع
  • أكثر قابلية للتطوير
  • أسهل في النشر
  • أكثر فعالية من حيث التكلفة

تعد GraalVM Native Image عامل تمكين رئيسي لتطوير Java الأصلي على السحابة ويمكن أن تساعدك على تحقيق الأداء وقابلية التوسع وتوفير التكاليف التي يتطلبها عملك.

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/yanev/turbocharge-java-microservices-with-quarkus-and-graalvm-native-image-2cb4?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3