Clean Architecture & Design Patterns in Practice · บทเรียน

สถาปัตยกรรมสะอาดในไมโครเซอร์วิส

สำรวจวิธีประยุกต์ใช้หลักการสถาปัตยกรรมสะอาดภายในไมโครเซอร์วิสแต่ละตัว เพื่อรักษาความสอดคล้องและความเป็นอิสระภายใน

บทเรียน 3 จาก 412 ขั้นตอน

สถาปัตยกรรมสะอาดในไมโครเซอร์วิส เป็นบทเรียน Clean Architecture & Design Patterns in Practice ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Clean Architecture & Design Patterns in Practice และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Clean Architecture & Design Patterns in Practice มีบทเรียนทั้งหมด 4 บทเรียน

บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ

Microservices Meet Clean Arch

Welcome! In this lesson, we'll explore how the powerful principles of Clean Architecture can be applied within individual microservices.

Microservices are small, independent services that communicate with each other. Combining them with Clean Architecture helps each service stay robust, maintainable, and truly autonomous.

Bounded Contexts & Microservices

A key concept in microservices is the Bounded Context. This means each service defines its own domain model and terminology, separate from others.

  • A microservice naturally forms a bounded context.
  • Clean Architecture provides a structured way to manage the internal complexity of this context.
  • It keeps the core business rules of the microservice isolated.

CA Inside a Microservice

Think of each microservice as having its own miniature Clean Architecture structure. The concentric circles apply internally:

  • Entities: Core business objects (e.g., User, Product).
  • Use Cases: Application-specific rules (e.g., CreateUser, PlaceOrder).
  • Interface Adapters: How the microservice interacts with the outside world (e.g., REST controllers, message queues) and its own data store (e.g., repositories).
  • Frameworks & Drivers: External tools and technologies used (e.g., Spring Boot, database drivers).

Microservice Communication Layers

For other services or clients to interact with a microservice, they typically do so through its Interface Adapters layer.

This means a microservice exposes its functionality via:

  • REST API endpoints (e.g., a UserController).
  • Message queue consumers (e.g., processing an event).
  • GraphQL endpoints.

These adapters translate external requests into calls to the microservice's internal Use Cases.

Data Ownership in Microservices

A fundamental principle of microservices is that each service owns its data. This means:

  • No shared databases between services.
  • The data persistence mechanism is an internal detail of the microservice.

Clean Architecture's Repository Pattern fits perfectly here, abstracting the actual database implementation from the core Use Cases.

Dependency Rule: Microservice Edition

The Dependency Rule is crucial: inner circles must not depend on outer circles. This holds true within a microservice.

  • Your core Entities and Use Cases should know nothing about your web framework or database.
  • This keeps your business logic truly independent and testable.
  • It allows you to swap out frameworks or databases without affecting the core.

Defining Core Contracts

Let's look at a simple example for a 'User' microservice. Here, we define the core User entity and the interfaces for our UserRepository and CreateUserUseCase.

class User {
  private String id;
  private String name;
  private String email;

  public User(String id, String name, String email) {
    this.id = id;
    this.name = name;
    this.email = email;
  }

  public String getId() { return id; }
  public String getName() { return name; }
  public String getEmail() { return email; }
}

interface UserRepository {
  User save(User user);
  User findById(String id);
}

interface CreateUserUseCase {
  User createUser(String name, String email);
}

Implementing Core Logic

Now, we implement the CreateUserUseCase, called an Interactor. It takes a UserRepository (an outer layer interface) as a dependency, adhering to the Dependency Rule.

Run this code to see how the core logic can be tested independently!

import java.util.UUID;
import java.util.HashMap;
import java.util.Map;

class User {
  private String id;
  private String name;
  private String email;

  public User(String id, String name, String email) {
    this.id = id;
    this.name = name;
    this.email = email;
  }

  public String getId() { return id; }
  public String getName() { return name; }
  public String getEmail() { return email; }
}

interface UserRepository {
  User save(User user);
  User findById(String id);
}

