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 үүсгэж болно. Хэрэв бүх ажлын урсгалд нэг маршрут хэрэгтэй бол энэ хуваалцсан сонгогчийг дунд нь өөрчлөхийн оронд маршрутыг ажлын урсгалын хязгаарт онооно уу.