Additionally, as soon as you introduce RPC-style (or even event-based) interactions between services your complexity goes through the roof. You need to deal with:
- service versioning and backward compatibility
- serialisation/deserialisation complexity and latency, and synchronization of DTO-style objects between services
- more complex deployments
- far more complex testing
- in-transit encryption for data and key management (eg. Istio, ...)
- network-layer issues
- circuit breakers
- caching / other performance band-aids
- graceful degradation across the stack when services fail
- sagas or equivalent mechanism for coordinating cross-service operations and what happens when things go wrong (fsm help you if you end up needing cross-service atomic transactions because of your ill-thought-out service boundaries)
- etc.
I'm honestly amazed at how many people blindly follow the "microservices good / monoliths bad" mantra given how obviously wrong it is for most teams.