مرحبا يا هبر!
في العام الجديد المقبل ، نخطط لتطوير موضوعات الحاوية بشكل جدي ، و
Cloud-Native Java و
Kubernetes . سيكون استمرارًا منطقيًا لهذه المواضيع باللغة الروسية هو قصة إطار عمل
Quarkus ، الذي تم بحثه بالفعل في مقال جيد عن حبري. لا تركز مقالة اليوم كثيرًا على جهاز "
Java فائق السرعة شبه الجاف" بقدر ما تركز على الآفاق التي يجلبها Quarkus إلى Enterprise.
لا تزال Java و JVM شائعة للغاية ، ولكن عند العمل مع التقنيات بدون خادم والخدمات المصغرة السحابية ، يتم استخدام Java واللغات الأخرى لـ JVM بشكل أقل وأقل ، حيث تشغل مساحة كبيرة جدًا من الذاكرة وتحمل ببطء شديد ، وهذا هو السبب في أنها ليست مناسبة ل استخدام مع الحاويات قصيرة الأجل. لحسن الحظ ، بدأ هذا الوضع يتغير حاليًا بفضل Quarkus.
مقدمة
كلما
زادت عمليات DevOps والحاويات
والتقنيات الخالية من الخوادم ، كلما وجدت أنني أكتب
رمز الحاويات الخاص بي في حاويات خفيفة الوزن أو
FaaS في Python أو JavaScript. تعد Java ثقيلة جدًا بحيث لا يمكن تشغيلها في إطار عمل بدون خادم. فيما يتعلق بالخدمات الصغيرة ، توفر JavaScript أو Python حاويات تحميل أسرع وأكثر ضغطًا ، مما يجعل Java أكثر كفاءة.
تعد بايثون وجافا سكريبت أفضل لغات لإنشاء خدمات ميكروسكوس المستندة إلى مجموعة النظراءيبلغ عمر جافا
أكثر من 20 عامًا ، وكان العالم مختلفًا تمامًا عما كان عليه الحال الآن عند إنشائه. مع ظهور JVM ، تم حل المشاكل الضخمة - تمكنا من كتابة التعليمات البرمجية مرة واحدة وتشغيلها على العديد من الأنظمة الأساسية وأنظمة التشغيل. تسمح لك الحاويات بتعبئة التطبيقات والمكتبات وموارد نظام التشغيل في حاويات منفصلة ، ويمكن أن تعمل كل حاوية في أي مكان.
أصبحت إمكانية النقل التي توفرها JVM الآن أقل أهمية . في وقت واحد ، كنا مستعدين لتحمل تكاليف إضافية لضمان قابلية النقل ، ولكن الآن قد انقضت هذه الأوقات.
أنت الآن بحاجة إلى عمل سريع بأقل قدر من التأخير والتطبيقات التفاعلية التي ستكون متاحة دائمًا . توفر الحاويات وأدوات تنظيم الحاوية مثل
Kubernetes هذه القدرات بغض النظر عن لغة البرمجة.
تأخذ الشركات التي تتحول إلى بنية microservice خدماتها المستندة إلى
الربيع مكتوبة بلغة Java ،
وتربطها بأرشيفات الجرار الثقيلة ، وتضيف
ملفات JDK وتديرها في حاوية قائمة على نظام Linux. يعمل هذا الحل ، لكن يتعين عليك التعامل مع الحاويات الثقيلة بحجم 500 ميجابايت ، والتي يتم إدخالها في حالة إمكانية الوصول لمدة تتراوح بين 10 و 30 ثانية لكل منها ؛ هذه مشكلة خطيرة بعد الترحيل ، تتحول العديد من الشركات ببطء إلى استخدام Python ، وتترك الخدمات من جانب الخادم في Java ، وفي النهاية تتوقف عند FaaS.
تحظى التقنيات الخالية من الخوادم و FaaS بشعبية كبيرة اليوم لأنها تتيح لك التركيز على وظائف الكتابة دون الحاجة إلى القلق بشأن البنية التحتية. مهما كان الأمر ، فإنها تعمل جميعها في حاويات ، لكن مزود السحابة يدير دورة حياته. أفضل جزء هو أنه بعد فترة زمنية معينة ، يتوقف الموفر تمامًا عن الحاوية ولا يستأنف عمله إلا بعد المكالمة التالية ، أي أنك تدفع فقط وقت العمل الفعلي. يمكن أن تستمر استدعاء الوظيفة الأولى لفترة أطول قليلاً من المعتاد ، وهذه هي
البداية الباردة الشهيرة. الحقيقة هي أن الحاوية تحتاج إلى تحميل أولي. لا يمثل استخدام Python أو JavaScript مشكلة كبيرة ، لكن في حالة Java ، قد يستغرق التحميل الأولي من 10 إلى 15 ثانية ، وهذه جملة واحدة من أسباب انخفاض شعبية Java. نحتاج الآن إلى
رمز يمكنه البدء ، واستكمال المهمة ، ثم التوقف . لا نريد التعامل مع العديد من سلاسل العمليات أو العمليات طويلة المدى ، فنحن بحاجة
إلى عمليات قصيرة الأجل يمكن تحميلها بسرعة كبيرة .
تقديم Quarkus
إذا كنت تقرأ المدونات الفنية أو تتابع الأخبار ، فمن المحتمل أن تعتقد أن
النموذج الذي لا يحتوي على
خادم يتولى السيطرة على العالم ، وأن الجميع يأخذونه بحماس شديد. الآن ، يمكن بدء التشغيل كتابة الوظائف وتوفيرها في السحابة كخدمة - بفضل استخدام JavaScript - وكذلك توسيع نطاقها لدعم ملايين المستخدمين ، دون الحاجة إلى إدارة البنية التحتية. صحيح ، هناك أيضًا عالم حقيقي خارج Silicon Valley: المؤسسات المالية ، والحكومة ، وتجارة التجزئة ، والعديد من الصناعات الأخرى التي تخدمها ملايين خطوط جافا ، والتي تعد مكلفة للغاية لإعادة الكتابة. لذلك ، علينا أن نعترف بحقيقة أنه في هذه الصناعات يبقى الاستمرار في استخدام الحاويات الثقيلة.
يفتح GraalVM ، وعلى وجه الخصوص ، Substrate VM ، الباب أمام المستقبل المجيد والطويل الأجل للغة Java. GraalVM عبارة عن
آلة افتراضية عالمية لتشغيل التطبيقات المكتوبة بلغات JavaScript و Python و Ruby و R ولغات JVM ، ولا سيما Java أو Scala أو Kotlin.
أروع شيء هو أن
GraalVM يسمح لك بالتجميع المسبق (في وضع AOT) إلى ملف قابل للتنفيذ الأصلي . هذا يعني أنه يمكنك ترجمة شفرة Java الخاصة بك مباشرةً إلى رمز خاص بالجهاز. لا يعمل البرنامج الناتج على Java HotSpot VM ، ولكنه يستخدم جميع المكونات الضرورية ، على وجه الخصوص ، إدارة الذاكرة ، وجدولة سلسلة الرسائل من تطبيق آخر لجهاز ظاهري يسمى Substrate VM. يتم كتابة Substrate VM بلغة Java ، ويتم تجميع التعليمات البرمجية الخاصة به إلى ملف قابل للتنفيذ الأصلي. يبدأ البرنامج الناتج بشكل أسرع ، وبالتالي ، يوفر انخفاضًا في استخدام الذاكرة مقارنةً بـ Java VM. هذا شيء عظيم ، ولكن ربما تعتقد: تجميع مبكر؟ إنه يتناقض مع الفكرة الأساسية التي تم إنشاؤها من أجل JVM ، أي استخدام التعليمات البرمجية المكتوبة مرة واحدة في كل مكان! هذا جنون !!! ومع ذلك ، فكر في نفسك: الآن لدينا حاويات ، ولا يحتاجون إلى JVM.
تحتوي تطبيقات الحاوية التقليدية التي
تم إنشاؤها باستخدام Boot Spring على مستوى إضافي من التجريد ، وهو أمر غير ضروري على الإطلاق في العالم حيث توجد Kubernetes . لديك تطبيق Java يعمل على JVM داخل الحاوية ، تظل هذه الحاوية دون تغيير ، لأن المنتج النهائي اليوم عبارة عن حاوية وليس تطبيقًا. الآن نحن نقوم بتعبئة الحاويات وليس ملفات الحرب. لذلك ،
تصبح جميع التكاليف المرتبطة باستخدام تطبيق JVM داخل الحاوية عديمة الفائدة ، وتصبح AOT قرارًا منطقيًا للغاية إذا كنت ستقوم بتعبئة تطبيقاتك في حاويات.
صحيح أن تصنيف AOT يحد بشكل خطير من القدرات الديناميكية لـ Java (فئات التحميل في وقت التشغيل ، الانعكاس ، الوكلاء ، إلخ). في الممارسة العملية ، هذا يعني أن 90 ٪ من النظام البيئي جافا لن تعمل دون تغيير. وفقًا لذلك ،
يجب أن يتكيف نظام جافا البيئي . هناك أخبار سارة: معظم هذا يمكن القيام به أثناء التجميع!
هذه هي قوة Quarkus. يستخدم GraalVM ويوفر نظامًا بيئيًا يدعم تجميع AOT في وقت البناء ؛ وبالتالي ، باستخدام جافا ، يمكنك إنشاء ثنائيات أصلية. بفضل Quarkus ، أصبح GraalVM
متاحًا لمطوري جافا .
البدء مع Quarkus
كما هو موضح أعلاه ، يوفر Quarkus تجميعًا مبكرًا لتطبيقات Java ، وينتج عن ذلك نظامًا بيئيًا لنظام Java دون الصوتي. يتميز Quarkus بالتحميل السريع للغاية - وتعود Java إلى اللعبة في مجال التطوير المستند إلى مجموعة النظراء. لسنوات ، لم تلهمني أي تكنولوجيا جديدة -
لست وحدي في هذا .
قراءة
دليل المبتدئين - وانظر لنفسك. لا تزال هناك العديد من الشركات التي تستخدم Java + JPA داخل الحاوية ، ولكن في هذا التكوين ، يمكن أن يستغرق التحميل 15 ثانية ، وفي
حالة Quarkus ، 0.005!
إحصائيات Quarkusأنت تستخدم نفس IDE والأدوات نفسها التي اعتدت عليها في عالم Spring Boot. لبناء مشروعك ، استخدم Maven أو Gradle. يمكن تشغيل المشروع مباشرة في IDE وفوق ذلك ، يتوفر إعادة تشغيل مباشر مباشر لك مع أي تغييرات ، ولا تحتاج إلى إعادة تشغيل التطبيق. Quarkus ليس Spring ، لذا إذا كنت تستخدم Spring Boot ، فسوف يتعين عليك ترحيل رمز خاص بـ Spring. لحسن الحظ ، يوفر Quarkus
مستوى من التوافق لتنفيذ تبعيات Spring ، مما يبسط العمل إلى حد كبير. إطار عمل Quarkus متوافق مع المعايير ، مما يعني سهولة النقل ودعم الشفرة الخاصة به.
عملية تطوير Quarkus
يمكن استخدام Quarkus في وضع التطوير ، والذي يشبه برنامج Spring Boot. مع ذلك يمكنك أيضا حزمة المشروع الخاص بك في جرة سميكة. هذا مناسب للغاية لاختبار وتصحيح التعليمات البرمجية الخاصة بك ، حيث يتم دعم إعادة التشغيل المباشر ؛ لكنك بحاجة إلى تجميع مقدما للدخول في الإنتاج. يتم عرض العملية برمتها في الرسم البياني التالي:

