0Pricing
Spring Boot 4 Microservices & REST APIs · درس

دمج الخدمات المصغّرة المعتمد على الأحداث

صمّم أنماط الاتصال غير المتزامن بين الخدمات المصغّرة ونفّذها باستخدام Kafka.

دمج الخدمات المصغّرة المعتمد على الأحداث درس مجاني في Spring Boot 4 Microservices & REST APIs على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Spring Boot 4 Microservices & REST APIs، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Spring Boot 4 Microservices & REST APIs 3 دروس في المجموع.

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

Event-Driven Microservices

Welcome to Event-Driven Microservice Integration! In this lesson, we'll learn how microservices can communicate asynchronously using events.

An event-driven architecture (EDA) is a software design pattern where services communicate by producing and consuming "events." These events are records of something that happened.

This approach helps create highly decoupled, scalable, and resilient systems.

Benefits of Asynchronous

Why choose event-driven communication over direct API calls (synchronous)?

  • Decoupling: Services don't need to know about each other's existence. They only care about events.
  • Resilience: If a consuming service is down, the events are stored and processed later, preventing cascading failures.
  • Scalability: Producers can publish events without waiting for consumers, and multiple consumers can process events in parallel.

Kafka as Event Bus

Apache Kafka acts as a central "event bus" or message broker in many event-driven architectures.

Producers send events to Kafka topics, and consumers read events from these topics. Kafka stores these events durably, ensuring no data loss.

This allows services to communicate without direct connections, simplifying their design and deployment.

An OrderCreated Event

An event is a lightweight message indicating that something significant has occurred. It typically includes the event type, a timestamp, and relevant data.

Let's define a simple OrderCreatedEvent that our OrderService might publish when a new order is placed.

public class OrderCreatedEvent {
  private String orderId;
  private String customerId;
  private double amount;
  private long timestamp;

  public OrderCreatedEvent(String orderId, String customerId, double amount) {
    this.orderId = orderId;
    this.customerId = customerId;
    this.amount = amount;
    this.timestamp = System.currentTimeMillis();
  }

  public String getOrderId() { return orderId; }
  public String getCustomerId() { return customerId; }
  public double getAmount() { return amount; }
  public long getTimestamp() { return timestamp; }

  @Override
  public String toString() {
    return "OrderCreatedEvent{" +
           "orderId='" + orderId + '\'' +
           ", customerId='" + customerId + '\'' +
           ", amount=" + amount +
           ", timestamp=" + timestamp +
           '}';
  }
}

Order Service as Producer

Our OrderService is responsible for creating new orders. Once an order is successfully created, it publishes an OrderCreatedEvent to a Kafka topic.

This event can then be consumed by other services, like an InventoryService, without the OrderService needing to know anything about them.

// Simulates a Kafka producer component
public class OrderProducer {
  public void sendOrderCreatedEvent(OrderCreatedEvent event) {
    // In a real Spring Boot app, this would use KafkaTemplate.send()
    System.out.println("Producer: Sending event to Kafka topic 'orders':");
    System.out.println("  " + event.toString());
  }
}

Try the Producer

Here's how you'd typically trigger the producer logic. Run this code to see the simulated event being "sent."

// Represents an event when an order is created
class OrderCreatedEvent {
  private String orderId;
  private String customerId;
  private double amount;
  private long timestamp;

  public OrderCreatedEvent(String orderId, String customerId, double amount) {
    this.orderId = orderId;
    this.customerId = customerId;
    this.amount = amount;
    this.timestamp = System.currentTimeMillis();
  }

  public String getOrderId() { return orderId; }
  public String getCustomerId() { return customerId; }
  public double getAmount() { return amount; }
  public long getTimestamp() { return timestamp; }

  @Override
  public String toString() {
    return "OrderCreatedEvent{" +
           "orderId='" + orderId + '\'' +
           ", customerId='" + customerId + '\'' +
           ", amount=" + amount +
           ", timestamp=" + timestamp +
           '}';
  }
}

// Simulates a Kafka producer component
class OrderProducer {
  public void sendOrderCreatedEvent(OrderCreatedEvent event) {
    System.out.println("Producer: Sending event to Kafka topic 'orders':");
    System.out.println("  " + event.toString());
  }
}

public class Main {
  public static void main(String[] args) {
    System.out.println("Order Service simulation started.");

    OrderProducer producer = new OrderProducer();

    // Simulate an order creation
    OrderCreatedEvent event = new OrderCreatedEvent("ORD-001", "CUST-123", 99.99);
    producer.sendOrderCreatedEvent(event);

    System.out.println("Order Service simulation finished.");
  }
}