interface CreateUserUseCase {
  User createUser(String name, String email);
}

class InMemoryUserRepository implements UserRepository {
  private final Map<String, User> users = new HashMap<>();

  @Override
  public User save(User user) {
    users.put(user.getId(), user);
    return user;
  }

  @Override
  public User findById(String id) {
    return users.get(id);
  }
}

class CreateUserInteractor implements CreateUserUseCase {
  private final UserRepository userRepository;

  public CreateUserInteractor(UserRepository userRepository) {
    this.userRepository = userRepository;
  }

  @Override
  public User createUser(String name, String email) {
    String id = UUID.randomUUID().toString();
    User newUser = new User(id, name, email);
    return userRepository.save(newUser);
  }
}

public class Main {
  public static void main(String[] args) {
    // This simulates the wiring and interaction in a microservice
    UserRepository repo = new InMemoryUserRepository();
    CreateUserUseCase useCase = new CreateUserInteractor(repo);

    User user1 = useCase.createUser("Alice", "alice@example.com");
    System.out.println("Created User: " + user1.getName());

    User foundUser = repo.findById(user1.getId());
    System.out.println("Found User Email: " + foundUser.getEmail());
  }
}

The API Adapter Role

In a real microservice, a UserController (part of the Interface Adapters layer) would receive an HTTP request, map it to a DTO, call the CreateUserUseCase, and then return an HTTP response.

This controller depends on the Use Case, but the Use Case doesn't depend on the controller.

Why This Approach Works

Applying Clean Architecture to microservices offers significant benefits:

  • High Cohesion: Each microservice's core logic is tightly focused.
  • Loose Coupling: Core logic is decoupled from frameworks, databases, and even other services.
  • Independent Deployment: Changes to the UI or database don't affect core business rules.
  • Enhanced Testability: Business logic can be unit-tested without needing a database or web server.
  • Maintainability: Easier to understand, modify, and extend over time.

Check Your Understanding

Why is applying Clean Architecture principles within individual microservices particularly beneficial?

Microservices & CA: Summary

In this lesson, we've seen how Clean Architecture provides a robust internal structure for individual microservices. By adhering to the Dependency Rule and separating concerns into layers, each microservice becomes:

  • Highly autonomous
  • Easily testable
  • Flexible and maintainable

This combination ensures that your microservice ecosystem remains agile and resilient.

เริ่มต้นได้ฟรี

เรียนรู้ Clean Architecture & Design Patterns in Practice ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
12
บทเรียน
48

คำถามที่พบบ่อย

บทเรียน “สถาปัตยกรรมสะอาดในไมโครเซอร์วิส” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “สถาปัตยกรรมสะอาดในไมโครเซอร์วิส” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Clean Architecture & Design Patterns in Practice ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Clean Architecture & Design Patterns in Practice มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “สถาปัตยกรรมสะอาดในไมโครเซอร์วิส”

สำรวจวิธีประยุกต์ใช้หลักการสถาปัตยกรรมสะอาดภายในไมโครเซอร์วิสแต่ละตัว เพื่อรักษาความสอดคล้องและความเป็นอิสระภายใน คุณปฏิบัติ Clean Architecture & Design Patterns in Practice ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Clean Architecture & Design Patterns in Practice หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Clean Architecture & Design Patterns in Practice บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “สถาปัตยกรรมสะอาดในไมโครเซอร์วิส” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Clean Architecture & Design Patterns in Practice นี้ได้ไหม

ได้ บทเรียน Clean Architecture & Design Patterns in Practice ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การจัดการข้อกังวลที่ครอบคลุมหลายส่วน
  2. สถาปัตยกรรมสะอาดที่ขับเคลื่อนด้วยเหตุการณ์
  3. สถาปัตยกรรมสะอาดในไมโครเซอร์วิส
  4. CQRS ภายในสถาปัตยกรรมสะอาด
← กลับไปที่ Clean Architecture & Design Patterns in Practice