Сервисы регистрируются при старте и получают адреса других сервисов по имени. Consul/etcd: регистрация с TTL, здоровье через HTTP check; клиент резолвит имя в список инстансов. В K8s - DNS (имя сервиса резолвится в ClusterIP). В Go: клиент Consul (hashicorp/consul), etcd (etcd-client); при вызове другого сервиса берут адрес из discovery, балансируют (round-robin).
// K8s: http.Get("http://orders-service:8080/health")
// Consul: services, _ := consul.Client().Health().Service("orders", "", true, nil)