Client.Transport'ту өзгөртпөстөн Go HTTP прокси маршруттарын которуу
Жандуу http.Client талаасын өзгөртпөстөн жаңы конфигурацияланган прокси транспортун жарыялоо үчүн синхрондоштурулган RoundTripper каптамасын колдонуңуз.
Эгер 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 жаратышы мүмкүн. Эгер бүтүндөй жумуш агымы бир маршрутту талап кылса, бул жалпы селекторду жарым жолдо өзгөртүүнүн ордуна маршрутту жумуш агымынын чек арасында дайындаңыз.