Promjena Go HTTP proxy ruta bez izmjene Client.Transport
Upotrijebite sinkronizirani RoundTripper omotač za objavljivanje novog konfiguriranog proxy prijenosnika bez izmjene polja aktivnog http.Client.
Ako http.Client već dijele paralelni zahtjevi, držite njegovo polje Transport stabilnim. Omotač može sinkronizirati koji potpuno konfigurirani prijenosnik dobiva svako sljedeće 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, inicijalizirajte ga prije objavljivanja klijenta:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport i nextTransport moraju biti non-nil, potpuno konfigurirani i za paralelnost sigurni izvršitelji kruženja. Izgradite svaki proxy prijenosnik prije objavljivanja i ostavite njegovu konfiguraciju nepromijenjenom dok ga zahtjevi koriste.
Brava štiti samo snimku pokazivača, pa spori zahtjev ne drži bravu usmjeravanja tijekom cijele mrežne razmjene. Zahtjev koji već koristi prethodnu snimku nastavlja na tom prijenosniku; prebacivanje ga ne ponavlja niti pomiče njegovu vezu.
Zadržavajte i umirovljujte stare prijenosnike kroz ograničeni životni ciklus aplikacije, dopuštajući dovršetak posla u tijeku i zatvarajući neaktivne skupove kada je prikladno. Preusmjeravanje može izazvati još jedno RoundTrip nakon prebacivanja. Ako cijeli tijek rada zahtijeva jednu rutu, dodijelite je na granici tijeka rada umjesto da mijenjate ovaj zajednički birač na pola puta.