【发布时间】:2020-11-10 10:31:02
【问题描述】:
我在 HAproxy 和 client-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