Skifta Go HTTP-proxy-rútur uttan at broyta Client.Transport
Nýt ein samskipaðan RoundTripper-innpakning at geva eina nýggja uppsetta proxy-flutningsleið út uttan at broyta eitt virkið http.Client-felt.
Um ein http.Client longu er deildur millum samtíðar fyrispurningar, halt tá hansara Transport-felt støðugt. Ein innpakning kann samskipa, hvørja fullkomið uppsetta flutningsleið hvør seinni ferð fær:
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()
}Við net/http og sync, set hana í gongd áðrenn tú gevur klientin út:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport og nextTransport mugu vera ikki-nil, fullkomið uppsett og samtíðar-trygg útførara av ferðum. Bygg hvørja proxy-flutningsleið áðrenn tú gevur hana út, og lat uppsetingina vera óbroytta meðan fyrispurningar nýta hana.
Lásið verndar bert peikara-avbjóðingina, so ein sein fyrispurning heldur ikki rutingarlásinum alt sítt netverksbýti. Ein fyrispurningur, ið longu nýtir fyrru avbjóðingina, heldur fram á tí flutningsleiðini; skiftið spælir hann ikki av nýggjari ella flytur sambandið hansara.
Varðveit og tak eldri flutningsleiðir úr gildi gjøgnum avmarkaða lívsskeið hjá tólínum, lat arbeiði, ið er í gongd, vera liðugt og lat tómar hyljar aftur, tá tað hóskar. Ein endurvísing kann elva til eina aðra RoundTrip eftir eitt skifti. Um ein heil arbeiðsflæði krevur eina rútu, sett ta rútuna á markið hjá arbeiðsflæðinum heldur enn at broyta hendan deilda veljaran mitt í ferðini.