Ndrysho rrugët e proxy HTTP të Go pa modifikuar Client.Transport
Përdorni një mbështjellës RoundTripper të sinkronizuar për të publikuar një transport proxy të konfiguruar të ri pa modifikuar një fushë http.Client aktive.
Nëse një http.Client ndahet tashmë nga kërkesa paralele, mbani fushën e tij Transport të qëndrueshme. Një mbështjellës mund të sinkronizojë cili transport plotësisht i konfiguruar merr çdo vajtje-ardhje pasuese:
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()
}Me net/http dhe sync, inicializojeni para se të publikoni klientin:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport dhe nextTransport duhet të jenë jo-nil, plotësisht të konfiguruar dhe të sigurt ndaj paralelizmit. Ndërtoni çdo transport proxy para se ta publikoni dhe lini konfigurimin e tij të pandryshuar ndërsa kërkesat e përdorin.
Kyçja mbron vetëm pamjen e treguesit, kështu që një kërkesë e ngadaltë nuk e mban kyçjen e rrugëzimit gjatë gjithë shkëmbimit të saj të rrjetit. Një kërkesë që përdor tashmë pamjen e mëparshme vazhdon në atë transport; ndërrimi nuk e riekzekuton atë dhe nuk e zhvendos lidhjen e saj.
Mbani dhe tërhiqni transportet e vjetra përmes ciklit të kufizuar të jetës së aplikacionit, duke lejuar përfundimin e punës në rrjedhë dhe duke mbyllur grupet e papunë kur është e përshtatshme. Një ridrejtim mund të shkaktojë një RoundTrip tjetër pas një ndërrimi. Nëse një rrjedhë e tërë punë kërkon një rrugë të vetme, caktojeni atë në kufirin e rrjedhës së punës në vend që të ndryshoni këtë përzgjedhës të përbashkët në mes të rrugës.