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

响应式Spring微服务中集成JMH Benchmark的技术问询

响应式Java微服务中JMH基准测试实践

响应式场景JMH核心注意事项

  • JMH默认不会等待异步任务完成,直接返回仅会测量Mono对象的创建时间,而非实际执行耗时。必须通过block()或StepVerifier触发订阅并等待操作完成。
  • 用@State(Scope.Benchmark)管理Spring上下文,避免每次基准测试重新初始化上下文,保证测试结果稳定。

扩展现有Spring Boot JMH框架到响应式

基于你已搭建的框架,调整以下两点适配响应式场景:

  1. 上下文初始化:在基准测试的State类中初始化Spring Boot响应式(WebFlux)上下文,确保环境加载正确。
  2. 依赖Mock:沿用Mockito+MockBean逻辑mock响应式服务,但需保证mock方法返回Mono/Flux类型,而非同步返回值。

控制器链式服务的基准测试实现

方式1:Mock依赖服务(专注控制器逻辑)

和你的JUnit测试逻辑对齐,mock掉ProjectService,仅测试控制器的响应式处理流程:

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.context.TestPropertySource;
import org.mockito.Mockito;
import reactor.core.publisher.Mono;

@State(Scope.Benchmark)
@TestPropertySource(properties = {"spring.main.web-application-type=reactive"})
public class ProjectControllerBenchmark {

    private ConfigurableApplicationContext context;
    private ProjectController projectController;
    private ProjectService mockProjectService;

    @Setup(Level.Trial)
    public void setup() {
        // 初始化响应式Spring上下文
        context = new SpringApplicationBuilder(YourApplication.class)
                .web(WebApplicationType.REACTIVE)
                .run();
        
        // 创建并注册mock服务
        mockProjectService = Mockito.mock(ProjectService.class);
        context.getBeanFactory().registerSingleton("projectService", mockProjectService);
        
        // 获取控制器实例
        projectController = context.getBean(ProjectController.class);
        
        // 配置mock的响应式返回
        Mockito.when(mockProjectService.deleteProject(Mockito.anyString()))
                .thenReturn(Mono.empty());
    }

    @TearDown(Level.Trial)
    public void tearDown() {
        context.close();
    }

    @Benchmark
    public void testDeleteProject() {
        // 触发响应式操作并等待完成
        projectController.deleteProject("test-id").block();
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(ProjectControllerBenchmark.class.getSimpleName())
                .forks(1)
                .warmupIterations(5)
                .measurementIterations(10)
                .build();
        new Runner(opt).run();
    }
}

方式2:真实依赖服务(端到端基准测试)

若需测试完整链式服务调用,无需mockProjectService,直接让Spring加载真实服务实现。注意需保证测试环境的外部依赖(如数据库、消息队列)处于稳定状态,避免干扰基准结果。

关键细节提示

  • 所有初始化工作放到@Setup方法中,避免在@Benchmark方法内创建对象或加载资源。
  • 除了block(),也可使用StepVerifier.create(...).verifyComplete(Duration.ofSeconds(5))实现更精细的超时控制。
  • 根据实际场景调整JMH参数(warmupIterations、measurementIterations、forks),warmup迭代数需足够让JVM完成JIT编译,保证结果可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:25:07