A One‑Stop Guide to Splitting Microservices Using Domain‑Driven Design


Microservices Using Domain‑Driven Design

Microservices are powerful — but many teams misuse them and end up creating unnecessary complexity.

The real secret to designing meaningful microservices is Domain-Driven Design (DDD).

Instead of splitting systems by tables or CRUD operations, DDD encourages architects to split systems based on business capabilities and domain language.

In this guide we will cover:

1️⃣ What Domain-Driven Design (DDD) is
2️⃣ How to identify microservices using DDD
3️⃣ Common mistakes when splitting services
4️⃣ Myths about microservices
5️⃣ A practical checklist to validate service boundaries

All examples are explained using a real-world banking system.


🧭 How to Identify Microservices Using Domain-Driven Design

Designing microservices starts by understanding the business domain, not by drawing technical boundaries.

DDD provides a structured approach.


Step 1 — Identify Subdomains

Start by listing major business areas in the system.

For example, a core retail banking system may include:

  • Customer onboarding
  • Account opening
  • KYC & compliance
  • Payments
  • Fund transfers (NEFT / IMPS / RTGS)
  • Transaction ledger
  • Loan origination
  • Credit scoring
  • Notifications

At this stage, these are NOT microservices yet.
They are simply domain areas.


Step 2 — Convert Subdomains into Bounded Contexts

DDD introduces the concept of a Bounded Context.

A bounded context is a domain boundary where a specific language, rules, and data model apply.

A useful rule is:

“Does this domain use its own language, rules, and data?”

Example

Payments Context

Typical terms used:

  • Authorize Payment
  • Settlement
  • Limits
  • Cut-off time
  • Payment networks

Ledger Context

Typical terms used:

  • Post Entry
  • Debit / Credit rules
  • GL accounts
  • Financial reconciliation

Loans Context

Typical terms used:

  • EMI
  • Amortization
  • Loan eligibility
  • Underwriting

Each context has different terminology and rules.

Different language ⇒ Different bounded context ⇒ Different microservice.


Step 3 — Check for Independent Evolution

Another strong signal for microservices is independent change frequency.

Ask this question:

“If this service changes, will it break other services?”

Example

Payments Service

Changes frequently because of:

  • New payment networks
  • Regulatory changes
  • Transaction limits
  • Real-time settlement rules

Ledger Service

Changes rarely because it must remain:

  • Stable
  • Auditable
  • Financially accurate

Because these services evolve at different speeds, splitting them into separate services is justified.


🧩 Banking Example — From Monolith to Microservices

A typical banking monolith might look like this:

/customer
/accounts
/transactions
/loans
/payments
/ledger
/kyc
/fraud

Everything is tightly coupled inside one codebase.

DDD recommends separating them into business-aligned services.


✔ Customer Onboarding Service

Responsible for:

  • Customer creation
  • KYC verification
  • Compliance checks
  • Identity validation

✔ Accounts Service

Responsible for:

  • Savings / Current accounts
  • Account lifecycle
  • Freeze / unfreeze accounts
  • Balance validation

✔ Payments Service

Responsible for:

  • Money transfers
  • Payment network integrations
  • Payment limits
  • Real-time processing

✔ Ledger Service

Responsible for:

  • Financial postings
  • Immutable transaction records
  • Double-entry bookkeeping

This service is critical for financial consistency.


✔ Loans Service

Responsible for:

  • Loan applications
  • Approval workflows
  • EMI schedules
  • Repayments

✔ Fraud / Risk Service

Responsible for:

  • Fraud detection
  • AML rules
  • Risk scoring
  • Behavioral analysis

Each microservice should have:

  • Its own database
  • Its own domain model
  • Its own deployment lifecycle

🚫 What NOT To Do When Splitting Microservices

Many teams create microservices incorrectly.

Here are the most common mistakes.


❌ Mistake 1 — Splitting by CRUD or Database Tables

Wrong approach:

customer-service
account-table-service
transaction-table-service

Correct approach:

onboarding-service
accounts-service
payments-service

Microservices must represent business capabilities, not tables.


❌ Mistake 2 — Shared Database

If multiple services query the same database tables, you still have a monolith.

Rule:

Every microservice must own its data.


❌ Mistake 3 — Chatty Services

Example of a bad design:

Payment Service
   → Ledger Service
      → Account Service
         → Compliance Service
            → Fraud Service
               → Notification Service

All synchronous calls in one request.

This becomes a distributed failure chain.

Better approach:

Use asynchronous events where possible.


❌ Mistake 4 — Splitting Too Early

Many startups try to build microservices from day one.

Better approach:

Start with a modular monolith.

Extract services when the domain is mature.


❌ Mistake 5 — Microservices per Entity

Bad design example:

account-service
account-balance-service
account-address-service

This creates nano-services, which are extremely hard to manage.


🧨 Myths About Microservices

Let’s break some common misconceptions.


❌ Myth 1 — Microservices Must Be Tiny

False.

Microservices must be cohesive, not necessarily small.


❌ Myth 2 — One Microservice Per Database Table

This creates chaos.

Microservices represent business capabilities, not tables.


❌ Myth 3 — More Microservices = Better Architecture

Usually it means more operational complexity.


❌ Myth 4 — Microservices Improve Performance

Network calls often make systems slower than monoliths.


❌ Myth 5 — Microservices Must Be Used From Day One

Most successful systems started as monoliths.


📝 Final Checklist to Validate Microservices

Before creating a microservice, validate it using this checklist.


✅ Domain Alignment

  • Does the service represent a real business capability?
  • Does the name make sense to a banker or product manager?

✅ Autonomy

  • Own data store?
  • Independent deployment?
  • Independent scaling?

✅ Low Coupling

  • Minimal cross-service calls
  • No synchronous chain longer than 2 services

✅ High Cohesion

  • All logic relates to one domain responsibility

✅ Operational Readiness

  • Service has monitoring
  • Clear API contract
  • Clear ownership

❌ Stop Splitting If

  • Services become too small
  • Services depend heavily on each other
  • They share database tables
  • Boundaries feel artificial

🏁 Conclusion

Microservices are a tool — not a goal.

Domain-Driven Design helps architects split systems based on business capabilities, not technical layers.

In a banking system, meaningful microservices align with domains like:

  • Customer Onboarding
  • Accounts
  • Payments
  • Ledger
  • Loans
  • Fraud / Risk
  • Compliance

Following DDD ensures your architecture is:

✔ Understandable
✔ Scalable
✔ Maintainable
✔ Business-aligned


💡 Architect Tip

If your microservice name sounds like something a business stakeholder would say, you’re probably on the right path.

 

You may also like