Canvieu rutes de proxi HTTP de Go sense modificar Client.Transport
Feu servir un embolcall RoundTripper sincronitzat per publicar un transport de proxi configurat nou sense modificar un camp http.Client en actiu.
Si un http.Client ja el comparteixen peticions concurrents, manteniu el seu camp Transport estable. Un embolcall pot sincronitzar quin transport completament configurat rep cada volta posterior:
type routeSlot struct {
mu sync.RWMutex
current http.RoundTripper
}
func (s *routeSlot) RoundTrip(r *http.Request) (*http.Response, error) {
s.mu.RLock()
current := s.current
s.mu.RUnlock()
return current.RoundTrip(r)
}
func (s *routeSlot) Set(next http.RoundTripper) {
s.mu.Lock()
s.current = next
s.mu.Unlock()
}Amb net/http i sync, inicialitzeu-lo abans de publicar el client:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport i nextTransport han de ser executors de voltes no nuls, completament configurats i segurs per a la concurrència. Construïu cada transport de proxi abans de publicar-lo i deixeu la seva configuració sense canvis mentre les peticions l'utilitzen.
El pany només protegeix la instantània del punter, així que una petició lenta no reté el pany d'encaminament durant tot el seu intercanvi de xarxa. Una petició que ja fa servir la instantània anterior continua amb aquell transport; el canvi no la repeteix ni mou la seva connexió.
Conserveu i retiroeu els transports antics durant el cicle de vida acotat de l'aplicació, permetent que la feina en curs acabi i tancant els pools inactius quan calgui. Una redirecció pot provocar un altre RoundTrip després d'un canvi. Si un flux de treball sencer necessita una ruta, assigneu-la a la frontera del flux de treball en lloc de canviar aquest selector compartit a mig camí.