问题描述
我正在尝试在有角度的应用程序中使用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{}
任何指针我该如何解决?谢谢
解决方法
我认为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