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

Gatling gRPC性能测试遇Failed ALPN协商错误,求排查方案

Gatling gRPC测试遇ALPN协商失败问题排查

刚接触Gatling,正在开展gRPC性能测试研究,使用phiSgr提供的插件编写了RPC调用代码,执行后出现协议协商错误。怀疑是HTTP 2与HTTP 1.1协议冲突,但升级至Gatling 3.10.5后问题仍未解决。用Postman和gRPCurl测试均可正常发起调用,想确认是否遗漏了gRPC的特定配置。

测试代码

class demo extends Simulation{
  val testgrpc = grpc(managedChannelBuilder(target = "url:9001")).disableWarmUp

  val scena = scenario("firstGRPC") 
    .exec{
    session => 
      val thePayload = session.set("payloadName",HelloRequest(Option("""{"greeting": "myname"}""")))
    thePayload
  }
    .exec(
    grpc("test")
      .rpc(HelloServiceGrpc.METHOD_SAY_HELLO)
      .payload("#{payloadName}")
      .check(statusCode is Status.Code.OK)
  )
  setUp(
    scena.inject(atOnceUsers(1))
  ).protocols(testgrpc)
}

错误信息

Failed ALPN negotiation: Unable to find compatible protocol

排查与解决建议

  • 确认ALPN依赖完整性:gRPC基于HTTP2,必须依赖ALPN组件实现协议协商。检查项目依赖是否包含与Gatling内置Netty版本匹配的ALPN包(如netty-alpn-api、netty-alpn-netty41),版本不匹配会直接导致协商失败。
  • 显式配置HTTP2协议支持:在构建ManagedChannel时明确指定HTTP2协议,避免自动协商出错:
    // 明文连接场景
    val testgrpc = grpc(
      managedChannelBuilder(target = "url:9001")
        .usePlaintext()
        .protocolNegotiator(Http2FrameCodecBuilder.forClient().build())
    ).disableWarmUp
    
    如果是TLS加密连接,需配置SSL上下文并启用ALPN:
    val sslContext = GrpcSslContexts.forClient().build()
    val testgrpc = grpc(
      managedChannelBuilder(target = "url:9001")
        .sslContext(sslContext)
        .protocolNegotiator(AlpnNegotiator.forHttp2())
    ).disableWarmUp
    
  • 检查服务端连接模式:确认目标gRPC服务是否要求TLS加密连接,若服务端仅支持TLS,代码中使用明文连接会触发ALPN协商失败。
  • 修正Payload构造逻辑:代码中直接将JSON字符串传入HelloRequest的方式不符合Protobuf序列化规范,应直接构造Protobuf对象:
    val thePayload = session.set("payloadName", HelloRequest(greeting = Some("myname")))
    
    错误的Payload格式可能间接引发协议层异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:34:52