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.

Verwante artikels