Modular Monoliths — A Gateway to Microservices
In my previous article, 3 Reasons to Build Monolithic Systems, I recommended starting with a monolithic architecture, for speed and simplicity, if your system is not yet well defined. However, to clarify, starting with a monolith is not a license to start with no architecture and toss the whole thing later!
Monolithic architectures have become nearly synonymous with cobbled, messy code that is difficult to maintain — a “big ball of mud” is a nickname popularized in a talk by Brian Foote and Joseph Yoder way back in 1997. But cobbled and messy is not a requirement. Monolithic typically just means that the code for a system is in a single codebase that is compiled together and produces a single artifact. By this definition, monolithic is more about packaging and distribution than it is about the level of modularity, coupling, or defined interfaces.
Monolithic systems can absolutely be built as a set of loosely coupled, modular components with well-defined interfaces, enabling easier maintenance down the line. So why the bad reputation?
Consider a typical web application with a 3-tier layered architecture. There is a web layer, app or business logic…