Instead of having a monolithic code base that caters to many concerns, you can instead break the application down into many services which, when working together, make up the whole application. Each service should:
- Have one or very few concerns
- Be de-coupled from other services
- Be stateless (if possible)

A service should expose an API for other services to interact with, but would otherwise be independent of other services. This means services could be independently deployed and managed.
Writing an application that allows for a microservice architecture allows us to achieve high scalability—administrators can simply spawn more instances of an in-demand service. Because the services are independent of each other, they can be deployed independently, where the more in-demand services have more instances deployed.
We have made our application stateless and containerized, both of which makes implementing a microservices architecture much easier.