Viss ein http.Client allereie er delt av samtidige førespurnader, hald Transport-feltet stabilt. Ei innpakning kan synkronisere kva for ein fullt konfigurert transport kvar seinare rundtur får:

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

Med net/http og sync, initialiser han før klienten blir publisert:

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

slot.Set(nextTransport)

initialTransport og nextTransport må vere ikkje-nil, fullt konfigurerte og samtidigheitstrygge rundtursutførarar. Bygg kvar proxytransport før han blir publisert, og lat konfigurasjonen vere uendra medan førespurnader brukar han.

Låsen vernar berre augneblinksbiletet av peikaren, så ein treg førespurnad held ikkje rutingslåsen gjennom heile nettverksutvekslinga. Ein førespurnad som allereie brukar det førre augneblinksbiletet, held fram på den transporten; bytet spelar han ikkje av på nytt eller flyttar tilkoplinga hans.

Hald på og avvikle gamle transportar gjennom den avgrensa livssyklusen til applikasjonen, lat pågåande arbeid fullførast og lukk ledige basseng når det passar. Ei omdirigering kan føre til ein ny RoundTrip etter eit byte. Viss ein heil arbeidsflyt treng éin rute, tildel han ved grensa til arbeidsflyten i staden for å endre denne delte veljaren midtvegs.

Relaterte artiklar