Only thing I took issue with was "Instead, explicitly define your servers in your configurations for as long as you can."
Maybe you can get away with this for a small scale deployment, but "as long as you can" sends a bit too mixed of a message. You should only defer a service discovery implementation until you get to the point where you have more than one read path in your stack.
IMO, as soon as you go from load balancer -> app -> cache -> database to having a services layer you should start thinking service discovery.
The simplest bandaid is to leverage DNS as much as possible until you get even bigger, and use static CNAMEs.
Maybe you can get away with this for a small scale deployment, but "as long as you can" sends a bit too mixed of a message. You should only defer a service discovery implementation until you get to the point where you have more than one read path in your stack.
IMO, as soon as you go from load balancer -> app -> cache -> database to having a services layer you should start thinking service discovery.
The simplest bandaid is to leverage DNS as much as possible until you get even bigger, and use static CNAMEs.