- أولاً ، قم بإنشاء التطبيق في IDE المفضل لديك ، ثم يمكنك تشغيله في وضع مطور البرامج باستخدام: "
mvnw compile quarkus:dev
" ، كما تفعل مع تطبيق Spring Boot. يمكنك أيضا تعبئته في جرة سميكة. - بمجرد الانتهاء من الخطوة السابقة والنتيجة تناسبك - أنت جاهز لإنشاء ملف Java ثنائي ، فقط قم بتشغيل: "
mvnw package -Pnative
". سيستغرق ذلك بعض الوقت ، حيث سيتم إنشاء الكود الأصلي أثناء التحويل البرمجي مقدمًا! عند اكتمال هذه الخطوة ، سيكون لديك ملف قابل للتنفيذ صغير جدًا وسريع للغاية ، لكن يمكن أن يعمل فقط على النظام الأساسي / نظام التشغيل ، أي أنه لن يتم نقله! ولكن هذا أمر طبيعي ، حيث يمكننا وضعه في حاوية - وبالتالي ضمان قابلية النقل. فيما يلي كيفية القيام بذلك: ./mvnw package -Pnative -Dnative-image.docker-build=true
4 - ونقوم بإزالة الملف القابل للتنفيذ من حاوية Docker ، أي أننا نقوم بالتجميع الأصلي داخل الحاوية وإنشاء ملف ثنائي. قد لا تعمل هذه التقنية على الكمبيوتر المحمول إذا كان نظام التشغيل الخاص به مختلفًا عن النظام الأساسي الهدف المحدد في DockerFile
إنشاؤه بواسطة Quarkus أثناء إنشاء المشروع. - بعد ذلك ، بعد أن يكون لديك ثنائي ، فقط قم بإنشاء صورة بناءً على ملف عامل ميناء.
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/quickstart
. - أخيرًا ، يمكن تشغيل التطبيق في Docker أو Kubernetes: docker
docker run -i --rm -p 8080:8080 quarkus-quickstart/quickstart
ميزات Quarkus
يحتوي Quarkus على ميزات أكثر من كود Java الأصلي.
- توحيد القدرات الحتمية والتفاعلية: يسمح لك بدمج الكود المألوف المألوف مع الكود غير المحجوب المكتوب بأسلوب تفاعلي.
- يسعد المطور : تكوين موحد ، Zero config ، إعادة التشغيل المباشر في أي وقت من الأوقات ، رمز مُبسَّط مُحسَّن لـ 80٪ من الحالات الشائعة ورمز مرن لـ 20٪ المتبقية من الحالات ، وإنشاء ملفات قابلة للتنفيذ المحلية دون أي ضجة ، الترميز المباشر.
- تحميل سريع مثير للدهشة ، وهي منطقة ذاكرة صغيرة بشكل لا يصدق (نعم ، إنها ليست فقط بحجم كومة الذاكرة المؤقتة!) ، والذي يوفر تقريبًا رأسيًا فوريًا واستخدامًا كثيفًا للغاية للذاكرة عند تنظيم حاويات على منصات مثل Kubernetes. انظر المزيد من التفاصيل .
- يقدم Quarkus إطارًا متكاملًا وسهل الاستخدام بالكامل ، مع مكتبات من الدرجة الأولى تعرفها وتحبها مضمنة في الهياكل الداعمة. مزيد من التفاصيل .
- يتم دعم مكتبات الإسبات ، JPA ، REST ، JWT ، إلخ.
- التكوينات المدعومة المنشورة في Kubernetes و OpenShift
- تتبع مفتوحة باستخدام جايجر
- Kotlin الدعم
- المراسلة مع كافكا ، الجمل ...
- وأكثر من ذلك بكثير ، راجع قائمة الامتدادات !
النظام البيئي Quarkus
باختصار ، يمكنك الآن تشغيل خدمات معاملات JPA / JTA التقليدية في حاويات خفيفة الوزن فائقة السرعة - سواء في السحابة أو في المبنى .
مثال كواركس
في هذا القسم ، دعونا نلقي نظرة مبسطة على
دليل المبتدئين لتعطيك انطباعًا عن قوة Quarkus.

