Wissel Go HTTP-proksiéroetes sonder om Client.Transport te verander
'n Gesinkroniseerde RoundTripper-omhulsel publiseer 'n nuwe gekonfigureerde proksievervoer sonder om 'n lewendige http.Client-veld te verander.
As 'n http.Client reeds deur gelyktydige versoeke gedeel word, hou sy Transport-veld stabiel. 'n Omhulsel kan sinkroniseer watter volledig gekonfigureerde vervoer elke latere rondte ontvang:
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()
}Gebruik net/http en sync en initialiseer dit voordat jy die kliënt publiseer:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport en nextTransport moet nie-nul, volledig gekonfigureerde, gelyktydigheidsveilige vervoerders wees. Bou elke proksievervoer voordat jy dit publiseer, en laat sy konfigurasie onveranderd terwyl versoeke dit gebruik.
Die slot beskerm slegs die wysermomentopname, so 'n stadige versoek hou nie die roeteringslot vir sy hele netwerkuitruiling nie. 'n Versoek wat reeds die vorige momentopname gebruik, gaan op daardie vervoer voort; die skakelaar herspeel dit nie en skuif nie sy verbinding nie.
Behou en onttrek ou vervoerders deur die toepassing se begrensde lewensiklus, laat werk wat aan die gang is klaarmaak en sluit ledige poele wanneer gepas. 'n Aansturing kan ná 'n skakelaar nog 'n RoundTrip veroorsaak. As 'n hele werkstroom een roete vereis, wys daardie roete by die werkstroomgrens toe in plaas daarvan om hierdie gedeelde keuse halfpad te verander.