Prebacivanje Go HTTP proxy ruta bez mijenjanja Client.Transport
Koristite sinhronizovani RoundTripper omotač da objavite novi konfigurisani proxy transport bez mijenjanja 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()
}Koristeći 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 sigurni 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 povlačite stare transporte kroz ograničeni životni ciklus aplikacije, dopuštajući da rad u toku završi i zatvarajući neaktivne bazene 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.