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.

Erthyglau cysylltiedig