#java #node.js #grpc #grpc-java #grpc-node
#java #node.js #grpc #grpc-java #grpc-узел
Вопрос:
У меня есть сервер grpc Nodejs за HAProxy и потоковым клиентом rpc java maven.
Когда я запускаю java-клиент, он возвращает ошибку:
исключение io.grpc.StatusRuntimeException: НЕДОСТУПНО: код состояния HTTP 503 недопустимый тип содержимого: текстовые / html заголовки: Метаданные (:status=503, cache-control= no-cache,content-type=text / html) ДАННЫЕ——————————
Служба 503 недоступна Ни один сервер не доступен для обработки этого запроса.
Я уже тестировал потоковую передачу rpc-клиента с помощью Nodejs, и это сработало.
Мой код 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?
Комментарии:
1. Проблема не имеет ничего общего с клиентом. Вы используете прокси-сервер, и что-то не так с прокси или серверной частью.
2. @EricAnderson я вижу, я пытаюсь устранить неполадки haproxy. но я подключился через прокси к серверу nodejs с помощью клиента nodejs просто отлично. это просто клиент Java, который мертв.
Ответ №1:
поэтому, по-видимому, я изменил forTarget(«example.com ) и это сработало. Я не должен указывать для него порт.
Комментарии:
1. Это изменило бы значение заголовка узла в отправленном HTTP-запросе. Похоже, вам нужно настроить свой прокси, чтобы разрешить указание порта для виртуального хостинга. Удаление порта — это нормально, но тот факт, что это имело значение, означает, что вы должны исправить некоторую конфигурацию прокси.
2. @EricAnderson спасибо за вашу информацию. Так вот как это сработало. Я не знал, как реализована абстракция.