የGo HTTP ፕሮክሲ መንገዶችን Client.Transport ሳይቀየር መቀየር
የተመሳሰለ የRoundTripper መሸፈኛ ተጠቅመህ አዲስ የተዋቀረ የፕሮክሲ ማጓጓዣ አውጣ፣ ያለውን http.Client መስክ ሳትቀይር።
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 ባዶ ያልሆኑ፣ ሙሉ በሙሉ የተዋቀሩ እና ለተመሳሳይ ጊዜ ሥራ ደህንነታቸው የተጠበቀ ዙር ማጓጓዣዎች መሆን አለባቸው። እያንዳንዱን የፕሮክሲ ማጓጓዣ ከማውጣትህ በፊት ገንባ፣ ጥያቄዎችም እሱን እየተጠቀሙበት እያለ ውቅሩን አትቀይር።
መቆለፊያው የሚጠብቀው የጠቋሚውን ቅጽበታዊ ምስል ብቻ ነው፣ ስለዚህ ቀርፋፋ ጥያቄ በመላው የኔትወርክ ልውውጡ የማዞሪያ መቆለፊያውን አይይዝም። ቀደም ሲል ያለውን ምስል የሚጠቀም ጥያቄ በዚያ ማጓጓዣ ላይ ይቀጥላል፤ መቀየሪያው እንደገና አይጫወተውም ወይም ግንኙነቱን አያንቀሳቅስም።
የቆዩ ማጓጓዣዎችን በመተግበሪያው የተወሰነ የሕይወት ዑደት በኩል አቆይና አስወግድ፣ በሂደት ላይ ያለው ሥራ እንዲጠናቀቅ ፈቅደህ ተስማሚ ሆኖ ከሆነ ስራ ፈት የሆኑ ማከማቻዎችን ዝጋ። ከመቀየር በኋላ የአቅጣጫ ማስተካከያ ሌላ RoundTrip ሊያስከትል ይችላል። አንድ ሙሉ የሥራ ፍሰት አንድ መንገድ ከሚፈልግ፣ ይህን የጋራ መራጭ በመንገድ ላይ ከመቀየር ይልቅ መንገዱን በየሥራ ፍሰቱ ወሰን ላይ መድብ።