grpc客户端流式Java客户端获取io.grpc.StatusRuntimeException:不可用:HTTP状态码503

问题描述

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

当我运行 java客户端时,它返回错误

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

503服务不可用没有服务器可用于处理此请求。

我已经使用 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中不同语言库的不同实现来发生此问题?

解决方法

因此,我显然更改了forTarget(“ example.com)并成功了。我不应该为其指定端口。

相关问答

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