تتمثل أسهل طريقة لإنشاء مشروع Quarkus جديد في فتح نافذة موجه الأوامر وتشغيل الأمر التالي فيه:
mvn io.quarkus:quarkus-maven-plugin:0.12.0:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=getting-started \ -DclassName="org.acme.quickstart.GreetingResource" \ -Dpath="/hello"
هذا يولد مشروع مخضرم مع GreetingResuce توفير نقطة النهاية / مرحبا. كما يتم إنشاء صور عامل ميناء Dockerfile للملفات الأصلية و jvm (الصور التقليدية في شكل جرة سميكة). الكود نظيف جدا وبسيط:
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
لتشغيل التطبيق ، استخدم
./mvnw compile quarkus:dev
/
./mvnw compile quarkus:dev
يتم حزم التطبيق باستخدام حزمة. / mvnw. والنتيجة هي 2 ملفات جرة:
- get-begin-1.0-SNAPSHOT.jar - يحتوي فقط على فئات وموارد المشروع. هذا هو قطعة أثرية مشتركة الناتجة عن تجميع مافن.
- get-begin-1.0-SNAPSHOT-runner.jar هو جرة قابلة للتنفيذ. لاحظ أن هذا ليس "uber-jar" ، فهناك تبعيات هنا ، يتم نسخها إلى دليل target / lib.
يمكنك بدء التطبيق باستخدام: java -jar target / get-begin-1.0-SNAPSHOT-runner.jar
ثم تحتاج إلى تنزيل وتثبيت GraalVM وتعيين متغير البيئة
GRAALVM_HOME
.
الآن يمكنك إنشاء ملف قابل للتنفيذ الأصلي باستخدام:
./mvnw package -Pnative -Dnative-image.docker-build=true
.
فيما يلي كيفية إنشاء صورة Docker:
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/quickstart
.
الآن يمكن إطلاقه باستخدام أي محرك تزامن حاوية ، إذا كنت تستخدم
minishift :
kubectl run quarkus-quickstart --image=quarkus-quickstart/quickstart:latest --port=8080 --image-pull-policy=IfNotPresent
kubectl expose deployment quarkus-quickstart --type=NodePort
هذا كل شئ! الآن لديك حاوية مع خدمة Java REST تبدأ في 0.004 ثانية!
استنتاج
الآن أفهم لماذا أنا معجب للغاية بإطار Quarkus المدعوم من Red Hat. أعتقد حقًا أنها ستغير المشهد التكنولوجي لـ Java وستوفر للمؤسسات التقليدية الكبيرة فرصة حقيقية للانتقال إلى السحابة.
Kubernetes + Knative + Quarkus يغير قواعد اللعبة في تطور موجه نحو السحابة
ويرض أي مطور جافا.
يحتوي هذا
المستودع على العديد من الأمثلة المثيرة للاهتمام!