Bytt Go HTTP-proxy-ruter uten å endre Client.Transport
Bruk en synkronisert RoundTripper-innpakning for å publisere en ny konfigurert proxytransport uten å endre et aktivt http.Client-felt.
Hvis en http.Client allerede deles av samtidige forespørsler, hold Transport-feltet stabilt. En innpakning kan synkronisere hvilken fullt konfigurert transport hver senere rundtur mottar:
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()
}Med net/http og sync initialiseres den før klienten publiseres:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport og nextTransport må være ikke-nil, fullt konfigurerte og samtidighetssikre rundtursutførere. Bygg hver proxytransport før den publiseres, og la konfigurasjonen være uendret mens forespørsler bruker den.
Låsen beskytter bare pekerens øyeblikksbilde, så en treg forespørsel holder ikke rutingslåsen gjennom hele nettverksutvekslingen. En forespørsel som allerede bruker det forrige øyeblikksbildet, fortsetter på den transporten; byttet spiller den ikke av på nytt eller flytter tilkoblingen.
Behold og avvikle gamle transporter gjennom applikasjonens avgrensede livssyklus, la pågående arbeid fullføres og lukk inaktive bassenger når det passer. En omdirigering kan forårsake en ny RoundTrip etter et bytte. Hvis en hel arbeidsflyt krever én rute, tilordne den ved arbeidsflytens grense i stedet for å endre denne delte velgeren midtveis.