البدء مع بوت سبرينج 3.2.0: بناء واجهة REST API للتعرف على العالم مع تكامل NoSQL

قم بالإقلاع على رحلة في أحدث التقدم في تطوير Spring Boot مع الإصدار 3.2.0 حيث نرشدك عبر إنشاء تطبيق “Hello World” أساسي. في هذا البرنامج التعليمي، يمتد تركيزنا ليتجاوز التمهيد التقليدي لـ Spring؛ نتعمق في تكوين REST API بينما ندمجها بسلاسة مع قاعدة بيانات NoSQL. Spring Boot 3.2.0، بمجموعة من الميزات الجديدة والتحسينات، يضع الأساس لاستكشاف مثير للممارسات التطويرية المعاصرة. يهدف هذا الدليل إلى المبتدئين والمطورين ذوي الخبرة، مع التأكيد على التجربة العملية في تسخير إمكانات Spring لتطبيقات جديدة صلبة. فلنبدأ رحلتنا في Spring 3.2.0، حيث البساطة والابتكار يلتقيان.

ما الجديد في Spring Boot 3.2.0

يمثل Spring Boot 3.2.0 قفزة كبيرة للأمام في تطوير Java، مطلوبًا بيئة Java 17 على الأقل وتوسيع الدعم لأحدث Java 21. يقدم هذا الإصدار العديد من الميزات التي تُعيد تصور مستوى استخدام إطار عمل Spring.

من أبرز ميزات Java هو دعم الموضوعات الافتراضية، الذي يعزز القابلية للتوسعة والاستجابة الفعالة عبر استخدام الموضوعات الخفيفة الوزن. علاوة على ذلك، يعرض Spring Boot 3.2.0 دعماً أولياً لمشروع CRaC (JVM Checkpoint Restore)، الذي يمكّن التطبيقات من استعادة حالتها بعد إعادة تشغيل JVM، مما يعزز الموثوقية والقدرة على التعافي.

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

تحسينات في القابلية للمراقبة تُدرج في جميع أنحاء الإصدار، مما يوفر للمطورين قدرات مراقبة وتتبع محسّنة لتجربة تطوير أكثر شفافية وقابلية للإدارة.

في سياق الممارسات التطويرية الحديثة، يقدم Spring Boot 3.2.0 عملاء مخصصون للعمليات RESTful (RestClient) وJDBC (JdbcClient). هذه الإضافات تحسّن اتصالات مع الخدمات الخارجية، مما يعزز قدرات التكامل.

التوافق مع Jetty 12 هو إضافة ذات أهمية كبيرة أخرى، مما يسمح للمطورين بالاستفادة من أحدث ميزات خادم الويب Jetty. Spring Boot 3.2.0 يوسّع توافقه البيئي مع دعم Apache Pulsar، مما يعمّل على توسيع قدرات الرسائل النصية في Spring لبناء تطبيقات مستندة إلى الأحداث بقوة.

سلام عليكم

تعترف بشيوع Kafka و RabbitMQ، Spring Boot 3.2.0 يعمل على دعم حزمة SSL لهذه الأنظمة الشهيرة للمعالجة الرائدة، مما يعزز موقف الأمان للتطبيقات التي تعتمد على هذه الوكلاء للرسائل.

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

في الختام، يوازن Spring Boot 3.2.0 نفسه مع أحدث إصدارات Java، ويقدم ميزات ابتكارية، ويصقل القدرات الحالية. هذا الإصدار يمكّن المطورين من بناء تطبيقات عصرية ومرنة وذات أداء عالي بثقة في المشهد المتغير باستمرار لتطوير Java.

أرني الكود

في هذه الجلسة، نبدأ في رحلة مثيرة لتطوير API البوكيمون، باستخدام قوة Spring ودمجها بسلاسة بـ HarperDB. سنركز على تنفيذ عمليات CRUD (إنشاء، قراءة، تحديث، حذف) الأساسية، مع التركيز الخاص على استخدام المعرفات (IDs) الفريدة لكل بوكيمون. في نهاية هذه الجلسة، سيكون لديك ليس فقط تطبيق Spring كامل الوظائف ولكن أيضاً API البوكيمون الخاص بك، جاهز ليتم توسيعه ودمجه في مشاريع أكبر. دعونا نغوص في عالم البوكيمون وتطوير Spring، حيث يلتقي البساطة مع الابتكار.

