⏱ 19 min read
Let me start with the unpopular opinion first: most companies do not need microservices when they think they do.
They need better boundaries. Better deployment practices. Better ownership. Better engineering discipline. But “let’s move to microservices” becomes the corporate version of buying expensive running shoes and assuming you’re now an athlete.
That said, microservices are not hype either. In the right environment, they are one of the few architectural styles that actually help large organizations move faster without turning the whole platform into a fragile ball of mud. I’ve seen them work brilliantly in banking, insurance, retail, and SaaS. I’ve also seen them create a distributed disaster where every simple change requires five teams, three approvals, Kafka debugging, IAM policy updates, and a prayer.
So if you’re a beginner, here’s the practical version:
What microservices architecture actually is
Microservices architecture is a way of building software as a set of small, independently deployable services, each responsible for a specific business capability.
That’s the simple explanation. If you need the SEO sentence, there it is.
Instead of one large application handling everything—customers, payments, accounts, notifications, reporting—you split the system into services. Each service owns its own logic, usually its own data, and communicates with other services through APIs or events.
Examples in a banking context:
- Customer Service manages customer profiles
- Account Service manages account balances and account metadata
- Payments Service handles transfers and payment workflows
- Fraud Service evaluates suspicious behavior
- Notification Service sends SMS, email, push messages
- IAM / Identity Service handles authentication, authorization, tokens, roles
- Transaction Event Stream publishes business events through Kafka
The point is not “many small apps.”
The point is independent change.
If your Payments team can release fraud rule changes without redeploying the entire digital banking platform, that’s useful.
If your Notification service can scale during a marketing campaign without scaling account processing, also useful.
If one reporting component fails and your entire bank stops processing transfers, that’s not microservices done well. That’s just bad architecture wearing modern clothes.
Why enterprises moved toward microservices
The reason is not fashion. It’s organizational physics.
As systems grow, monoliths become harder to change. Not impossible. Harder. Different teams step on each other. Releases get slower. One codebase becomes the meeting point for every dependency conflict, every security concern, every deployment risk, every “just one more feature.”
In enterprise environments, this gets worse because:
- there are many teams
- there are strict release controls
- there are IAM and security requirements
- there are integration dependencies
- there are legacy systems that refuse to die
- there are compliance and audit needs
- there are channels like web, mobile, branch, call center, partner APIs
Microservices emerged as a way to align architecture with business and team structure.
That sounds neat in PowerPoint. In reality, the real benefit is more gritty:
- smaller blast radius
- clearer ownership
- faster delivery for isolated capabilities
- targeted scaling
- technology flexibility where justified
- better resilience if designed properly
But let’s be honest. Those benefits only show up if the architecture has discipline. Without discipline, microservices just distribute complexity across the network.
The beginner mental model: from one big machine to a team of specialists
Think of a monolith as one large department store with a single back office. Everything happens inside one building.
Think of microservices as a business district. There’s a payment office, an identity office, a fraud office, a messaging office, and they coordinate through roads, messages, and contracts.
That sounds more scalable. And it is. But now traffic matters. Addressing matters. Security matters. Timing matters. If one office changes how it works internally, fine. If it changes the contract without warning, chaos.
That’s why beginners should learn this early:
A microservice is not defined by size
Small codebase? Nice, but not the point.
A microservice is not defined by technology
Running in containers does not make something a microservice.
A microservice is defined by ownership and business responsibility
It should own a meaningful capability and evolve mostly independently.
That’s the real test.
The core characteristics of microservices
Here’s the practical list I use when explaining this to delivery teams and architecture boards. EA governance checklist
That last one is always underestimated. Architects love drawing service boxes. Operators inherit the reality. If you can’t trace a customer payment across API Gateway, IAM, payment orchestration, Kafka topics, fraud checks, and notification workflows, then your architecture is not modern. It is just opaque.
How services communicate: APIs, events, and the Kafka trap
In microservices, communication usually happens in two ways:
1. Synchronous communication
This is request-response, usually HTTP or gRPC.
Example:
- Mobile app calls API Gateway
- API Gateway validates token through IAM
- Request goes to Account Service
- Account Service returns balance
This is straightforward and useful for immediate user interactions.
2. Asynchronous communication
This is event-driven, often using Kafka or another messaging platform.
Example:
- Payments Service completes a transfer
- It publishes
PaymentCompleted - Fraud Service consumes it
- Notification Service consumes it
- Reporting Service consumes it
- Audit Service stores it
This is powerful because services don’t all need direct synchronous calls. They react to events.
Now the contrarian part: teams often overuse Kafka because it looks architecturally sophisticated.
Kafka is excellent. I like Kafka. In banking especially, it’s useful for transaction events, audit streams, fraud pipelines, reconciliation flows, and decoupled integrations. But Kafka is not a magic decoupling powder. If you publish vague, unstable, undocumented events, you haven’t reduced complexity. You’ve hidden it in topics.
A few strong opinions here:
- If an interaction needs an immediate answer, use an API.
- If multiple downstream services need to react independently, events are a good fit.
- Don’t turn every CRUD update into an event stream just because your platform team built Kafka.
- Don’t use Kafka to avoid hard conversations about service boundaries.
I’ve seen enterprises where half the architecture was really “database changes wrapped in Kafka.” That is not event-driven design. That is integration theater.
Data ownership: the part beginners usually miss
Here is where microservices stop being a diagram and become a real architectural commitment.
In a monolith, many modules often share one database. In microservices, shared database ownership is usually a bad sign.
Why? Because the database becomes the real coupling point. Teams can’t change independently if everyone reads and writes the same tables. You can pretend there are service boundaries, but the schema tells the truth.
In real architecture work, this means:
- Customer Service owns customer profile data
- Account Service owns account data
- Payments Service owns payment workflow and transaction data
- Fraud Service owns risk decisions and signals
- IAM owns identities, roles, entitlements, token metadata
This does not mean every service must have a completely different physical database technology. That’s another beginner misunderstanding. You can use the same database platform, but ownership and access boundaries should still be clear.
A service should not casually reach into another service’s tables. If it needs data, it should use a contract: API, event, replicated read model, or well-governed query pattern.
This is where architects get uncomfortable, because enterprise reporting, analytics, and regulatory needs often cut across domains. Fine. That’s real life. Solve it deliberately with data pipelines, event streaming, warehouses, or read models. Don’t destroy service boundaries because reporting wants convenience.
Real enterprise example: digital banking payments platform
Let’s make this concrete.
Imagine a mid-to-large bank modernizing its digital payments platform. It has mobile banking, online banking, branch systems, and partner integrations. The old system is a monolith sitting on a large application server cluster. Every release is painful. A change in beneficiary management somehow risks card payment flows. Audit logging is inconsistent. Fraud controls are bolted on.
The bank decides to move toward microservices—not all at once, because that would be reckless.
A sensible target architecture might include:
- API Gateway in the cloud for external channels
- IAM platform for authentication, OAuth2/OIDC tokens, role enforcement
- Customer Service
- Account Service
- Payments Service
- Beneficiary Service
- Fraud Decision Service
- Notification Service
- Limits and Rules Service
- Audit Service
- Kafka as the enterprise event backbone
- Core banking integration layer for legacy account posting and settlement
- Observability stack for logs, traces, metrics
- Kubernetes or managed cloud runtime for service deployment
A transfer flow might work like this:
- User logs into mobile app
- IAM authenticates user and issues token
- Mobile app calls Payments API through API Gateway
- Payments Service validates entitlements with IAM claims and business rules
- Payments Service checks account and limits via Account Service and Limits Service
- Fraud Service is called synchronously for real-time risk scoring
- Payment is submitted to core banking integration for posting
- On success, Payments Service publishes
PaymentSubmittedand laterPaymentCompletedto Kafka - Notification Service sends customer confirmation
- Audit Service records immutable business events
- Reporting and reconciliation services consume the same Kafka events downstream
This is where microservices help in real architecture work:
- Fraud logic can evolve independently
- Notification channels can scale separately
- Audit can become reliable and centralized
- Limits can be changed without touching payment orchestration
- New channels can reuse the same APIs
- Event-driven downstream processing reduces direct coupling
But notice something important: this architecture is not “simpler” than the monolith. It is more manageable at scale, if done well. That’s different.
Beginners need to hear this clearly. Microservices do not remove complexity. They redistribute it from code internals into contracts, networks, operations, and governance.
How this applies in real architecture work
This is the section many articles skip. They explain the pattern but not the job.
In real enterprise architecture, microservices are not just about service decomposition. They force decisions in five areas.
1. Domain boundaries
Architects have to decide where one service ends and another begins.
This is hard. And often political.
A common mistake is to split by technical layer:
- customer-api
- customer-business
- customer-db
- customer-validation
That’s not microservices. That’s just a distributed monolith.
A better split is by business capability: ArchiMate capability map
- customer profile
- account management
- payments
- fraud
- notifications
- identity and access
You don’t get these boundaries perfect on day one. Nobody does. But if the boundaries don’t align to business ownership, the architecture will fight the organization every day.
2. Team topology
Microservices only work if teams can actually own services end to end.
If one central platform team controls all deployments, one database team approves every schema change, one middleware team owns all integration logic, and one security team manually configures every IAM policy after a two-week ticket cycle, then congratulations—you have microservices on paper and a monolith in process. integration architecture guide
Architecture must account for operating model reality.
3. Security and IAM
In enterprises, especially banking, security is not a side note.
Every service interaction raises questions:
- Who is calling?
- What token is presented?
- What scopes or roles are required?
- Is this user-level access or service-to-service access?
- How are secrets managed?
- How are machine identities rotated?
- How is privileged access audited?
A real microservices architecture usually needs:
- OAuth2/OIDC
- token propagation or token exchange patterns
- mTLS or service identity controls
- centralized policy enforcement where useful
- service-level authorization decisions
- strong auditability
A lot of beginner content ignores this. Real architects cannot.
4. Data and consistency
In distributed systems, transactions across services are difficult and often undesirable.
You have to choose:
- synchronous orchestration
- eventual consistency
- compensating actions
- saga patterns
- read models
- reconciliation processes
In a bank, this matters a lot. You cannot hand-wave consistency.
For example, if Payments Service publishes an event but Notification Service fails to send the message, the payment still happened. Fine. That’s recoverable.
If Payments Service and core banking posting become inconsistent, that’s a much bigger problem. You need architectural controls for idempotency, retries, exactly-once assumptions—carefully, because “exactly once” is usually marketed more confidently than it exists in reality.
5. Operational maturity
Microservices need mature operations:
- CI/CD pipelines
- automated testing
- tracing
- alerting
- container security
- runtime governance
- API versioning
- dependency management
- incident response
Without these, the architecture becomes expensive chaos.
This is why I often tell executives: microservices are an organizational upgrade disguised as a software architecture choice.
Common mistakes architects make
Let’s be blunt. These are not theoretical mistakes. These are common.
Mistake 1: Starting with technology instead of domain
“We’re adopting Kubernetes, Kafka, service mesh, and serverless.”
Fine. But what business problem are you solving? If you cannot explain the service boundaries in business language, you are not designing microservices. You are shopping.
Mistake 2: Making services too small
There’s a weird obsession with tiny services. Beginners hear “micro” and start cutting everything into microscopic pieces.
A service should be small enough to own and change, but large enough to represent a meaningful capability.
If a customer address update requires seven service calls because you split validation, formatting, persistence, and event publication into separate deployables, you’ve lost the plot.
Mistake 3: Shared database with fake service boundaries
This is probably the most common enterprise anti-pattern. Teams create separate services but all of them read and write the same schema.
That kills autonomy. It also creates hidden dependencies that no API contract can save.
Mistake 4: Ignoring IAM until late
Security cannot be “integrated later.” In banking and regulated industries especially, IAM design affects API design, service communication, audit, and user journeys from the beginning.
Mistake 5: Treating Kafka as a universal answer
Kafka is a powerful backbone, not an excuse to avoid service design. If every service emits events nobody governs, you create semantic drift fast.
Mistake 6: No observability strategy
In a monolith, debugging is local. In microservices, debugging is forensic work. If you don’t have correlation IDs, distributed tracing, structured logs, and clear dashboards, your support teams will suffer.
Mistake 7: Rebuilding the monolith in the network
This is the classic distributed monolith:
- synchronous chains everywhere
- no resilience boundaries
- no local ownership
- tightly coupled releases
- brittle dependencies
It looks modern because it runs in containers. It behaves old because every service depends on every other service in lockstep.
Mistake 8: Big-bang migration
Architects sometimes design a beautiful future-state diagram and then try to replace the monolith all at once.
That usually ends badly.
A better approach is incremental:
- identify a business capability with high pain and clear boundaries
- extract it carefully
- build platform capabilities as needed
- learn from production
- repeat
That’s slower in PowerPoint and better in reality.
Microservices vs monolith: beginners deserve a fair comparison
A lot of articles act like monolith means outdated and microservices means modern. That’s lazy thinking.
A well-structured monolith is often the right starting point. Sometimes it remains the right answer for a long time.
Here’s the honest comparison:
My strong opinion: many enterprises should first build a modular monolith before jumping to microservices.
Why? Because if you cannot design good boundaries inside one codebase, you will not magically design good boundaries across a network. You’ll just make the mistakes harder to fix.
Cloud, containers, and the enterprise reality
Microservices and cloud often show up together, but they are not the same thing.
You can run microservices on-prem. You can run a monolith in the cloud. The relationship is practical, not absolute.
Cloud helps microservices because it provides:
- managed Kubernetes or serverless runtimes
- managed Kafka or event streaming
- IAM integration
- autoscaling
- API management
- observability services
- secrets management
- network controls
But cloud also introduces enterprise questions:
- multi-region strategy
- residency and compliance
- latency to legacy systems
- shared responsibility model
- cost control
- network egress charges
- identity federation
I’ve seen banks put stateless services in the cloud while keeping core ledger systems on-prem for years. That hybrid model is common. It works, but only if architects take latency, security, and failure handling seriously.
For example:
- API layer and customer-facing services in cloud
- Kafka bridging cloud and on-prem event domains
- IAM federated with enterprise directory
- core banking adapters near legacy systems
- strong encryption and tokenization for sensitive data
This is not glamorous architecture. It is practical architecture. And practical architecture is what survives audits and outages.
When microservices are a good idea
Use them when:
- multiple teams need to move independently
- different business capabilities change at different rates
- parts of the system need different scaling profiles
- resilience and fault isolation matter
- you have enough operational maturity
- your domain is large enough to justify the complexity
- you are willing to invest in platform engineering, IAM, observability, and governance
In banking, these conditions often exist. Payments, fraud, notifications, customer identity, and digital channels all evolve differently and have different load patterns. That’s a reasonable place for microservices.
When microservices are a bad idea
Avoid or delay them when:
- you have one small team
- your delivery process is already slow for organizational reasons
- your domain boundaries are unclear
- your operations are immature
- your testing is weak
- your IAM model is inconsistent
- your architecture team wants microservices mostly because competitors mention them
That last one happens more than people admit. TOGAF roadmap template
A practical adoption approach for architects
If you’re working in enterprise architecture and want to apply this sensibly, this is a better sequence than “let’s break up the monolith.”
Step 1: Identify business pain
Not technical fashion. Real pain.
- slow release cycles
- scaling bottlenecks
- ownership confusion
- fragile change impact
- compliance or audit gaps
Step 2: Map business capabilities
Use domain thinking. In a bank:
- identity
- customer profile
- accounts
- payments
- fraud
- notifications
- audit
- reporting
Step 3: Choose one bounded capability
Pick a candidate with:
- clear ownership
- limited dependencies
- high business value
- manageable risk
Notifications is often easier than payments. Fraud scoring can be a good candidate. IAM is foundational but sensitive.
Step 4: Build platform basics early
Before scaling out service count, establish:
- CI/CD
- API standards
- IAM patterns
- logging and tracing
- service templates
- Kafka governance
- secrets management
- runtime standards
Step 5: Migrate incrementally
Strangle the monolith. Don’t explode it.
Step 6: Measure outcomes
If release speed, resilience, and ownership don’t improve, stop pretending the architecture is helping.
That’s another contrarian point: architecture should be judged by operational outcomes, not by diagram elegance.
Final thought
Microservices architecture is not about making software trendy. It is about structuring systems so that large organizations can change safely, independently, and at scale.
For beginners, the key idea is simple:
- split systems into independently deployable services
- align them to business capabilities
- let them communicate through clear APIs and events
- keep data ownership explicit
- design security, observability, and operations from the start
For architects, the harder truth is this:
microservices only work when architecture, teams, governance, IAM, data strategy, and platform maturity all pull in the same direction. architecture decision records
Otherwise, you don’t get agility. You get a distributed monolith with better branding.
And nobody needs that.
FAQ
1. Are microservices better than a monolith?
Not automatically. For small teams or simpler products, a modular monolith is often better. Microservices start making sense when scale, team autonomy, and change complexity justify the added operational burden.
2. Does every microservice need its own database?
Not necessarily its own database server or technology, but it should have clear data ownership. The important rule is that other services should not directly depend on its internal schema.
3. Why is Kafka so common in microservices architecture?
Because it’s excellent for event-driven integration, audit streams, decoupled downstream processing, and high-throughput enterprise messaging. But it should be used where events make sense, not as a default for every interaction.
4. How does IAM fit into microservices?
IAM is central. It handles authentication, authorization, token issuance, service identity, and auditability. In enterprises, especially banking, weak IAM design can break the entire architecture no matter how clean the service boundaries look.
5. Can a bank really use microservices for core systems?
Yes, but usually incrementally and with caution. Customer channels, payments orchestration, fraud, notifications, and API layers are common candidates. Core ledgers may remain monolithic or legacy for a long time, with microservices built around them. That’s normal.
Frequently Asked Questions
How are microservices modeled in ArchiMate?
Each microservice is an Application Component in the ArchiMate Application layer, exposing Application Services via Application Interfaces. Serving relationships show inter-service dependencies. Assignment to Technology Nodes models the deployment topology. Data Objects model the contracts and event schemas exchanged between services.
What is the difference between microservices and monolithic architecture?
A monolith packages all functionality into one deployable unit — simpler to develop initially but harder to scale and change independently. Microservices decompose the application into independently deployable services aligned to business domains. This enables team autonomy and independent scaling but introduces distributed system complexity.
How do you document microservices architecture for enterprise governance?
Use ArchiMate Application Cooperation diagrams for the service landscape, UML Component diagrams for internal service structure, UML Sequence diagrams for key interaction flows, and UML Deployment diagrams for container and infrastructure topology. In Sparx EA, all these views can exist in one repository with full traceability.