Moving to microservices is a massive step, there are huge challenges that face us that have the ability to overwhelm us. We do not need to do all of this at once, we can take small steps within the monolith to improve the structure of the code then we can face these problems one step at a time.
I gave this talk at DDD East Anglia a few days ago, you can download my slides here.
I have worked on many different applications over the years and very few of them are ever made up of a single application, most of them have at least one of:
However, most of the systems that I have seen use a single code base to represent the entire domain of the system and each of the components is highly coupled to the entirety of that code base. They all share the same large monolithic database that is the central integration point. All of this means the different comnponents are so tightly coupled they have to be deployed in unison as well as increasing the development effort to make a change while slowing down the release cycle.
This is not to say all monoliths are like this, there are monoliths with clean code, separation of concerns that can be developed and deployed efficiently.
Microservices are the latest thing, what people need to make their CVs buzzword compliant (and yes I did create a talk about them so I'm not immune). But I think that the definitions of them is still not clear, I've heard it said that they are things you can re-write in two weeks, or something you can hold in your head easily but I'll go with a slightly different definition.
A microservice is an appropriately sized code-base that represents one business capability efficiently, controls its own data and may comprise of multiple deployable components
A business capability can be seen as a bounded context in Domain Driven Design terms. This could be managing the payment systems for a website, or management reports, or the reservations system of a hotel. These all have different sizes so the code should be sufficient to represent these business capabilities and no more than that.
This may result in more than one deployable component, as listed above, you may have service to receive commands, background processors to handle events and maybe even a website to render specific UI components as part of a composable UI.