Als een http.Client al door gelijktijdige verzoeken wordt gedeeld, houd het Transport-veld stabiel. Een wrapper kan synchroniseren welk volledig geconfigureerd transport elke volgende ronde ontvangt:

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()
}

Met net/http en sync initialiseert u het voordat de client wordt gepubliceerd:

slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}

slot.Set(nextTransport)

initialTransport en nextTransport moeten niet-nil, volledig geconfigureerd en gelijktijdigheidsveilig zijn. Bouw elk proxytransport voordat u het publiceert, en laat de configuratie ongewijzigd terwijl verzoeken het gebruiken.

De vergrendeling beschermt alleen de pointer-snapshot, dus een traag verzoek houdt de routeringsvergrendeling niet gedurende de hele netwerkuitwisseling vast. Een verzoek dat al de vorige snapshot gebruikt, gaat verder op dat transport; de wisseling herhaalt het niet en verplaatst de verbinding niet.

Behoud en ontmantel oude transporten via de begrensde levenscyclus van de applicatie, laat lopend werk afronden en sluit inactieve pools wanneer dat passend is. Een omleiding kan na een wisseling nog een RoundTrip veroorzaken. Als een hele workflow één route nodig heeft, wijs die route dan toe bij de grens van de workflow in plaats van deze gedeelde selector halverwege te wijzigen.

Gerelateerde artikelen