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协议,避免自动协商出错:
如果是TLS加密连接,需配置SSL上下文并启用ALPN:// 明文连接场景 val testgrpc = grpc( managedChannelBuilder(target = "url:9001") .usePlaintext() .protocolNegotiator(Http2FrameCodecBuilder.forClient().build()) ).disableWarmUpval 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对象:
错误的Payload格式可能间接引发协议层异常。val thePayload = session.set("payloadName", HelloRequest(greeting = Some("myname")))
内容的提问来源于stack exchange,提问作者tester11203
相关产品推荐
相关产品推荐

