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

Spring Boot中HTTP与HTTPS性能基准测试优化方案咨询

如何有效对比Spring Boot中HTTP与HTTPS的性能基准

看起来你的测试场景因为数据量太小、单次请求耗时太短,导致HTTP和HTTPS的性能差异被掩盖了。下面是几个可行的调整方案,帮你放大两者的性能差异,获得有效的基准测试结果:


1. 放大数据传输量,凸显SSL加密开销

SSL的加密/解密开销在传输大体积数据时才会明显体现出来,你可以通过以下方式增加请求返回的数据量:

  • 批量插入测试数据:在应用启动时往USER_TABLE插入几万甚至几十万条用户数据,让getAllUsers返回的数据集足够大。比如添加一个数据初始化组件:
    @Component
    public class TestDataInitializer implements CommandLineRunner {
        @Autowired
        private UserDao userDao;
    
        @Override
        public void run(String... args) throws Exception {
            // 仅在无数据时初始化
            if (userDao.count() == 0) {
                List<User> testUsers = new ArrayList<>(100000);
                for (int i = 0; i < 100000; i++) {
                    User user = new User();
                    user.setName("Test_User_" + i + "_With_Long_Name_To_Increase_Payload_Size");
                    user.setSalary(30000 + i);
                    testUsers.add(user);
                }
                userDao.saveAll(testUsers);
                log.info("Successfully inserted 100k test users");
            }
        }
    }
    
  • 模拟大体积响应:如果不想修改数据库,可以直接在UserService中生成固定的大体积数据集,排除数据库性能的干扰:
    public List<User> getAllUsers() {
        long start = System.currentTimeMillis();
        // 生成10000个模拟用户,放大响应 payload
        List<User> mockUsers = IntStream.range(0, 10000)
            .mapToObj(i -> {
                User u = new User();
                u.setId(i);
                u.setName("MockUser_" + i + "_" + UUID.randomUUID());
                u.setSalary(50000 + i);
                return u;
            })
            .collect(Collectors.toList());
        long executionTime = System.currentTimeMillis() - start;
        log.info("Execution Time log: {} ms", executionTime);
        return mockUsers;
    }
    

2. 使用专业压测工具,模拟并发场景

单次请求的耗时波动太大,而且SSL握手的开销在首次请求后会通过会话复用被降低。你需要用压测工具模拟高并发场景,才能准确对比两者的性能:

  • 工具选择:推荐使用JMeter、Gatling或wrk这类专业工具。以JMeter为例:
    1. 创建线程组,设置并发数(比如100-500)、循环次数或持续时间;
    2. 分别创建HTTP和HTTPS的请求采样器,指向/user/all接口;
    3. 添加聚合报告、吞吐量图表等监听器,统计平均响应时间、QPS、错误率等核心指标;
  • 预热环节:正式压测前先跑5-10分钟的低并发请求,让JVM、Tomcat连接池和SSL会话缓存完成初始化,避免冷启动影响测试结果。

3. 调整SSL配置,接近生产环境强度

自签名证书和默认的SSL配置可能加密强度不足,导致开销不够明显。你可以调整配置,模拟生产环境的SSL开销:
修改application.properties,启用更安全的TLS版本和加密套件:

# 启用TLS 1.2和1.3
server.ssl.enabled-protocols=TLSv1.2,TLSv1.3
# 使用高强度加密套件
server.ssl.ciphers=TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_GCM_SHA256

如果想测试最坏情况(每次请求都重新SSL握手),可以关闭Tomcat的SSL会话复用:

// 在HttpServer类的servletContainer方法中添加HTTPS连接器的配置
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
// 获取默认的HTTPS连接器
Connector httpsConnector = tomcat.getWebServer().getTomcat().getConnector();
AbstractHttp11Protocol<?> protocolHandler = (AbstractHttp11Protocol<?>) httpsConnector.getProtocolHandler();
// 设置会话超时为0,强制每次请求重新握手
protocolHandler.setSSLSessionTimeout(0);

4. 优化测试环境,排除干扰因素

  • 关闭冗余日志:把日志级别调整到WARN或ERROR,避免日志IO操作影响性能测试结果;
  • 统一环境参数:测试HTTP和HTTPS时,保证JVM参数、Tomcat配置、机器资源完全一致;
  • 多次取平均值:每个场景至少运行3次压测,取平均值作为最终结果,避免单次测试的偶然性;
  • 调整JVM和Tomcat参数:给JVM分配足够内存(比如-Xmx4G -Xms4G -XX:+UseG1GC),调整Tomcat线程池大小避免线程瓶颈:
    server.tomcat.threads.max=200
    server.tomcat.threads.min-spare=50
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:14:28