Spring WebFlux لجافا: الدليل الكامل للبرمجة التفاعلية
1. ما هو ولماذا تحتاجه
Spring WebFlux هو إطار عمل ويب تفاعلي (Reactive) ضمن نظام Spring Framework 5+، ويُعد بديلاً قوياً لـ Spring MVC التقليدي. على عكس النهج التقليدي الذي يحجب (blocking) الخيوط، حيث يتم معالجة كل طلب HTTP في خيط منفصل، يعتمد WebFlux على نموذج إدخال/إخراج غير متزامن وغير محجوب (non-blocking). هذا يسمح بمعالجة آلاف الاتصالات المتزامنة بأقل عدد ممكن من الخيوط، وهو أمر بالغ الأهمية للأنظمة عالية التحميل، والخدمات المصغرة (Microservices)، وتطبيقات الوقت الفعلي.
لماذا تحتاج Spring WebFlux؟ في عالمنا اليوم، حيث يتزايد عدد المستخدمين والأجهزة بشكل هائل، تواجه الحاويات التقليدية (مثل Tomcat و Jetty) مشكلة "C10K" (معالجة 10,000 اتصال متزامن). كل خيط يستهلك ذاكرة (حوالي 1 ميجابايت للمكدس)، ومع 10,000 خيط، يصل استهلاك الذاكرة إلى 10 جيجابايت للمكدسات فقط. يحل WebFlux هذه المشكلة باستخدام نموذج التدفقات التفاعلية (Reactive Streams)، حيث يمكن لخيط واحد معالجة العديد من الطلبات، والتبديل بينها حسب جاهزية البيانات.
يدعم WebFlux نوعين من الخوادم: Netty (الموصى به، غير محجوب) و Servlet 3.1+ (Tomcat, Jetty, Undertow). يتكامل بشكل كامل مع مشروع Reactor (Mono و Flux) ويمكنه استخدام أسلوب التوجيه الوظيفي (Router Functions) إلى جانب التعليقات التوضيحية @Controller. وهذا يجعله الخيار الأمثل لبناء واجهات برمجة تطبيقات عالية الأداء، وخوادم الأحداث (SSE)، وتطبيقات WebSocket، والخدمات المصغرة مع قواعد البيانات التفاعلية (MongoDB Reactive, R2DBC).
2. التثبيت
لا يتم تثبيت Spring WebFlux عبر pip أو npm، لأنه مكتبة لجافا. لاستخدامه، يجب إضافة التبعية (dependency) إلى مشروعك. فيما يلي الأوامر الدقيقة لـ Maven و Gradle.
Maven (pom.xml)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>3.2.0</version> <!-- استخدم أحدث إصدار -->
</dependency>
Gradle (build.gradle)
implementation 'org.springframework.boot:spring-boot-starter-webflux:3.2.0'
إذا كنت تستخدم Spring Initializr (start.spring.io)، فما عليك سوى اختيار "Spring Reactive Web" في قسم التبعيات. للعمل غير المحجوب مع قواعد البيانات، أضف أيضاً:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
3. البداية السريعة — مثال عملي بسيط
قم بإنشاء وحدة تحكم REST تفاعلية بسيطة تُرجع ترحيباً. يوضح هذا المثال الإعداد الأساسي لـ WebFlux باستخدام التعليقات التوضيحية.
// MainApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
// GreetingController.java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
@RestController
public class GreetingController {
@GetMapping("/hello")
public Mono<String> sayHello() {
return Mono.just("مرحباً من Spring WebFlux!");
}
}
قم بتشغيل التطبيق وافتح http://localhost:8080/hello. ستظهر لك الرسالة "مرحباً من Spring WebFlux!". لاحظ أن الدالة تُرجع Mono<String>، وليس مجرد