
Explore designing microservices from monolith to event driven architectures using patterns and principles. Learn decomposition, synchronous and asynchronous communication, data management, security, resilience, and deployment with Docker and Kubernetes.
Explore iterative learning cycle of problem, learn, design, code, and evaluate, and see how architectural patterns and trade-offs apply to real-world microservices and monolithic transitions in an eShop context.
Explore the prerequisites for this course, access the GitHub source code and course slides, and understand how the code demonstrates architectural thinking in microservices design.
Define the online selling problem and core e-commerce use cases, including browse, select, add to cart, and place order, while outlining availability, performance, latency, and reliability as non-functional requirements.
Learn when to use monolithic architecture for startups, highlighting its simple development, single codebase, and easy deployment, plus challenges like tight coupling and the big ball of mud.
Design the first version of the e-shop with a monolithic architecture, outlining functional requirements and non-functional targets like 24/7 availability and 2–3 second response times, emphasizing simplicity.
Explore a monolithic web app by examining code structure, running the app with dotnet aspire, and validating end-to-end product to checkout flows while observing logs on the aspire dashboard.
Explores how a monolithic, tightly coupled UI and backend logic hampers flexibility, creates development bottlenecks, and limits omnichannel reach, while introducing three tier architecture.
Explore the big ball of mud: a tangled, poorly structured codebase with no clear organization, where rapid development, lack of proper design, and inadequate refactoring accumulate technical debt.
Explore modular monolith architecture, a single deployed app built from loosely coupled modules with explicit interfaces, to boost maintainability, team autonomy, and a stepping stone toward microservices.
Design a modular monolith backend for the e-shop by organizing domain modules (catalog, basket, ordering, identity, payment, and shipment) into cohesive, loosely coupled components with clear interfaces.
Isolate each module's data in its own schema within a single PostgreSQL database to achieve logical data isolation in modular monoliths.
Explore how a dotnet modular monolith organizes the api service into catalog, basket, and ordering modules with per-module schemas in PostgreSQL, enabling clean separation and internal module communication.
Explore monolithic architecture vertical considerations: module communications through direct method calls, transaction management with a single relational database and ACID, and deployments as a single unit.
During peak traffic, product pages slow due to repetitive reads on PostgreSQL. Learn to reduce database load by caching catalog data and avoiding database hits for each request.
Learn how output caching speeds up product pages by storing rendered outputs in a cache and serving them on subsequent requests, with attention to duration, invalidation, and distributed caching.
Design a modular monolith for e-shop with Redis output caching to reduce database load and improve latency on product pages, using cache invalidation and key design.
Explore how a single API service instance becomes a bottleneck under increased traffic, causing latency, high cpu and memory usage, and http 503 errors, and learn capacity for scalability.
Design a horizontally scaled e-shop backend with a load balancer, implementing stateless api services and external state in Redis or PostgreSQL to ensure read-heavy scalability and high availability.
Use microservices when independent scalability, high agility, and technology diversity solve business problems; avoid microservices for small apps without strong DevOps and clear business drivers.
Learn the database-per-service pattern and polyglot persistence, where each microservice owns a private database and shares data via public APIs to maintain loose coupling and autonomy.
Design a microservices architecture for the Icap application by decomposing the backend into independent data-isolated services with database per service and polyglot persistence.
Decompose microservices by business capability and subdomain, emphasizing high cohesion, loose coupling, bounded contexts, domain-driven design, and an evaluative checklist for independent deployability and data ownership.
Identify and decompose microservices for an eShop domain using domain-driven design by extracting key nouns and verbs from user stories, mapping to services like product catalog, shopping cart, and order.
Apply the strangler fig pattern to gradually replace a modular monolith with microservices, starting with the identity module, a strangler facade, and independent services with dedicated databases while preserving operations.
Explore how microservices communicate across networks, including protocols, data formats, service discovery, and API versioning, and learn patterns for synchronous and asynchronous communications using HTTP RESTful APIs.
Explore microservices communication basics, comparing inter-service network calls with monoliths, and learn RESTful APIs, GraphQL, gRPC, HTTP, JSON, and concerns like latency, security, serialization, and service discovery.
Design stateless, restful microservices with resource oriented URIs, versioning and JSON, using HTTP methods to expose cohesive customer, product, cart, checkout, and ordering APIs for a Blazor frontend.
Identify the n+1 data fetching problem in restful calls across microservices, and learn to reduce round trips by designing a GraphQL API that fetches exactly the needed nested data.
Explore GraphQL as a query language for APIs and a server-side runtime that uses a schema, queries, mutations, and resolvers to return exactly the requested data in JSON.
Design microservices with a GraphQL API layer that aggregates data, enables client-driven queries, decouples rest endpoints, solves n plus one, and delivers a single JSON response.
Design microservices with a hybrid rest and gRPC architecture to optimize internal communication for low latency and reduced overhead, while using rest for public APIs.
Direct client-to-service calls burden apps with multiple protocols and data aggregation. Use a unified entrypoint via API gateway or backend for frontend patterns to simplify communication and reduce coupling.
Learn how an API gateway serves as a single entry point for clients, routing and aggregating requests to microservices, handling authentication, rate limiting, logging, and protocol translation.
Explore a dotnet api gateway built with yarp to route web client requests to catalog, basket, and ordering microservices, utilizing service discovery, reverse proxy routing, and distributed traces.
Adopt backend for frontend design to deliver client-specific APIs and tailored data payloads, moving data shaping from clients to backend to meet diverse web and mobile UI requirements.
Design microservices with a backend for frontend pattern using separate web and mobile BFF layers to tailor optimized APIs for each client and enable independent evolution. Weigh benefits against complexity.
Master the service aggregator pattern to deliver a single composite response from multiple microservices via the API gateway, and explore service registry discovery for dynamic microservice locations.
Examine why long running operations fail with synchronous communication in multi-step workflows like placing an order, and embrace non-blocking, asynchronous message based architecture for resilient order fulfillment.
Learn how microservices use asynchronous communication and event driven architecture to decouple producers and consumers, leveraging message brokers for fanout pub/sub patterns and reliable delivery.
Explore asynchronous communication types: one-to-one point-to-point queues and one-to-many publish-subscribe topics. Learn how producers and consumers decouple, enable event-driven architectures, and replay historical events using technologies like RabbitMQ and Kafka.
Explore event-driven architecture and the publish/subscribe pattern, where publishers emit events to an event bus, subscribers consume asynchronously, enabling decoupling, scalability, resilience, and responsive systems.
Designs an eShop microservices architecture using event-driven design with a central event bus and publish-subscribe pattern, enabling decoupled services, price change and order events, scalability, and eventual consistency.
Explore a dotnet microservices architecture using event-driven design with RabbitMQ, as catalog and basket services publish and subscribe to product price change and basket checkout events to update orders asynchronously.
Explore the scale cube axes: horizontal, functional decomposition, and data partitioning, and learn how stateful databases complicate horizontal scaling, with stateless microservices scaling easily behind a load balancer.
Explore why databases become bottlenecks as microservices scale, despite stateless client and gateway scaling, and learn horizontal scaling approaches, including data partitioning, sharding, replication, and SQL and NoSQL options.
Learn how the database-per-service pattern gives each microservice its own private database, enabling polyglot persistence and independent scaling, while avoiding cross-service joins and relying on API calls for data.
Explore relational and NoSQL databases, comparing schemas, transactions, and access patterns, and identify document, keyValue, column, and graph models for microservice architectures.
Choose databases for microservices by matching data types and access patterns, balancing consistency, availability, and partition tolerance per the cap theorem, using polyglot persistence.
Explore data partitioning techniques horizontal sharding, vertical partitioning, and functional partitioning, and learn how partitioning boosts scalability, availability, performance, and manageability in microservice architectures.
Learn the database sharding pattern to horizontally partition data into shards using a shard key, with geo sharding illustrated by Tinder and supported by Cassandra NoSQL's masterless architecture.
Design a microservices architecture using database sharding to scale order data, improve performance, and ensure high availability, with shard keys and distributed NoSQL options like Cassandra and DynamoDB.
Analyze cross-service queries and write commands on distributed, sharded microservice databases; apply materialized view, design patterns, and event sourcing to enable separated reads and writes at scale and distributed transactions.
In this course, we’re going to learn how to Design Microservices Architecture with using Design Patterns, Principles and the Best Practices with Iterate Design Architecture from Monolithic to Microservices. We will using the right architecture design patterns and techniques.
By the end of the course, you will Learn how to handle millions of request with designing system for high availability, high scalability, low latency, and resilience to network failures on microservices distributed architectures.
This course is will be the journey of software architecture design with step by step evolving architecture from monolithic to event driven microservices.
We will start the basics of software architecture with designing e-commerce Monolithic architecture that handles low amount of requests.
After that step by step evolves the architecture with;
3-Tier Architecture
Modular Monolithic Architecture
Microservices
Event-Driven Microservices Architectures
and lastly Serverless Microservices Architectures with designing together that handle millions of requests. This is a step-by-step process for software system design and evolve from monolithic to microservices following the patterns & principles.
We will discuss microservices architectures with all aspects,
Microservices Decomposition
Microservices Communications (Sync / Async Message-Based Communication, API Gateways)
Microservices Data Management (Databases / Query / Commands)
Microservices Transaction Management
Microservices Distributed Caching
Microservices Deployments with Containers and Orchestrators
Microservices Resilience
with applying microservices design patterns and practices.
We are going to design with together and step by step with refactor architectures with all aspects of microservices pillars.
We will start with designing Monolithic Architecture. And you can see that we have Functional and Non-functional requirements that should cover our design and we have patterns and principles toolbox that we will learn and use these principles when evolving architectures.
Way of Learning — The Course Flow
We will always starts with the problem and try to solve this problem with learning and designing new architectures, patterns and best practices.
Problem -> Learn -> Design -> Code -> Evaluate
We will complete this circle for every section of the course. You will find that we will add new requirements in order to handle millions of request and learn new patterns and practices that will use these principles when evolving architectures.
That means you're not just passively receiving information. You're actively participating in the architectural decision-making process, seeing the direct impact of each pattern and principle through code. We'll emphasize the 'why' behind every decision, ensuring you build a deep understanding.
We will see full of patterns and principle toolbox is loading with new patterns and apply them into current designs. We will see latest patterns that we use more than 30 patterns and practices with implementing high scalability, high availability and handle millions of request requirements.
Let me write some microservices pattern which we covered in this course;
The Database-per-Service Pattern
API Gateway Pattern, Gateway Routing/Aggregation/Offloading Pattern
Backends for Frontends pattern BFF
Service Aggregator Pattern, Service Registry/Discovery Pattern
Fan-out Publish/Subscribe Messaging Pattern
Topic-Queue Chaining & Load Balancing Pattern
The Shared Database Anti-Pattern and Polyglot Persistence
Database Sharding Pattern, CAP Theorem
Materialized View Pattern
CQRS and Event Sourcing Patterns
SAGA Pattern — Choreography-based/Orchestration-based SAGA
Compensating Transaction Pattern
Transactional Outbox Pattern
Dual Write Problem
CDC — Change Data Capture with Outbox Pattern
Event Hubs and Real-time Event Streaming in Event-Driven Microservices Architecture
Cache-Aside Pattern for Microservices Distributed Caching
Sidecar Pattern
Service Mesh Pattern
DevOps and CI/CD Pipelines for Microservices Deployments
Deployment Strategies for Microservices: Blue-green, Rolling and Canary deployments
Infrastructure as Code (IaC) and usage in Microservices Deployments
Microservices Resilience, Observability and Monitoring Patterns
Retry and Circuit Breaker Patterns
Bulkhead / Timeout / Cache / Fallback Patterns
Elastic Stack for Microservices Observability with Distributed Logging
Microservices Health Checks: Liveness, Readiness and Performance Checks
Serverless Microservices Architecture implementation on AWS
So the course flow will be the both theoretical and practical information;
We will always start with a business problem
We will learn a specific pattern, why and where we should use
After that we will see the Reference architectures that applied these patterns
After that we will design our architecture with applying this newly learned pattern with together
And lastly we will decide which Technologies can be choices for that architectures.
And for each section, we will made Code Review for Existing Microservices Architecture Repository on GitHub for practical implementation of microservices architecture.
So this course will includes
Hands-on Design Activities
Iterate Design Architecture from On-Premises to Cloud Server-less architectures
Evolves architecture monolithic to Event-Driven Microservices Architectures
Refactoring System Design for handling million of requests
Apply best practices with microservices design patterns and principles
Examine microservices patterns with all aspects like Communications, Data Management, Caching and Deployments
Prepare for Software Architecture Interviews
Prepare for System Design Architecture Interview exams.
I have been joined several famous company's architecture position interviews, also involved software architect positions assessment process more than 50+ interviews collect the architecture requirements for software industry positions.
So with this course, you will gain real-world experience about all architecture positions from monolithic to event-driven microservices architectures.
This course prepared for the beginner but at least you should familiar with basics of software architectures. This course will have good theoretical information but also will be 90% of hands-on design activities. All course architecture steps will designed step by step and together.
I hope you'll join me on this journey and develop this project with me.