Mainīt Go HTTP starpniekservera maršrutus, nemainot Client.Transport
Izmantojiet sinhronizētu RoundTripper apvalku, lai publicētu jaunu konfigurētu starpniekservera transportu, nemainot aktīvu http.Client lauku.
Ja http.Client jau tiek koplietots starp vienlaicīgiem pieprasījumiem, saglabājiet tā Transport lauku stabilu. Apvalks var sinhronizēt, kuru pilnībā konfigurētu transportu saņem katrs nākamais aplis:
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()
}Izmantojot net/http un sync, inicializējiet to pirms klienta publicēšanas:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport un nextTransport nedrīkst būt nil, tiem jābūt pilnībā konfigurētiem un vienlaicībai drošiem apļu izpildītājiem. Veidojiet katru starpniekservera transportu pirms tā publicēšanas un atstājiet tā konfigurāciju nemainītu, kamēr pieprasījumi to izmanto.
Slēdzene aizsargā tikai rādītāja momentuzņēmumu, tāpēc lēns pieprasījums netur maršrutēšanas slēdzeni visā tīkla apmaiņā. Pieprasījums, kas jau izmanto iepriekšējo momentuzņēmumu, turpinās ar šo transportu; pārslēgšanās to neatkārto un nepārvieto tā savienojumu.
Saglabājiet un izbeidziet vecos transportus lietojumprogrammas ierobežotajā dzīves ciklā, ļaujot pabeigt notiekošo darbu un attiecīgā gadījumā aizverot neaktīvos baseinus. Pāradresācija pēc pārslēgšanas var izraisīt vēl vienu RoundTrip. Ja visam darbplūsmam nepieciešams viens maršruts, piešķiriet to darbplūsmas robežā, nevis mainiet šo koplietoto selektoru pusceļā.