Nibdel ir-rotot tal-proxy HTTP Go mingħajr ma tbiddel Client.Transport
Uża tgeżwir RoundTripper sinkronizzat biex tippubblika trasport tal-proxy konfigurat ġdid mingħajr ma tbiddel qasam http.Client li qed jaħdem.
Jekk http.Client diġà huwa maqsum bejn talbiet konkorrenti, żomm il-qasam Transport tiegħu stabbli. Tgeżwir jista' jissinkronizza liema trasport konfigurat għal kollox jirċievi kull vjaġġ suċċessiv:
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()
}B'net/http u sync, inizjalizzah qabel ma tippubblika l-klijent:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport u nextTransport għandhom ikunu mhux nil, konfigurati għal kollox u sikuri għall-konkorrenza. Ibni kull trasport tal-proxy qabel ma tippubblikah, u ħalli l-konfigurazzjoni tiegħu ma tinbidilx waqt li t-talbiet jużawh.
Il-lock jipproteġi biss is-snapshot tal-pointer, għalhekk talba bil-mod ma żżommx il-lock tar-rotot matul l-iskambju kollu tan-netwerk tagħha. Talba li diġà tuża s-snapshot preċedenti tkompli fuq dak it-trasport; il-bidla ma terġax tħaddimha u lanqas ma ċċaqlaq il-konnessjoni tagħha.
Żomm u rtira trasporti qodma permezz taċ-ċiklu tal-ħajja limitat tal-applikazzjoni, ħalli x-xogħol li għaddej jitlesta u agħlaq il-pools bla xogħol meta jkun xieraq. Ridirezzjoni tista' tikkawża RoundTrip ieħor wara bidla. Jekk fluss tax-xogħol sħiħ jeħtieġ rotta waħda, assenja dik ir-rotta fi l-fruntiera tal-fluss tax-xogħol minflok ma tbiddel dan is-selettur maqsum f'nofs triq.