如何缩短Dio请求的连接建立耗时?连接建立耗时超418ms
Dio连接建立耗时过长的优化方案
启用HTTP/2协议
HTTP/2支持TCP连接复用,能避免重复建立连接的开销。在Dio中配置HTTP/2适配器:import 'package:dio/dio.dart'; import 'package:dio_http2_adapter/dio_http2_adapter.dart'; void setupDio() { final dio = Dio(); dio.httpClientAdapter = Http2Adapter( ConnectionManager( idleTimeout: const Duration(seconds: 10), ), ); }配置连接池与连接复用
通过设置连接池参数,复用已有TCP连接,减少频繁创建连接的耗时:void setupDio() { final dio = Dio(); dio.httpClientAdapter = DefaultHttpClientAdapter() ..onHttpClientCreate = (HttpClient client) { client.connectionTimeout = const Duration(milliseconds: 3000); client.maxConnectionsPerHost = 10; // 单域名最大复用连接数 return client; }; }优化DNS解析
DNS解析延迟是连接建立慢的常见诱因,可以提前缓存DNS结果,或使用自定义DNS解析器:void setupDio() { final dio = Dio(); dio.httpClientAdapter = DefaultHttpClientAdapter() ..onHttpClientCreate = (HttpClient client) { // 假设已通过自定义DNS解析得到目标IP final resolvedIp = '192.168.1.100'; client.findProxy = (Uri uri) { return 'PROXY $resolvedIp:${uri.port}'; }; return client; }; }合理设置连接超时
配置合适的连接超时,避免无意义的等待,同时确保不会过早中断正常连接:void setupDio() { final dio = Dio(); dio.options.connectTimeout = const Duration(milliseconds: 3000); }缩短物理距离
如果服务器部署位置离用户过远,建议将服务迁移到用户就近的节点,或使用CDN加速,直接降低TCP握手的往返延迟。启用TCP快速打开(TFO)
部分平台支持TCP快速打开,减少握手的往返次数,进一步降低连接建立时间:void setupDio() { final dio = Dio(); dio.httpClientAdapter = DefaultHttpClientAdapter() ..onHttpClientCreate = (HttpClient client) { if (client is! BrowserClient) { client.enableTcpFastOpen = true; } return client; }; }
内容的提问来源于stack exchange,提问作者fthdmirr
相关产品推荐
相关产品推荐