تأكد من أن قاعدة بيانات NoSQL الخاصة بك، HarperDB، تعمل باستخدام Docker. افتح المحطة الأولى واستخدم الأمر التالي:

Shell

 

docker run -d -e HDB_ADMIN_USERNAME=root -e HDB_ADMIN_PASSWORD=password -e HTTP_THREADS=4 -p 9925:9925 -p 9926:9926 harperdb/harperdb

يقوم هذا الأمر بسحب تصدير Docker لـ HarperDB وبدء حاوية بالتكوين المحدد. يربط خيار -p منافذ الحاوية بجهازك المحلي، مما يجعل واجهة HarperDB قابلة للوصول على http://localhost:9925.

توجه إلى Spring Initializer لإعداد تطبيقنا الخاص بـ Spring. اتبع هذه الخطوات:

  1. اختر الإعدادات المطلوبة للمشروع (مثل مستخدم Maven أو Gradle، إصدار Java).
  2. أضف المركبات: اختر “Spring Web” من قائمة المركبات.
  3. انقر على “Generate” لتنزيل المشروع كملف ZIP.

استخرج ملف ZIP المُنزل ثم استيراد المشروع إلى بيئة التطوير المتكاملة المفضلة لديك، مثل IntelliJ IDEA أو Eclipse.

الآن بعد إعداد تطبيقنا الخاص بـ Spring، الخطوة المهمة التالية هي دمجه مع HarperDB. لتحقيق ذلك، يجب إضافة مركبة HarperDB في مشروعنا. أضف المركبة التالية باستخدام Maven إلى ملف pom.xml الخاص بك:

XML

 

<dependency>
    <groupId>io.harperdb</groupId>
    <artifactId>harpderdb-core</artifactId>
    <version>0.0.1</version>
</dependency>

بعد إضافة المركبة، دعنا ننتقل إلى الكود. سنقوم بإنشاء فئة تكوين في Spring، تحت إسم HarperDB، لإدارة الاتصال وجعله جزءًا لا يتجزأ من حاوية Inversion of Control (IoC) في Spring.

Java

 

@Configuration
public class HarperDB {

    @Bean
    public Template template() {
        Server server = ServerBuilder.of("http://localhost:9925")
                .withCredentials("root", "password");
        server.createDatabase("pokemons");
        server.createTable("pokemon").id("id").database("pokemons");
        return server.template("pokemons");
    }
}

هذه الفئة التوجيهية، المعلامة بـ @Configuration، تخلق في سبرينغ بيان أسمه template. الكائن Template هو مكون رئيسي للتفاعل مع HarperDB. نقوم بتهيئته بتفاصيل اتصال الخادم، بما في ذلك عنوان URL الخادم وبيانات الدخول. بالإضافة إلى ذلك، نقوم بإنشاء قاعدة بيانات باسم “pokemons” وجدول باسم “pokemon” بعمود “id”. هذا يضع المرحلة لتخزين كيانات Pokemon لدينا في HarperDB.

لتحسين العرض التوضيحي، سنقوم أولاً بإنشاء كيان غير قابل للتغيير باستخدام ميزة record في جافا:

Java

 

public record Pokemon(String id, String name, String location) {
}

هذه الفئة البسيطة لـ Pokemon تضم السمات الأساسية لكائن Pokemon—معرفه، اسمه، وموقعه—بطريقة غير قابلة للتغيير.

بعد ذلك، دعونا نؤسس الاتصال بقاعدة البيانات من خلال إنشاء PokemonService ليكون كجسر لـ HarperDB:

Java

 

@Service
public class PokemonService {

    private final Template template;

    public PokemonService(Template template) {
        this.template = template;
    }

    public Optional<Pokemon> findById(String id) {
        return template.findById(Pokemon.class, id);
    }

    public void save(Pokemon pokemon) {
        template.upsert(pokemon);
    }

    public void delete(String id) {
        template.delete(Pokemon.class, id);
    }
}

فئة PokemonService هي خدمة سبرينغ تتعامل مع العمليات الأساسية المتعلقة بكيانات Pokemon. يستخدم الكائن Template الذي قمنا بتكوينه سابقًا للتفاعل مع HarperDB. الطريقة findById تسترجع Pokemon بمعرفه، وتحفظ إضافة، أو تحديث Pokemon، وتحذف وتزيله من قاعدة البيانات.

أخيرًا، لننشأ PokemonController لتعريف هذه العمليات كنقاط تواصل REST:

