原因:Go语言(也许其他语言也差不多)的GRPC库是使用HTTP/2.0进行交互的。而Grpc-Web框架则发送的事HTTP/1.1请求。协议不同就产生了这个错误。
检验方式:在Grpc-Web的Hello world样例工程 的说明文档,有一个快速搭建Grpc-Web服务的流程。最终的展示工程分为三个模块
- client: 网页服务器运行在8081端口,向8080端口发送请求
- server:在9090端口接收请求
- proxy:将8080端口的请求路由到9090端口
如果我们修改工程,将client的请求端口直接对接到server监听端口,就会出现前端“Http response at 400 or 500 level”,后端“grpc: Server.Serve failed to create ServerTransport: connection error: desc = “transport: http2Server.HandleStreams received bogus greeting from client: \”OPTIONS /protos.Orderer/\””这样的报错。
解决方案1:按照Grpc-Web的文档,使用Envoy进行流量转换。
解决方案2:使用非官方库,在Go语言端多开一个端口转美与Grpc-Web进行交互。