Componentization via Services: Component is a unit of software that is independently replaceable and upgradeable.
Organized around Business Capabilities: The microservice approach to division is splitting up into services organized by business capability.
Products not Projects: This is Amazon’s notion of “you build, you run it” where a development team takes full responsibility for the software in production.
Smart endpoints and dumb pipes: Microservices aim to be as decoupled and as cohesive as possible, so they own their own domain logic and receiving a request, applying logic and producing a response with using Restful APIs.
Decentralized Governance: Netflix is a good example of an organization that follows this philosophy. Sharing useful and all tested code as libraries, encourages other developers to solve similar problems in similar ways.
Decentralized Data Management: Microservices also decentralize data storage decisions. We can say this approach as a Polyglot Persistence or Polyglot Databases. That means Microservices prefer letting each service manage its own database, either different instances of the same database technology, or entirely different database systems.
Infrastructure Automation: That means automate deployment to each new environment and for every microservices with separately.
Design for failure, Resilience: Microservices design by dealing failures and try to manage failures with managing errors with proper actions. Microservices are also designed to be resilient, meaning that they can continue to operate even if one or more services fail. Because each service operates independently, a failure in one service should not affect the entire application.
Scalable: Each service operates independently, it is possible to scale individual services up or down as needed, without affecting the rest of the application. This allows teams to allocate resources more efficiently and ensure that the application can handle increased traffic or usage.
Technology Agnostic: Different services can be written in different programming languages or use different technology stacks. This makes it easier to choose the right tool for the job, rather than being tied to a particular technology stack.