Going to play devil's advocate here and suggest that the concept of a microservice has never been that difficult to grasp. It's a self-contained service presenting a set of related functionalities in a system having a clearly defined, documented, published interface that then becomes a dependency of other services in your system (and may itself depend on services; in the long run you end up with a DAG). It could be v…
There are ways to minimize this, and certainly ways to instrument such that DAGs are detected, but I'm genuinely interested to know about how people are avoiding cyclic dependencies in their services. I think it's important, because if you're using containers, there's a good chance you're using (eg) readiness probes to determine if your containerized service can reach it's dependencies. If you have a cyclic dependency and something breaks, all of a sudden you can't bring up any containers in the cycle: A can't come up until B comes up, but B can't come up until A does.