कॉर्पोरेट Java एप्लिकेशन नियमित रूप से बाहरी API से संपर्क करते हैं, डेटा पार्स करते हैं या अलग-अलग कॉर्पोरेट नेटवर्क में काम करते हैं — और इन सभी मामलों में किसी न किसी समय प्रॉक्सी सर्वर के माध्यम से ट्रैफ़िक रूट करने का सवाल उठता है। Java में प्रॉक्सी सेटअप करना एक सरल कार्य लगता है, जब तक आप यह नहीं देखते कि RestTemplate, OkHttp और WebClient अलग-अलग व्यवहार करते हैं, और JVM सिस्टम प्रॉपर्टीज हर जगह काम नहीं करती हैं। इस गाइड में — कोड के विशिष्ट उदाहरण, संभावित समस्याओं की व्याख्या और विभिन्न कार्यों के लिए प्रॉक्सी के प्रकार का चयन करने की सिफारिशें।
Java एप्लिकेशनों को प्रॉक्सी की आवश्यकता क्यों है
Java कॉर्पोरेट विकास की प्रमुख भाषाओं में से एक बना हुआ है। Spring Boot सेवाएँ, माइक्रोसर्विस आर्किटेक्चर, बैच कार्य, ETL पाइपलाइन्स — ये सभी नियमित रूप से बाहरी दुनिया में HTTP अनुरोध करते हैं। और इन सभी परिदृश्यों में, प्रॉक्सी एक विशिष्ट कार्य को हल करता है:
- अनिवार्य प्रॉक्सी गेटवे के साथ कॉर्पोरेट नेटवर्क। कई कंपनियों में, सभी आउटगोइंग ट्रैफ़िक कॉर्पोरेट प्रॉक्सी (Squid, Zscaler, BlueCoat) के माध्यम से गुजरता है। इसके बिना सेटअप, एप्लिकेशन इंटरनेट पर नहीं जा पाएगा।
- डेटा पार्सिंग और संग्रहण। सेवाएँ जो बाहरी साइटों से डेटा एकत्र करती हैं (कीमतें, उद्धरण, समाचार), प्रॉक्सी का उपयोग करती हैं ताकि वे दर-सीमा और IP द्वारा अवरोधों को बायपास कर सकें।
- भौगोलिक परीक्षण। QA टीमें यह जांचती हैं कि API या साइट विभिन्न क्षेत्रों से कैसे व्यवहार करती है — प्रॉक्सी एक आवश्यक देश से अनुरोध का अनुकरण करने की अनुमति देती है।
- लक्षित API के पक्ष पर सीमाओं को बायपास करना। कुछ बाहरी API में एक IP से अनुरोधों की संख्या पर सीमाएँ होती हैं। प्रॉक्सी रोटेशन लोड को वितरित करने की अनुमति देती है।
- सुरक्षा और अनामकरण। बाहरी सेवाओं से संपर्क करते समय एप्लिकेशन के वास्तविक IP को छिपाना संवेदनशील एकीकरण के लिए एक मानक प्रथा है।
कार्य के आधार पर, Java में प्रॉक्सी सेटअप के दृष्टिकोण काफी भिन्न होते हैं। JVM के वैश्विक सिस्टम प्रॉपर्टीज़ सबसे सरल विकल्प हैं, लेकिन यह कुछ HTTP क्लाइंट के साथ काम नहीं करता है। OkHttp और WebClient को स्पष्ट कॉन्फ़िगरेशन की आवश्यकता होती है। हम प्रत्येक मामले को क्रम से समझेंगे।
JVM सिस्टम प्रॉपर्टीज़ के माध्यम से वैश्विक सेटअप
Java एप्लिकेशन के सभी HTTP ट्रैफ़िक को प्रॉक्सी के माध्यम से निर्देशित करने का सबसे तेज़ तरीका JVM सिस्टम प्रॉपर्टीज़ का उपयोग करना है। यह मानक HttpURLConnection और कई पुस्तकालयों के लिए काम करता है जो इसके तहत उपयोग करते हैं।
प्रॉक्सी सेट करने के कई तरीके हैं:
1. JVM के तर्कों के माध्यम से प्रारंभ करते समय:
java -Dhttp.proxyHost=proxy.example.com \
-Dhttp.proxyPort=8080 \
-Dhttps.proxyHost=proxy.example.com \
-Dhttps.proxyPort=8080 \
-Dhttp.nonProxyHosts="localhost|127.0.0.1|*.internal.corp" \
-jar myapp.jar
2. एप्लिकेशन कोड के माध्यम से (उदाहरण के लिए, main विधि या @PostConstruct में):
System.setProperty("http.proxyHost", "proxy.example.com");
System.setProperty("http.proxyPort", "8080");
System.setProperty("https.proxyHost", "proxy.example.com");
System.setProperty("https.proxyPort", "8080");
// अपवाद — वे होस्ट जो प्रॉक्सी के माध्यम से नहीं जाने चाहिए
System.setProperty("http.nonProxyHosts", "localhost|127.0.0.1|*.internal.corp");
3. Spring Boot में application.properties फ़ाइल के माध्यम से (इसके बाद @PostConstruct के माध्यम से लागू किया गया):
# application.properties proxy.host=proxy.example.com proxy.port=8080 proxy.username=user proxy.password=secret
⚠️ जानना महत्वपूर्ण है
JVM सिस्टम प्रॉपर्टीज़ केवल HttpURLConnection के लिए काम करती हैं। OkHttp, Apache HttpClient और Reactor Netty (WebClient) इन प्रॉपर्टीज़ को नजरअंदाज करते हैं — उनके लिए स्पष्ट कॉन्फ़िगरेशन की आवश्यकता होती है, जैसा कि नीचे वर्णित है।
यदि प्रॉक्सी प्रमाणीकरण की आवश्यकता है, तो Authenticator का उपयोग करें:
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType() == RequestorType.PROXY) {
return new PasswordAuthentication("username", "password".toCharArray());
}
return null;
}
});
Spring Boot में प्रॉक्सी: RestTemplate और Apache HttpClient
RestTemplate — Spring में मानक समकालिक HTTP क्लाइंट है। यह डिफ़ॉल्ट रूप से SimpleClientHttpRequestFactory का उपयोग करता है, जो HttpURLConnection पर निर्भर करता है और JVM सिस्टम प्रॉपर्टीज़ को पढ़ता है। लेकिन अधिक लचीली सेटिंग (टाइमआउट, कनेक्शन पूल, प्रमाणीकरण के साथ प्रॉक्सी) के लिए, Apache HttpClient को बैकएंड के रूप में उपयोग करने की सिफारिश की जाती है।
Maven में निर्भरता:
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3.1</version>
</dependency>
Apache HttpClient 5 के माध्यम से प्रॉक्सी के साथ RestTemplate कॉन्फ़िगरेशन:
@Configuration
public class RestTemplateConfig {
@Value("${proxy.host}")
private String proxyHost;
@Value("${proxy.port}")
private int proxyPort;
@Value("${proxy.username:}")
private String proxyUsername;
@Value("${proxy.password:}")
private String proxyPassword;
@Bean
public RestTemplate restTemplate() {
HttpHost proxy = new HttpHost("http", proxyHost, proxyPort);
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
if (!proxyUsername.isEmpty()) {
credentialsProvider.setCredentials(
new AuthScope(proxyHost, proxyPort),
new UsernamePasswordCredentials(proxyUsername, proxyPassword.toCharArray())
);
}
CloseableHttpClient httpClient = HttpClients.custom()
.setProxy(proxy)
.setDefaultCredentialsProvider(credentialsProvider)
.build();
HttpComponentsClientHttpRequestFactory factory =
new HttpComponentsClientHttpRequestFactory(httpClient);
factory.setConnectTimeout(5000);
factory.setReadTimeout(10000);
return new RestTemplate(factory);
}
}
यह कॉन्फ़िगरेशन प्रॉक्सी के पैरामीटर को application.properties या पर्यावरण चर में निकालने की अनुमति देती है, जो विभिन्न प्रॉक्सी के साथ prod/staging/dev वातावरण के लिए महत्वपूर्ण है।
यदि आप चाहते हैं कि कुछ अनुरोध प्रॉक्सी के माध्यम से जाएँ, और कुछ सीधे, तो अलग-अलग नामों के साथ दो अलग-अलग RestTemplate बिन बनाएं और आवश्यक के लिए @Qualifier का उपयोग करें।
Spring WebClient में प्रॉक्सी (रिएक्टिव स्टैक)
WebClient — Spring का रिएक्टिव HTTP क्लाइंट है, जो Reactor Netty पर आधारित है। यह प्रॉक्सी के लिए JVM सिस्टम प्रॉपर्टीज़ को नहीं पढ़ता है — सेटअप ProxyProvider के माध्यम से क्लाइंट बनाने के समय किया जाता है।
निर्भरता (spring-boot-starter-webflux में शामिल है):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
HTTP प्रॉक्सी के साथ WebClient का कॉन्फ़िगरेशन:
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
HttpClient httpClient = HttpClient.create()
.proxy(proxy -> proxy
.type(ProxyProvider.Proxy.HTTP)
.host("proxy.example.com")
.port(8080)
.username("user")
.password(user -> "password")
);
ClientHttpConnector connector =
new ReactorClientHttpConnector(httpClient);
return WebClient.builder()
.clientConnector(connector)
.build();
}
}
WebClient में SOCKS5 प्रॉक्सी के लिए:
HttpClient httpClient = HttpClient.create()
.proxy(proxy -> proxy
.type(ProxyProvider.Proxy.SOCKS5)
.host("socks5.proxy.example.com")
.port(1080)
.username("user")
.password(user -> "password")
);
💡 कॉन्फ़िगरेशन के लिए सुझाव
रिएक्टिव एप्लिकेशनों में अक्सर विभिन्न बाहरी सेवाओं के लिए विभिन्न प्रॉक्सी के साथ कई WebClient के उदाहरण बनाने की आवश्यकता होती है। WebClient.Builder का उपयोग प्रोटोटाइप बिन के रूप में करें और .mutate() के माध्यम से सेटिंग्स को ओवरराइड करें।
OkHttp में प्रॉक्सी सेटअप
OkHttp — एक लोकप्रिय HTTP पुस्तकालय है, जिसका उपयोग कई Java और Android एप्लिकेशनों द्वारा किया जाता है, साथ ही कुछ Spring एकीकरण (जैसे, Feign के साथ OkHttp बैकएंड)। इसमें प्रॉक्सी सेटअप का अपना तंत्र है और यह भी JVM सिस्टम प्रॉपर्टीज़ को नहीं पढ़ता है।
OkHttp में HTTP/HTTPS प्रॉक्सी का बुनियादी सेटअप:
import okhttp3.*;
import java.net.InetSocketAddress;
import java.net.Proxy;
// प्रॉक्सी बनाना
Proxy proxy = new Proxy(
Proxy.Type.HTTP,
new InetSocketAddress("proxy.example.com", 8080)
);
// प्रॉक्सी प्रमाणीकरण
Authenticator proxyAuthenticator = (route, response) -> {
String credential = Credentials.basic("username", "password");
return response.request().newBuilder()
.header("Proxy-Authorization", credential)
.build();
};
// क्लाइंट बनाना
OkHttpClient client = new OkHttpClient.Builder()
.proxy(proxy)
.proxyAuthenticator(proxyAuthenticator)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
// अनुरोध का उदाहरण
Request request = new Request.Builder()
.url("https://api.example.com/data")
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.body().string());
}
Spring Boot के माध्यम से बिन के साथ OkHttp का एकीकरण:
@Configuration
@ConditionalOnProperty(name = "proxy.enabled", havingValue = "true")
public class OkHttpConfig {
@Value("${proxy.host}")
private String proxyHost;
@Value("${proxy.port}")
private int proxyPort;
@Bean
public OkHttpClient okHttpClient() {
Proxy proxy = new Proxy(
Proxy.Type.HTTP,
new InetSocketAddress(proxyHost, proxyPort)
);
return new OkHttpClient.Builder()
.proxy(proxy)
.connectionPool(new ConnectionPool(10, 5, TimeUnit.MINUTES))
.build();
}
}
@ConditionalOnProperty पर ध्यान दें — यह प्रॉक्सी को केवल आवश्यक वातावरण में कॉन्फ़िगर करने की अनुमति देता है, बिना कोड को बदले।
यदि आप OkHttp का उपयोग डेटा पार्सिंग के लिए रिज़िडेंट प्रॉक्सी के साथ कर रहे हैं, तो कनेक्शन पूल को सही तरीके से सेटअप करना महत्वपूर्ण है। रिज़िडेंट प्रॉक्सी अक्सर डेटा सेंटर प्रॉक्सी की तुलना में अधिक लेटेंसी रखते हैं, इसलिए टाइमआउट बढ़ाएँ और पूल के आकार को घटाएँ ताकि उपलब्ध कनेक्शन समाप्त न हों।
Java में SOCKS5 प्रॉक्सी: विशेषताएँ और उदाहरण
SOCKS5 — HTTP प्रॉक्सी की तुलना में एक निम्न-स्तरीय प्रोटोकॉल है। यह परिवहन स्तर पर काम करता है और किसी भी प्रोटोकॉल (HTTP, HTTPS, FTP आदि) का समर्थन करता है, साथ ही प्रॉक्सी के पक्ष पर DNS रिज़ॉल्विंग भी करता है। Java एप्लिकेशनों के लिए SOCKS5 विशेष रूप से उपयोगी है जब HTTP के अलावा अन्य TCP कनेक्शनों को प्रॉक्सी करना आवश्यक हो।
JVM सिस्टम प्रॉपर्टीज़ के माध्यम से SOCKS5:
System.setProperty("socksProxyHost", "socks5.proxy.example.com");
System.setProperty("socksProxyPort", "1080");
System.setProperty("java.net.socks.username", "user");
System.setProperty("java.net.socks.password", "password");
OkHttp में SOCKS5 (java.net.Proxy के माध्यम से):
Proxy socks5Proxy = new Proxy(
Proxy.Type.SOCKS,
new InetSocketAddress("socks5.proxy.example.com", 1080)
);
OkHttpClient client = new OkHttpClient.Builder()
.proxy(socks5Proxy)
.build();
SOCKS5 और DNS की एक महत्वपूर्ण विशेषता: डिफ़ॉल्ट रूप से, Java DNS को स्थानीय रूप से रिज़ॉल्व करता है, और प्रॉक्सी के माध्यम से पहले से ही IP पता भेजता है। यह वास्तविक DNS अनुरोध को उजागर कर सकता है। यदि DNS रिज़ॉल्विंग को भी प्रॉक्सी के माध्यम से भेजना है, तो OkHttp के साथ निम्नलिखित दृष्टिकोण का उपयोग करें:
// कस्टम DNS, जो SOCKS5 के माध्यम से रिज़ॉल्विंग को मजबूर करता है
OkHttpClient client = new OkHttpClient.Builder()
.proxy(socks5Proxy)
.dns(hostname -> {
// अनरिज़ॉल्व किया गया होस्ट लौटाएँ — OkHttp इसे प्रॉक्सी को भेजेगा
return Collections.singletonList(InetAddress.getByName(hostname));
})
.build();
SOCKS5 बनाम HTTP प्रॉक्सी कब चुनें
| मानदंड | HTTP प्रॉक्सी | SOCKS5 प्रॉक्सी |
|---|---|---|
| प्रोटोकॉल | HTTP/HTTPS | कोई भी TCP/UDP |
| DNS प्रॉक्सी के माध्यम से | क्रियान्वयन पर निर्भर करता है | समर्थित |
| Java के साथ संगतता | नैटिव | नैटिव (java.net.Proxy.Type.SOCKS) |
| उपयोग | कॉर्पोरेट गेटवे, वेब पार्सिंग | अनामकरण, गैर-मानक प्रोटोकॉल |
Java एप्लिकेशनों में प्रॉक्सी रोटेशन
यदि एप्लिकेशन एक ही संसाधन पर कई अनुरोध करता है, तो एक प्रॉक्सी IP का उपयोग जल्दी से अवरुद्ध हो जाएगा। प्रॉक्सी रोटेशन — विभिन्न IP पतों के बीच स्विच करना — इस समस्या को हल करता है। Java में इसे कई तरीकों से लागू किया जा सकता है।
विकल्प 1: रोटेटिंग प्रॉक्सी एंडपॉइंट के माध्यम से रोटेशन
सबसे सरल दृष्टिकोण — एक प्रॉक्सी प्रदाता का उपयोग करना है जिसमें एकल एंडपॉइंट होता है, जो हर अनुरोध पर या निर्धारित अंतराल के माध्यम से IP को स्वचालित रूप से बदलता है। आप एक होस्ट और पोर्ट निर्दिष्ट करते हैं, और रोटेशन प्रदाता के पक्ष पर होता है। रोटेशन के लिए कोई कोड लिखने की आवश्यकता नहीं है।
विकल्प 2: प्रॉक्सी सूची के माध्यम से एप्लिकेशन के पक्ष पर रोटेशन
@Component
public class ProxyRotator {
private final List<ProxyConfig> proxies;
private final AtomicInteger counter = new AtomicInteger(0);
public ProxyRotator(@Value("${proxy.list}") List<String> proxyList) {
this.proxies = proxyList.stream()
.map(this::parseProxy)
.collect(Collectors.toList());
}
public OkHttpClient getClientWithNextProxy() {
int index = counter.getAndIncrement() % proxies.size();
ProxyConfig config = proxies.get(index);
Proxy proxy = new Proxy(
Proxy.Type.HTTP,
new InetSocketAddress(config.getHost(), config.getPort())
);
return new OkHttpClient.Builder()
.proxy(proxy)
.build();
}
private ProxyConfig parseProxy(String proxyStr) {
// "host:port" या "user:pass@host:port" प्रारूप की स्ट्रिंग पार्स करना
String[] parts = proxyStr.split(":");
return new ProxyConfig(parts[0], Integer.parseInt(parts[1]));
}
}
विकल्प 3: ProxySelector के माध्यम से रोटेशन
Java एक अंतर्निहित तंत्र प्रदान करता है ProxySelector, जो गंतव्य URL के आधार पर प्रॉक्सी का गतिशील चयन करने की अनुमति देता है। यह HttpURLConnection और Apache HttpClient के साथ काम करता है:
ProxySelector.setDefault(new ProxySelector() {
private final List<Proxy> proxyPool = Arrays.asList(
new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy1.example.com", 8080)),
new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy2.example.com", 8080)),
new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy3.example.com", 8080))
);
private final AtomicInteger idx = new AtomicInteger(0);
@Override
public List<Proxy> select(URI uri) {
// डोमेन के आधार पर चयन करने की लॉजिक जोड़ सकते हैं
int i = idx.getAndIncrement() % proxyPool.size();
return Collections.singletonList(proxyPool.get(i));
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
// अनुपलब्ध प्रॉक्सी के लिए हैंडलिंग लॉजिक
log.warn("Proxy failed: {}", sa);
}
});
Java कार्यों के लिए प्रॉक्सी का कौन सा प्रकार चुनें
प्रॉक्सी के प्रकार का चयन विशिष्ट कार्य पर निर्भर करता है। कॉर्पोरेट Java एप्लिकेशनों के लिए आमतौर पर तीन मुख्य प्रकार पर विचार किया जाता है:
| प्रॉक्सी का प्रकार | गति | अनामता | सर्वश्रेष्ठ के लिए |
|---|---|---|---|
| डेटा सेंटर प्रॉक्सी | उच्च | मध्यम | खुले डेटा का पार्सिंग, API का परीक्षण, उच्च लोड |
| रिज़िडेंट प्रॉक्सी | मध्यम | उच्च | सुरक्षित साइटों का पार्सिंग, भौगोलिक परीक्षण, अवरोधों को बायपास करना |
| मोबाइल प्रॉक्सी | मध्यम | अधिकतम | मोबाइल API के साथ एकीकरण, कठोर एंटी-फ्रॉड सुरक्षा वाले सेवाएँ |
कार्य के प्रकार के लिए व्यावहारिक सिफारिशें:
- कॉर्पोरेट गेटवे (Squid, Zscaler): प्रॉक्सी का प्रकार IT विभाग द्वारा निर्धारित किया जाता है। Apache HttpClient या JVM सिस्टम प्रॉपर्टीज़ के माध्यम से प्रमाणीकरण के साथ HTTP प्रॉक्सी का उपयोग करें।
- सार्वजनिक डेटा का पार्सिंग (समाचार, उद्धरण, खुले API): डेटा सेंटर प्रॉक्सी गति और लागत के अनुपात में सबसे अच्छा विकल्प है।
- ई-कॉमर्स का पार्सिंग (Wildberries, Ozon, Amazon): रेजिडेंट प्रॉक्सी के साथ रोटेशन। ये प्लेटफार्म डेटा सेंटर IP को सक्रिय रूप से अवरुद्ध करते हैं।
- भौगोलिक परीक्षण (स्थानीयकरण, क्षेत्रीय कीमतों की जांच): देश/शहर का चयन करने के साथ रेजिडेंट प्रॉक्सी।
- मोबाइल सेवाओं और एप्लिकेशनों के साथ एकीकरण: मोबाइल प्रॉक्सी — वास्तविक मोबाइल नेटवर्क से IP वास्तविक उपयोगकर्ताओं का अनुकरण करने में सबसे अच्छा होता है।
Java में प्रॉक्सी सेटअप के दौरान सामान्य गलतियाँ और उन्हें कैसे ठीक करें
यहां तक कि अनुभवी डेवलपर्स Java में प्रॉक्सी सेटअप के दौरान समान समस्याओं का सामना करते हैं। आइए सबसे सामान्य मुद्दों को देखें।
1. प्रॉक्सी सेट है, लेकिन ट्रैफ़िक फिर भी सीधे जा रहा है
कारण: आपने JVM सिस्टम प्रॉपर्टीज़ सेट की हैं, लेकिन आप OkHttp या Reactor Netty (WebClient) का उपयोग कर रहे हैं, जो उन्हें नजरअंदाज करते हैं।
समाधान: प्रॉक्सी को स्पष्ट रूप से विशिष्ट HTTP क्लाइंट के कॉन्फ़िगरेशन में सेट करें, जैसा कि ऊपर के अनुभागों में दिखाया गया है।
2. javax.net.ssl.SSLHandshakeException प्रॉक्सी के माध्यम से HTTPS पर
कारण: कॉर्पोरेट प्रॉक्सी SSL-inspection (MITM) करता है, प्रमाणपत्र को बदलता है। Java कॉर्पोरेट CA पर भरोसा नहीं करता है।
समाधान: कॉर्पोरेट प्रमाणपत्र को Java truststore में आयात करें:
keytool -import -trustcacerts \ -alias corporate-ca \ -file corporate-ca.crt \ -keystore $JAVA_HOME/lib/security/cacerts \ -storepass changeit
3. java.net.ConnectException: Connection refused
कारण: प्रॉक्सी का गलत होस्ट या पोर्ट; प्रॉक्सी सर्वर अनुपलब्ध है; फ़ायरवॉल कनेक्शन को अवरुद्ध करता है।
निदान:
# प्रॉक्सी की उपलब्धता की जांच करें curl -x http://proxy.example.com:8080 https://httpbin.org/ip # या telnet के माध्यम से telnet proxy.example.com 8080
4. प्रॉक्सी HTTP के लिए काम करता है, लेकिन HTTPS के लिए नहीं
कारण: केवल http.proxyHost/Port प्रॉपर्टीज़ सेट की गई हैं, लेकिन https.proxyHost/Port नहीं।
समाधान: दोनों सेट प्रॉपर्टीज़ सेट करें। HTTPS के लिए HTTP प्रॉक्सी के माध्यम से CONNECT टनलिंग विधि का उपयोग किया जाता है — सुनिश्चित करें कि प्रॉक्सी इसे समर्थन करता है।
5. 407 प्रॉक्सी प्रमाणीकरण आवश्यक है
कारण: प्रॉक्सी प्रमाणीकरण की आवश्यकता है, लेकिन इसे सेट नहीं किया गया है।
समाधान: JVM सिस्टम प्रॉपर्टीज़ के लिए Authenticator जोड़ें या Apache HttpClient / proxyAuthenticator के लिए सेट करें (उपरोक्त उदाहरण)।
6. प्रॉक्सी रोटेशन के दौरान मेमोरी लीक
कारण: प्रत्येक अनुरोध पर एक नया OkHttpClient उदाहरण बनाया जाता है। प्रत्येक क्लाइंट अपने स्वयं के थ्रेड और कनेक्शन पूल रखता है।
समाधान: क्लाइंट्स को पुन: उपयोग करें। कई क्लाइंट्स (प्रॉक्सी के लिए एक) का एक पूल बनाएं और उन्हें रोटेट करें, नए बनाने के बजाय।
7. निदान के लिए डिबग लॉगिंग सक्षम करना
# application.properties — प्रॉक्सी निदान के लिए लॉग सक्षम करें logging.level.org.apache.http=DEBUG logging.level.org.apache.http.wire=DEBUG logging.level.reactor.netty.http.client=DEBUG # JVM के लिए — सिस्टम प्रॉपर्टी -Djava.net.debug=all
निष्कर्ष
Java एप्लिकेशनों में प्रॉक्सी सेटअप के लिए यह समझना आवश्यक है कि अंतर्निहित HTTP क्लाइंट कौन सा है। JVM सिस्टम प्रॉपर्टीज़ HttpURLConnection के लिए त्वरित प्रारंभ है, लेकिन OkHttp, WebClient और Apache HttpClient को स्पष्ट कॉन्फ़िगरेशन की आवश्यकता होती है। कॉर्पोरेट एप्लिकेशनों के लिए, प्रॉक्सी के पैरामीटर को application.properties में निकालना और विभिन्न वातावरणों के लिए Spring प्रोफाइल का उपयोग करना अनुशंसित है। प्रॉक्सी रोटेशन को रोटेटिंग एंडपॉइंट के साथ प्रदाता को सौंपना बेहतर है — यह स्वयं लागू करने की तुलना में सरल और अधिक विश्वसनीय है।
यदि आपका Java एप्लिकेशन सुरक्षित प्लेटफार्मों से डेटा पार्सिंग कर रहा है या बाहरी अनुरोधों के लिए उच्च अनामता की आवश्यकता है, तो रिज़िडेंट प्रॉक्सी पर विचार करने की सिफारिश की जाती है — इनमें वास्तविक घरेलू उपयोगकर्ताओं के IP होते हैं, जो एंटी-फ्रॉड सिस्टम द्वारा अवरोधों की संभावना को काफी कम करता है। उच्च लोड डेटा पार्सिंग के लिए, डेटा सेंटर प्रॉक्सी सबसे अच्छा विकल्प है — यह ट्रैफ़िक की लागत में कम होने पर अधिकतम गति प्रदान करता है।
```