Java

@RestController
public class PokemonController {

    private final PokemonService service;

    public PokemonController(PokemonService service) {
        this.service = service;
    }

    @GetMapping("/pokemons/{id}")
    Pokemon findById(@PathVariable String id) {
        return service.findById(id).orElseThrow(() -> new PokemonNotFoundException(id));
    }

    @PutMapping("/pokemons")
    Pokemon newPokemon(@RequestBody Pokemon pokemon) {
        service.save(pokemon);
        return pokemon;
    }

    @DeleteMapping("/pokemons/{id}")
    void deleteEmployee(@PathVariable String id) {
        service.delete(id);
    }
}

فئة PokemonController هذه معلمة بـ @RestController وتعرض ثلاث نقاط تواصل:

  • GET /pokemons/{id} يسترجع Pokemon بمعرفه.
  • PUT /pokemons يخلق Pokemon جديد أو يحدث واحد موجود.
  • DELETE /pokemons/{id} يحذف Pokemon بمعرفه.

المُتحكّم يعتمد على PokemonService للتعامل مع هذه العمليات، مما يوفّر فصلًا نظيفًا للمسؤوليّات في تطبيقنا المبني باستخدام Spring.

بوجود هذه المكوّنات، يمكن لواجهة بوكيمون API القيام بعمليات CRUD الأساسيّة باستخدام HarperDB. لا تتردّد في اختبار النّقاط الرئيسيّة ورؤية التكامل السلس بين Spring وقاعدة البيانات NoSQL في العمل!

تطبيقك المبني باستخدام Spring، المتكامل مع HarperDB ومجهز بواجهة بوكيمون API، جاهز الآن للاختبار والتنفيذ. دعونا نستكشف بعض السّيناريوهات الشائعة باستخدام أوامر curl. قبل المتابعة، تأكد من أنّ تطبيقك المبني باستخدام Spring قيد التشغيل.

إنشاء بوكيمون

Shell

 

   curl -X PUT -H "Content-Type: application/json" -d '{"id": "1", "name": "Pikachu", "location": "Forest"}' http://localhost:8080/pokemons

هذا الأمر يخلق بوكيمونًا جديدًا برقم الهوية 1، واسم بيكاتشو، والموقع الغابة.

استرداد بوكيمون حسب الرقم الهوية

Shell

 

curl http://localhost:8080/pokemons/{id}

استبدل {id} بالرقم الهوية الفعلي للبوكيمون الذي أنشأته.

تحديث بوكيمون

Shell

 

   curl -X PUT -H "Content-Type: application/json" -d '{"id": "1", "name": "Raichu", "location": "Thunderstorm"}' http://localhost:8080/pokemons

هذا الأمر يُحدّث البوكيمون الحالي برقم الهوية 1 ليحمل اسم رايتشو وموقع عاصفة شديدة.

حذف بوكيمون حسب الرقم الهوية

Shell

 

curl -X DELETE http://localhost:8080/pokemons/{id}

استبدل {id} بالرقم الهوية الفعلي للبوكيمون الذي تريد حذفه.

هذه السّيناريوهات توفّر اختبارًا شاملًا لعمليات CRUD الأساسيّة في API بوكيمونك، بدءًا من إنشاء بوكيمون. قم بتعديل الأوامر حسب الحاجة الخاصة بك وبحسب الحالة والبيانات الخاصة بك. تحياتي للاختبار!

الخاتمة

في هذا البرنامج التعليمي، استغلنا قدرات Spring Boot 3.2.0 لصياغة API باكمونو مبسط تم دمجه بشكل مثالي مع HarperDB. أدخلت أحدث إصدار من Spring ميزات رئيسية، مما زاد من قدرتنا على إنشاء تطبيقات مرنة وقابلة للتوسع.

باستخدام الكيانات غير القابلة للتغيير، Spring IoC و HarperDB، أظهرنا بساطة تطوير Java الحديث. رمز العرض التوضيحي، المتاح هنا، هو أساس لمشاريعك، جاهز للتخصيص.

للحصول على تحديثات ورؤى متعمقة، راجع مدونة Spring الرسمية. لتكون رحلتك باستخدام Spring Boot و HarperDB مليئة بالابتكار والفرحة البرمجية! سعيد البرمجة!

Source:
https://dzone.com/articles/getting-started-with-boot-spring-320-building-a-he