向本地服务器发出grpc-web请求时获取ERR_INVALID_HTTP_RESPONSE

问题描述

我正在尝试在有角度的应用程序中使用grpc-web hello world程序,通过Nginx命中本地python服务器,并且在浏览器中收到ERR_INVALID_HTTP_RESPONSE错误。我认为该请求甚至没有达到Nginx代理。虽然我可以直接通过python客户端或通过代理访问服务器。

helloworld.proto

Syntax = "proto3";

option go_package = "google.golang.org/grpc/examples/helloworld/helloworld";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";

package helloworld;

// The greeting service deFinition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

client.ts

  const greeterService = new GreeterClient(
      'http://localhost:8086',null,null
    );

    const request = new HelloRequest();
    request.setName('Hello World!');

    const call = greeterService.sayHello(
      request,{ 'custom-header-1': 'value1' },(err: grpcWeb.Error,response: HelloReply) => {
        console.log(response.getMessage());
      }
    );
    call.on('status',(status: grpcWeb.Status) => {
      console.log(status);
    });

python server.py

class Greeter(helloworld_pb2_grpc.GreeterServicer):

    def SayHello(self,request,context):
        return helloworld_pb2.HelloReply(message='Hello,%s!' % request.name)


def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(),server)
    server.add_insecure_port('[::]:50052')
    server.start()
    server.wait_for_termination()


if __name__ == '__main__':
    logging.basicConfig()
    serve()

Nginx.conf

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent"';

     server {
        listen 8086 http2;
 
        access_log logs/access.log main;
 
        location /helloworld.Greeter {
            grpc_pass grpc://localhost:50052;
        }
    }
    
}

events{}

Error faced

任何指针我该如何解决?谢谢

解决方法

我认为nginx不支持grpc-web(在通常情况下,即使您可以尝试某些步骤来使其工作,请参阅https://github.com/grpc/grpc-web/issues/381#issuecomment-439783765)。它仅支持grpc,这就是python客户端正常工作的原因。对于grpc-web,您可以使用envoy,请参见此处的配置:https://github.com/grpc/grpc-web/blob/master/net/grpc/gateway/examples/echo/envoy.yaml

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...