你的代码存在每次请求新建了连接的情况,没有用连接池

作为一个程序员,你听到过别人说:“你的代码存在每次请求新建了连接的情况,没有用连接池”?

今天聊一下HTTP。很多框架对HttpClient做了很好的封装,但我们还是要对HTTP的原理有所了解,不然别人封装好了我们也用不好。

如果每次HTTP请求都新建连接而没有使用连接池,会导致以下问题:

1、性能问题:每次新建连接都需要进行TCP三次握手和四次挥手,这会增加网络延迟和带宽占用,从而降低Web应用程序的性能。

2、资源浪费:频繁新建连接会占用系统资源,包括CPU、内存和网络带宽等,从而浪费系统资源。

3、连接数限制:服务器通常会限制同时建立的TCP连接数,如果每次请求都新建连接,可能会导致连接数过多而被服务器拒绝。

因此,为了提高WEB应用程序的性能和稳定性,应该使用连接池来管理HTTP连接。连接池可以重复使用已经建立的连接,避免了频繁新建连接的开销,从而提高了WEB应用程序的性能和稳定性。

HTTP 连接方面的参数主要涉及到底层TCP 连接的建立和管理。以下是与 HTTP 连接相关的一些常见参数:

1、连接超时(Connect Timeout): 连接超时是指在建立与目标服务器的连接时,等待连接成功的最大时长。如果在该时间内无法建立连接,客户端将抛出连接超时异常。设置合适的连接超时值可以避免客户端长时间等待无法建立的连接。

2、读取超时(Read Timeout):读取超时是指客户端在发送请求后等待服务器响应的最大时长如果在该时间内无法收到服务器响应,客户端将抛出读取超时异常。设置合适的读取超时值可以确保客户端在服务器未响应时不会无限期地等待。

3、写入超时(Write Timeout):写入超时的时间计算正常是从request header的读取结束开始,到response write结束为止 (也就是ServeHTTP方法的生命周期)。

4、Keep-Alive: Keep-Alive 是一种 HTTP 机制,允许客户端和服务器在完成请求后保持连接的打开状态,以便稍后重用。启用 Keep-Alive 可以提高性能,因为重用现有的TCP 连接减少了创建和关闭连接的开销。合理设置 Keep-Alive超时时间可以在连接重用和服务器资源占用之间找到平衡。

5、最大连接数(Max Connections):最大连接数是指客户端可以同时建立的最大连接数量。根据应用的需求和目标服务器的负载能力设置合适的最大连接数,以避免服务器过载或拒绝连接。

6、每个路由的最大连接数(Max Connections per Route): 每个路由的最大连接数是指针对特定目标服务器或服务的最大并发连接数。根据应用的需求和目标服务器的负载能力设置合适的每个路由的最大连接数,以确保请求分配得当。

7、连接池(Connection Pool): 连接池用于缓存和重用已建立的连接,从而减小客户端和服务器之间的资源开销启用连接池可以提高性能,但需要注意合理配置连接池参数,例如最大连接数、空闲连接的生存时间等。

我推荐使用okhttp3,下面是代码片段:

@Bean

public OkHttpClient okHttpClient() {

OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();

httpClientBuilder. connectionPool (new ConnectionPool(okHttpClientProperties. getMaxIdleConnections (), okHttpClientProperties. getKeepAliveDuration (), TimeUnit.MINUTES));

httpClientBuilder. connectTimeout (okHttpClientProperties.getConnectTimeout(), TimeUnit.SECONDS);

httpClientBuilder. writeTimeout (okHttpClientProperties.getWriteTimeout(), TimeUnit.SECONDS);

httpClientBuilder. readTimeout (okHttpClientProperties.getReadTimeout(), TimeUnit.SECONDS);

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();

loggingInterceptor.setLevel(getLevel());

httpClientBuilder.addInterceptor(loggingInterceptor);

return httpClientBuilder.build();

}

学海无涯,爱学习就会有收获。