Skipta um Go HTTP proxy leiðum án þess að breyta Client.Transport
Notaðu samstillta RoundTripper umbúð til að birta nýja stilltan proxy flutningsaðila án þess að breyta virku http.Client svæði.
Ef http.Client er þegar deilt af samhliða beiðnum skaltu halda Transport svæðinu stöðugu. Umbúðirnar geta samstillt hvaða fullstillti flutningsaðili fær hverja síðari ferð:
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()
}Með net/http og sync skaltu frumstilla hann áður en biðlarinn er birtur:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport og nextTransport verða að vera ekki-nil, fullstilltir og öruggir með tilliti til samhliða keyrslu. Byggðu hvern proxy flutningsaðila áður en hann er birtur og lát stillingar hans óbreyttar meðan beiðnir nota hann.
Lásinn verndar aðeins bendisneiðmyndina, svo hæg beiðni heldur ekki leiðarlásnum allan sinn netskipti. Beiðni sem þegar notar fyrri sneiðmyndina heldur áfram á þeim flutningsaðila; skiptingin endurspilar hana ekki né færir tengingu hennar.
Haltu og lætur gamla flutningsaðila fara í gegnum takmarkaðan lífsferil forritsins, leyfðu vinnu í gangi að klárast og lokaðu aðgerðalausum laugum þegar við á. Endurbeining getur valdið annarri RoundTrip eftir skiptingu. Ef heilt vinnuflæði þarf eina leið skaltu úthluta þeirri leið við mörk vinnuflæðisins í stað þess að breyta þessum sameiginlega vali um mitt.