【问题标题】:grpc Client-Streaming Java Client gets io.grpc.StatusRuntimeException: UNAVAILABLE: HTTP status code 503grpc Client-Streaming Java 客户端获取 io.grpc.StatusRuntimeException: UNAVAILABLE: HTTP status code 503
【发布时间】:2020-11-10 10:31:02
【问题描述】:

我在 HAproxyclient-streaming rpc java maven 后面有一个 grpc Nodejs 服务器。

当我运行 java 客户端 时它返回一个错误:

io.grpc.StatusRuntimeException:不可用:HTTP 状态代码 503 无效的内容类型:文本/html 标头: 元数据(:status=503,cache-control=no-cache,content-type=text/html) 数据------------------------------

503 Service Unavailable 没有可用于处理此请求的服务器。

我已经用 Nodejs 测试了一个 rpc 客户端流 并且它有效。

我的java客户端代码:

public class App {
    public static void main(String[] args) throws InterruptedException {
        WebRTCStats stat = WebRTCStats.newBuilder().setUserId("abc").build();
        SendWebRTCStats(stat);
    }

    public static void SendWebRTCStats(WebRTCStats stat) throws InterruptedException {
        ManagedChannel channel = ManagedChannelBuilder.forTarget("example.com:443").useTransportSecurity()
                .build();
        ClientGrpc.ClientStub stub = ClientGrpc.newStub(channel);

        StreamObserver<Stat.Status> responseObserver = new StreamObserver<Stat.Status>() {
            @Override
            public void onNext(Stat.Status status) {

            }

            @Override
            public void onError(Throwable t) {
                t.printStackTrace();
            }

            @Override
            public void onCompleted() {
                System.out.print("complete");
            }
        };
        StreamObserver<WebRTCStats> requestObserver = stub.sendWebRTCStats(responseObserver);
        try {
            // Send numPoints points randomly selected from the features list.

            requestObserver.onNext(stat);
            // Sleep for a bit before sending the next one.

        } catch (RuntimeException e) {
            // Cancel RPC
            requestObserver.onError(e);
            throw e;
        }
        // Mark the end of requests
        requestObserver.onCompleted();

        // Receiving happens asynchronously

    }
}

我的 NodeJS 服务器:

const PROTO_PATH = './stat.proto';
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const fs = require('fs');
const tcp = require('./using.js');

let packageDefinition = protoLoader.loadSync(PROTO_PATH);

let protoDescriptor = grpc.loadPackageDefinition(packageDefinition);

const server = new grpc.Server();


server.addService(protoDescriptor.Client.service, {
    SendWebRTCStats: async (call, callback) => {
        call.on('data', value => {
            console.log(value);
            tcp.sendLog("test", value);
        });

        call.on('end', () => {
            callback(null, { status: 'success' });
        })
    },
});

let credentials = grpc.ServerCredentials.createSsl(
    fs.readFileSync('ca.cer'), [{
    cert_chain: fs.readFileSync('cer.crt'),
    private_key: fs.readFileSync('cer_key.key')
}], false);

server.bind("0.0.0.0:443", credentials);
console.log("Server running at 443");
server.start();

GRPC中不同语言库的不同实现会不会出现这个问题?

【问题讨论】:

  • 问题与客户端无关。您正在使用代理,但代理或后端有问题。
  • @EricAnderson 我明白了,我正在尝试对 haproxy 进行故障排除。但是我通过nodejs客户端通过代理连接到nodejs服务器就好了。只是java客户端死了。

标签: java node.js grpc grpc-java grpc-node


【解决方案1】:

所以我显然改变了 forTarget("example.com) 并且它工作了。我不应该为它指定端口。

【讨论】:

  • 这将改变发送的 HTTP 请求中 Host 标头的值。听起来您需要配置代理以允许为虚拟主机指定端口。删除端口很好,但它很重要的事实意味着您应该修复一些代理配置。
  • @EricAnderson 感谢您的信息。这就是它的工作原理。我不知道抽象是如何实现的。
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 2022-01-06
相关资源
最近更新 更多