You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot调用外部API异常:公网正常私网超时

私网环境下Spring Boot调用外部API超时问题排查与解决

公网能正常调用但私网超时,核心问题基本出在网络连通性或代理配置上,代码本身没问题(公网已验证),按以下步骤排查:

1. 先验证私网到目标API的网络连通性

  • 在部署机器上用ping测试目标域名/IP:ping api.example.com,看是否能收到响应
  • 用telnet测端口开放情况:telnet api.example.com 443(HTTPS用443,HTTP用80),连不上说明端口被拦截
  • 用curl直接调用API看细节:curl -v https://api.example.com/user/{id},能明确是DNS解析失败还是连接超时

2. 配置私网代理(最常见解决方法)

私网访问外部网络一般需要走代理,RestTemplate默认不会自动使用系统代理,手动配置带代理的RestTemplate:

基础代理配置

@Bean
public RestTemplate restTemplate() {
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    // 替换成你的代理地址和端口
    factory.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.yourcompany.com", 8080)));
    // 设置超时时间,避免无限等待
    factory.setConnectTimeout(5000); // 连接超时5秒
    factory.setReadTimeout(10000); // 读取超时10秒
    return new RestTemplate(factory);
}

带用户名密码的代理配置

如果代理需要认证,用HttpClient实现:

@Bean
public RestTemplate restTemplate() {
    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(
        new AuthScope("proxy.yourcompany.com", 8080),
        new UsernamePasswordCredentials("proxy_username", "proxy_password")
    );

    HttpClient httpClient = HttpClientBuilder.create()
        .setDefaultCredentialsProvider(credentialsProvider)
        .build();

    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
    factory.setConnectTimeout(5000);
    factory.setReadTimeout(10000);
    factory.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.yourcompany.com", 8080)));

    return new RestTemplate(factory);
}

3. 排查DNS解析问题

私网DNS可能解析不了外部域名,先在机器上测试:nslookup api.example.com,如果解析失败,要么联系运维调整DNS,要么直接用目标API的IP调用(如果IP固定)

4. 调整超时时间(适配慢网络)

如果私网网络延迟高,默认超时时间不够,适当调大:

@Bean
public RestTemplate restTemplate() {
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    factory.setConnectTimeout(10000); // 连接超时10秒
    factory.setReadTimeout(20000); // 读取超时20秒
    return new RestTemplate(factory);
}

5. 检查防火墙/安全组

私网的防火墙或云安全组可能禁止了机器出站访问目标端口,需要确认是否允许访问API的80/443端口

内容的提问来源于stack exchange,提问作者SkClass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:20:17