Go HTTP-Proxy-Strecken änneren, ouni Client.Transport ze veränneren
Benotzt eng synchroniséiert RoundTripper-Ëmhüllung, fir en nei konfiguréierten Proxy-Transport ze publizéieren, ouni en aktivt http.Client-Feld ze veränneren.
Wann en http.Client schonn duerch gläichzäiteg Ufroe gedeelt gëtt, halen säin Transport-Feld stabil. Eng Ëmhüllung kann synchroniséieren, wéi en Transport, dee vollstänneg konfiguréiert ass, all weider Hi- an Herrees kritt:
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()
}Mat net/http a sync initialiséiert een et, ier de Client publizéiert gëtt:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport an nextTransport mussen non-nil, vollstänneg konfiguréiert a gläichzäiteg sécher Hi- an Herausféierer sinn. Baut all Proxy-Transport, ier en publizéiert gëtt, a loosst seng Konfiguratioun onverännert, wärend Ufroe se benotzen.
De Spär schützt nëmmen de Pointer-Snapshot, sou datt eng lues Ufro de Routing-Spär net wärend hirem ganzen Netzwierkaustausch hält. Eng Ufro, déi schonn de virege Snapshot benotzt, geet op deem Transport weider; d'Ëmschaltung spillt se net nach eng Kéier of a verréckelt och net hir Verbindung.
Halt a pensionéiert al Transporten duerch de limitéierten Liewenszyklus vun der Applikatioun, loosst lafend Aarbecht fäerdeg ginn a schléisst Idle-Pools, wann et geet. Eng Ëmleitung kann no enger Ëmschaltung nach eng RoundTrip verursaachen. Wann e ganzen Workflow eng Streck brauch, weist déi Streck op der Grenz vum Workflow zou, amplaz dëse gedeelte Selekter an der Mëtt ze änneren.