Promjena Go HTTP proxy ruta bez izmjene Client.Transport
Koristite sinhronizirani RoundTripper omotač da objavite novi konfigurisani proxy transport bez izmjene polja aktivnog http.Client.
Ako http.Client već dijele paralelni zahtjevi, držite njegovo polje Transport stabilnim. Omotač može sinhronizovati koji potpuno konfigurisani transport dobija svako naredno kruženje:
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()
}Uz net/http i sync, inicijalizujte ga prije objavljivanja klijenta:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport i nextTransport moraju biti non-nil, potpuno konfigurisani i bezbjedni za paralelnost izvršioci kruženja. Izgradite svaki proxy transport prije objavljivanja i ostavite njegovu konfiguraciju nepromijenjenom dok ga zahtjevi koriste.
Brava štiti samo snimak pokazivača, pa spor zahtjev ne drži bravu rutiranja tokom cijele mrežne razmjene. Zahtjev koji već koristi prethodni snimak nastavlja na tom transportu; prebacivanje ga ne ponavlja niti pomjera njegovu vezu.
Zadržavajte i umirovljujte stare transporte kroz ograničeni životni ciklus aplikacije, dopuštajući da posao u toku završi i zatvarajući neaktivne skupove kada je prikladno. Preusmjeravanje može izazvati još jedno RoundTrip nakon prebacivanja. Ako cijeli tok rada zahtijeva jednu rutu, dodijelite je na granici toka rada umjesto da mijenjate ovaj zajednički birač na pola puta.