Hey David,
So I’m a little radical when it comes to service discovery these days - I like to use SWIM
https://asafdav2.github.io/2017/swim-protocol/
The weak point in any component model ( that’s what microservices are!) is identity. Component A has to know about component B to send B messages. A also has to know what messages B can accept.
Example: network location, rest URLs, message bus topics, kubernetes host env vars, ... all the same thing.
To remove the concept of identity, you want to be able to just send messages without knowing where to send them.
This is fundamentally impossible of course, but you can weaken identity significantly by using something like SWIM. Essentially each microservices builds its own internal, but hidden, routing table.
In practice this reduces your configuration work drastically - it’s pretty cool.
Nonetheless, the radical approach above does not invalidate other approaches. I’m a happy user of consul etc in many contexts. For local dev I often used hard coded ports. This has minimal impact on business logic so long as you have a message abstration layer that hides your message transport choices.
I’ve given a talk on this subject a few times:
https://youtu.be/67POODXANi8
Note that if you put this together with message pattern matching and the “general-to-specific” strategy, then versioning issues sort of dissolve away.
I try to explain this more rigorously in the book!
Richard