Go HTTP proxy bidebide aldaketa Client.Transport ukitu gabe
Erabili sinkronizatutako RoundTripper bilgarri bat proxy garraio konfiguratu berri bat argitaratzeko, lanean dagoen http.Client eremu bat aldatu gabe.
http.Client bat aldi bereko eskaerek jada partekatzen badute, mantendu haren Transport eremua egonkor. Bilgarri batek sinkroniza dezake zein garraio erabat konfiguratuk jasotzen duen hurrengo joan-etorri bakoitzak:
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()
}net/http eta sync erabiliz, hasieratu ezazu bezeroa argitaratu aurretik:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport eta nextTransport ez-nil, erabat konfiguratutako eta konkurrentziarekiko seguruak diren joan-etorrien exekutatzaileak izan behar dira. Eraiki proxy garraio bakoitza argitaratu aurretik, eta utzi haren konfigurazioa aldatu gabe eskaerek erabiltzen duten bitartean.
Blokeoak erakuslearen snapshot-a bakarrik babesten du, beraz eskaera geldo batek ez du bideratze-blokeoa mantentzen bere sare-trukaketa osoan. Aurreko snapshot-a erabiltzen duen eskaera garraio horretan jarraitzen du; aldaketak ez du berriro exekutatzen ez eta haren konexioa mugitzen.
Mantendu eta erretiratu garraio zaharrak aplikazioaren bizi-ziklo mugatuaren bidez, martxan dagoen lana amaitzen utziz eta alferrikako igerilekuak egoki denean itxiz. Birbideratze batek beste RoundTrip bat eragin dezake aldaketaren ondoren. Lan-fluxu oso batek bide bakarra behar badu, esleitu bide hori lan-fluxuaren mugan, hautatzaile partekatu hau erditik aldatzen ibili beharrean.