Newid llwybrau proesi HTTP Go heb newid Client.Transport
Defnyddiwch lapio RoundTripper wedi'i gysoni i gyhoeddi cludydd proesi wedi'i ffurfweddu o'r newydd heb newid maes http.Client byw.
Os yw http.Client eisoes yn cael ei rannu gan geisiadau cydredol, cadwch ei faes Transport yn sefydlog. Gall lapio gysoni pa gludydd sydd wedi'i ffurfweddu'n llawn a gaiff pob taith ddilynol:
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()
}Gan ddefnyddio net/http a sync, cychwynnwch ef cyn cyhoeddi'r cleient:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)Rhaid i initialTransport a nextTransport fod yn gludwyr cylchdaith nad ydynt yn nil, wedi'u ffurfweddu'n llawn ac yn ddiogel o ran cydrededd. Adeiladwch bob cludydd proesi cyn ei gyhoeddi, a gadewch ei ffurfweddiad heb ei newid tra bod ceisiadau yn ei ddefnyddio.
Dim ond ciplun y pwyntiwr y mae'r clo yn ei ddiogelu, felly nid yw cais araf yn dal y clo llwybro am ei holl gyfnewid rhwydwaith. Mae cais sydd eisoes yn defnyddio'r ciplun blaenorol yn parhau ar y cludydd hwnnw; nid yw'r newid yn ei ailchwarae nac yn symud ei gysylltiad.
Cadwch a dewch â chludwyr hen i ben drwy gylch bywyd cyfyngedig y cymhwysiad, gan adael i waith ar y gweill orffen a chau pyllau segur pan fo'n briodol. Gall ailgyfeiriad achosi RoundTrip arall ar ôl newid. Os oes angen un llwybr ar holl lif gwaith, pennwch y llwybr hwnnw ar ffin y llif gwaith yn lle newid y detholydd a rennir hwn yn ei hanner.