ئەگەر http.Client ئاللىبۇرۇن قوشۇمچە تەلەپلەر تەرىپىدىن ئورتاقلىشىۋاتقان بولسا، ئۇنىڭ Transport ئېتىزىنى مۇقىم ساقلاڭ. قاپلىما ھەر كېيىنكى ئايلىنىشنىڭ قايسى پۈتۈن سەپلەنگەن توشۇغۇچىنى ئالىدىغانلىقىنى ماسلاشتۇرالايدۇ:

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 ۋە sync نى ئىشلىتىپ، خېرىدارنى ئېلان قىلىشتىن بۇرۇن ئۇنى قوزغىتىڭ:

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

slot.Set(nextTransport)

initialTransport ۋە nextTransport تېخىمۇ nil بولماسلىقى، پۈتۈن سەپلەنگەن ۋە قوشۇمچىلىققا بىخەتەر بولۇشى كېرەك. ھەر بىر پروكسىي توشۇغۇچىنى ئېلان قىلىشتىن بۇرۇن قۇرۇڭ، تەلەپلەر ئۇنى ئىشلىتىۋاتقاندا سەپلىمىسىنى ئۆزگەرتمەڭ.

قۇلۇپ پەقەت كۆرسەتكۈچ سۈرىتىنى قوغدايدۇ، شۇڭا ئاستا تەلەپ پۈتۈن تور ئالماشتۇرۇش جەريانىدا يول باشلاش قۇلۇپىنى تۇتمايدۇ. ئالدىنقى سۈرەتنى ئىشلىتىۋاتقان تەلەپ شۇ توشۇغۇچىدا داۋاملىشىدۇ؛ ئالماشتۇرۇش ئۇنى قايتا ئىجرا قىلمايدۇ ۋە ئۇلىنىشىنى يۆتكىمەيدۇ.

كونا توشۇغۇچىلارنى ئەپنىڭ چەكلەنگەن ھايات دەۋرى بويىچە ساقلاپ ۋە ئىستېپا قىلىپ، داۋاملىشىۋاتقان خىزمەتنىڭ تاماملىنىشىغا يول قويۇڭ ۋە مۇۋاپىق بولغاندا بىكار ئامبارلارنى تاقاڭ. قايتا يۆلەش ئالماشتۇرۇشتىن كېيىن يەنە بىر RoundTrip نى كەلتۈرۈپ چىقىرىشى مۇمكىن. ئەگەر پۈتۈن خىزمەت ئېقىمى بىر يولنى تەلەپ قىلسا، بۇ ئورتاق تاللىغۇچنى يېرىم يولدا ئۆزگەرتىشنىڭ ئورنىغا شۇ يولنى خىزمەت ئېقىمىنىڭ چېگرىسىدا تەيىنلەڭ.

مۇناسىۋەتلىك ماقالىلەر