Microservices architecture advocates breaking monolithic applications into independent, isolated services that each have a single well-defined purpose. This allows each service to be developed, deployed and scaled independently. Key aspects of microservices include logical decomposition of functions, physical isolation of services using containers, independent data stores for each service, and asynchronous communication between services using a messaging platform. Monitoring and service discovery layers are also important to ensure high availability of the application and routing of requests to available services. While microservices improve scalability and flexibility, enterprise service buses are still needed for integration across applications.