Spring的RestTempalte客户端实现

RestTemplate 是srping封装的http客户端,它简化了与http服务的通信方式,统一了RESTful的标准。

实现方式

实现类型连接池超时设置
默认(HttpURLConnection)NY
Apache HttpComponentsYY
NettyNY
OkHttpYY

HttpURLConnection参数

设置描述
conn.setConnectTimeout(1000)设置连接超时时间,单位毫秒。连接超时是指TCP连接握手成功的时间,可以参考http握手和连接
conn.setReadTimeout(1000)设置读取超时时间,单位毫秒。是指从服务器一次读取数据的时间。参考http超时
setUseCaches(boolean)是否使用缓存
setDoOutput(boolean)是否输入参数
setDoInput(boolean)是否读取参数

注意:HttpURLConnection 没有数据连接池的功能,每个请求建立一个连接。

RestTemplate 实现超时

  • 基于HttpURLConnection实现超时
@Bean
  public RestTemplate getRestTemplate(){
  
    //default
    SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
    requestFactory.setReadTimeout(15000);//读取超时
    requestFactory.setConnectTimeout(5000);//连接超时
    RestTemplate restTemplate = new RestTemplate(requestFactory);
    return restTemplate;
  }
  • 基于Apache 客户端实现超时
@Bean
  public RestTemplate getRestTemplate(){
    //apache
    return new RestTemplate(getHttpCommonFactory());
  }
  @Bean
  public ClientHttpRequestFactory getHttpCommonFactory(){
    return new HttpComponentsClientHttpRequestFactory(httpClient());
  }
@Bean
  public HttpClient httpClient() {
    Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", PlainConnectionSocketFactory.getSocketFactory())
        .register("https", SSLConnectionSocketFactory.getSocketFactory())
        .build();
    //连接池设置
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
    //#最大连接数
    connectionManager.setMaxTotal(200);
    //#并发数
    connectionManager.setDefaultMaxPerRoute(20);
    //connectionManager.setValidateAfterInactivity(httpPoolProperties.getValidateAfterInactivity());
    RequestConfig requestConfig = RequestConfig.custom()
        .setSocketTimeout(15000) //服务器返回数据(response)的时间,超过抛出read timeout
        .setConnectTimeout(1000) //连接上服务器(握手成功)的时间,超出抛出connect timeout
        //从连接池中获取连接的超时时间,超时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
        .setConnectionRequestTimeout(30000)
        .build();
    return HttpClientBuilder.create()
        .setDefaultRequestConfig(requestConfig)
        .setConnectionManager(connectionManager)
        .build();
  }
  • netty 超时实现

引入netty 依赖:

    <dependency>
     <groupId>io.netty</groupId>
     <artifactId>netty-all</artifactId>
     <version>4.1.36.Final</version>
   </dependency>

初始化RestTemplate

@Bean
 public RestTemplate getRestTemplate(){
  //netty
   Netty4ClientHttpRequestFactory nettyFactory = new Netty4ClientHttpRequestFactory();
   nettyFactory.setReadTimeout(15000);
   nettyFactory.setConnectTimeout(5000);
   return new RestTemplate((ClientHttpRequestFactory)nettyFactory);
   
 }

注意:netty 是一个NIO的实现框架,连接数受到操作系统的限制,在处理客户端超时的时候,注意服务端的处理连接数和并发(非netty服务端设置)。

  • okhttp 客户端超时

引入okhttp3 客户端依赖

    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>3.14.1</version>
    </dependency>

使用okhttp3初始化RestTemplate

@Bean
  public RestTemplate getRestTemplate(){
    //okhttp
    OkHttpClient client = new OkHttpClient.Builder()
        .readTimeout(15000,TimeUnit.MILLISECONDS)
        .connectTimeout(Duration.ofMillis(5000))
        .connectionPool(new ConnectionPool())
        .retryOnConnectionFailure(false)
        .build();
    OkHttp3ClientHttpRequestFactory okhttpFactory=new OkHttp3ClientHttpRequestFactory(client);
    return new RestTemplate((ClientHttpRequestFactory)okhttpFactory);
  }

这里的连接池是ConnectionPool,maxPool=2147483647。
static {
executor = new ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue(), Util.threadFactory(“OkHttp ConnectionPool”, true));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值