Palitan ang mga ruta ng proxy na HTTP ng Go nang hindi binabago ang Client.Transport
Gumamit ng naka-synchronize na RoundTripper wrapper upang ilathala ang bagong naka-configure na proxy transport nang hindi binabago ang isang live na field ng http.Client.
Kung ang isang http.Client ay ibinabahagi na ng mga kasabay na kahilingan, panatilihing matatag ang field nitong Transport. Maaaring i-synchronize ng wrapper kung aling ganap na naka-configure na transport ang natatanggap ng bawat susunod na paglalakbay:
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()
}Gamit ang net/http at sync, i-initialize ito bago ilathala ang kliyente:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)Ang initialTransport at nextTransport ay dapat non-nil, ganap na naka-configure, at ligtas sa sabay-sabay na paggamit. Buuin ang bawat proxy transport bago ito ilathala, at iwanang hindi nagbabago ang configuration nito habang ginagamit ito ng mga kahilingan.
Pinoprotektahan ng lock ang snapshot ng pointer lamang, kaya ang mabagal na kahilingan ay hindi humahawak sa routing lock sa buong palitan nito sa network. Ang kahilingang gumagamit na ng naunang snapshot ay nagpapatuloy sa transport na iyon; hindi ito inuulit ng paglipat at hindi inililipat ang koneksyon nito.
Panatilihin at iretiro ang mga lumang transport sa loob ng limitadong lifecycle ng application, hayaang matapos ang gawaing tumatakbo, at isara ang mga idle pool kapag angkop. Ang isang redirect ay maaaring magdulot ng isa pang RoundTrip pagkatapos ng paglipat. Kung ang buong workflow ay nangangailangan ng isang ruta, italaga ang rutang iyon sa hangganan ng workflow sa halip na baguhin ang shared selector na ito sa kalagitnaan.