Inventory Service as Consumer

Our InventoryService needs to know when new orders are placed so it can update stock levels. It listens for OrderCreatedEvents from the Kafka topic.

When an event arrives, the consumer processes it, perhaps by deducting items from inventory or initiating a fulfillment process.

// Simulates a Kafka consumer component
public class InventoryConsumer {
  public void listenOrderCreatedEvent(OrderCreatedEvent event) {
    // In a real Spring Boot app, this would be an @KafkaListener method
    System.out.println("Consumer: Received event from Kafka topic 'orders':");
    System.out.println("  " + event.toString());
    System.out.println("  Updating inventory for order " + event.getOrderId());
  }
}

Try the Consumer

This code simulates the InventoryConsumer listening for an event. In a real scenario, this would run continuously, processing incoming events.

// Represents an event when an order is created
class OrderCreatedEvent {
  private String orderId;
  private String customerId;
  private double amount;
  private long timestamp;

  public OrderCreatedEvent(String orderId, String customerId, double amount) {
    this.orderId = orderId;
    this.customerId = customerId;
    this.amount = amount;
    this.timestamp = System.currentTimeMillis();
  }

  public String getOrderId() { return orderId; }
  public String getCustomerId() { return customerId; }
  public double getAmount() { return amount; }
  public long getTimestamp() { return timestamp; }

  @Override
  public String toString() {
    return "OrderCreatedEvent{" +
           "orderId='" + orderId + '\'' +
           ", customerId='" + customerId + '\'' +
           ", amount=" + amount +
           ", timestamp=" + timestamp +
           '}';
  }
}

// Simulates a Kafka consumer component
class InventoryConsumer {
  public void listenOrderCreatedEvent(OrderCreatedEvent event) {
    System.out.println("Consumer: Received event from Kafka topic 'orders':");
    System.out.println("  " + event.toString());
    System.out.println("  Updating inventory for order " + event.getOrderId());
  }
}

public class Main {
  public static void main(String[] args) {
    System.out.println("Inventory Service simulation started.");

    InventoryConsumer consumer = new InventoryConsumer();

    // Simulate receiving an event (e.g., from Kafka)
    // This event would typically come from a Producer
    OrderCreatedEvent receivedEvent = new OrderCreatedEvent("ORD-001", "CUST-123", 99.99);
    consumer.listenOrderCreatedEvent(receivedEvent);

    System.out.println("Inventory Service simulation finished.");
  }
}

Key Considerations

When working with event-driven systems, two key concepts are important:

  • Eventual Consistency: Data across different services might not be instantly consistent. It will become consistent "eventually."
  • Idempotency: Consumers should be designed to handle duplicate events gracefully. Processing the same event multiple times should not change the outcome.

These are crucial for building robust asynchronous microservices.

Integration Check

Which of the following are key benefits of using an event-driven architecture for microservice integration compared to direct synchronous API calls?

Event-Driven Recap

Great job! In this lesson, you've learned about event-driven microservice integration:

  • The benefits of asynchronous communication like decoupling, resilience, and scalability.
  • How Kafka serves as an event bus.
  • The roles of producer and consumer microservices in publishing and processing events.
  • Important concepts like eventual consistency and idempotency.

You're now ready to design more robust and scalable microservice interactions!

الأسئلة الشائعة

هل درس «دمج الخدمات المصغّرة المعتمد على الأحداث» مجاني؟

نعم — نص درس «دمج الخدمات المصغّرة المعتمد على الأحداث» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Spring Boot 4 Microservices & REST APIs، انتقل إلى CoddyKit PRO. تتضمن دورة Spring Boot 4 Microservices & REST APIs 3 دروس في المجموع.

ماذا ستتعلم في «دمج الخدمات المصغّرة المعتمد على الأحداث»؟

صمّم أنماط الاتصال غير المتزامن بين الخدمات المصغّرة ونفّذها باستخدام Kafka. تتمرن على Spring Boot 4 Microservices & REST APIs مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Spring Boot 4 Microservices & REST APIs؟

لا تُشترط خبرة سابقة. Spring Boot 4 Microservices & REST APIs على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.

كم من الوقت يستغرق درس «دمج الخدمات المصغّرة المعتمد على الأحداث»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Spring Boot 4 Microservices & REST APIs هذا؟

نعم. كل درس في Spring Boot 4 Microservices & REST APIs يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مقدمة إلى منتجي Kafka
  2. إنشاء مستهلكي Kafka
  3. دمج الخدمات المصغّرة المعتمد على الأحداث
← العودة إلى Spring Boot 4 Microservices & REST APIs