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 non-nil, સંપૂર્ણ કન્ફિગર કરેલા અને સમાંતરતા માટે સુરક્ષિત રાઉન્ડ ટ્રિપર હોવા જોઈએ. દરેક પ્રોક્સી ટ્રાન્સપોર્ટ પ્રકાશિત કરતાં પહેલાં બનાવો, અને વિનંતીઓ તેનો ઉપયોગ કરે ત્યાં સુધી તેનું કન્ફિગરેશન અબદલ રાખો.
લોક ફક્ત પોઇન્ટર સ્નેપશોટનું રક્ષણ કરે છે, તેથી ધીમી વિનંતી તેના આખા નેટવર્ક વિનિમય દરમિયાન રૂટિંગ લોક પકડી રાખતી નથી. પહેલાનું સ્નેપશોટ વાપરતી વિનંતી તે જ ટ્રાન્સપોર્ટ પર ચાલુ રહે છે; સ્વિચ તેને ફરી ચલાવતું નથી કે તેનું કનેક્શન ખસેડતું નથી.
એપ્લિકેશનના મર્યાદિત જીવનચક્ર દરમિયાન જૂના ટ્રાન્સપોર્ટ રાખો અને નિવૃત્ત કરો, ચાલુ કામ પૂરું થવા દો અને યોગ્ય હોય ત્યારે નિષ્ક્રિય પૂલ બંધ કરો. રીડાયરેક્ટ સ્વિચ પછી બીજું RoundTrip કરી શકે છે. જો આખા વર્કફ્લોને એક રૂટની જરૂર હોય, તો આ શેર કરેલ સિલેક્ટર અડધા રસ્તે બદલવાને બદલે વર્કફ્લોની સીમા પર તે રૂટ સોંપો.