grpc服务报错: http2 frame too large

发布时间 2023-10-15 10:51:36作者: 黑熊一只

报错如下:

1 4xx BadRequesterror reading server preface: http2: frame too large

其中4xx为客户端报错中的一个具体数字。比如: 404/415,仅以报错举例,且出现报错码不固定。

但是error msg的核心内容不变: frame too large...

这个是因为客户端在没有 TLS 加密的情况下发送 HTTP/2 帧,服务器端在 HTTP 1.1 中以未加密的 HTTP 正文发回错误消息。

grpc是以http2.0进行交互,而客户端如果由于某些原因,将http转为2.0以下的标准,则会出发这个报错。

以golang的grpc举例规避:

    proxyCA := "/var/tmp/fullchain.pem" // CA cert that signed the proxy
    f, err := os.ReadFile(proxyCA)
    
    p := x509.NewCertPool()
    p.AppendCertsFromPEM(f)
    tlsConfig := &tls.Config{
        RootCAs: p,
    }
    conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)))

特别需要指出:

在postman加成的情况下,会自动集成证书,帮助完成校验,才能正常交互(具体需要抓包自证,不过不携带证书,必然访问失败,所以也可暂时反推这个结果。)