grpc Client-Streaming Java-клиент получает исключение io.grpc.StatusRuntimeException: UNAVAILABLE: HTTP-код состояния 503

У меня есть сервер grpc Nodejs за HAproxy и клиентский потоковый rpc java maven.

Когда я запускаю java-клиент, он возвращает ошибку:

io.grpc.StatusRuntimeException: UNAVAILABLE: код состояния HTTP 503 недопустимый тип содержимого: заголовки text / 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?


person Nguyễn Hoàng Hưng    schedule 10.11.2020    source источник
comment
Проблема не связана с клиентом. Вы используете прокси, и что-то не так с прокси или серверной частью.   -  person Eric Anderson    schedule 10.11.2020
comment
@EricAnderson, я вижу, я пытаюсь устранить неполадки с haproxy. но я подключился через прокси к серверу nodejs клиентом nodejs просто отлично. это просто мертвый клиент java.   -  person Nguyễn Hoàng Hưng    schedule 11.11.2020


Ответы (1)


Итак, я изменил forTarget (example.com), и это сработало. Я не должен указывать для него порт.

person Nguyễn Hoàng Hưng    schedule 12.11.2020
comment
Это изменит значение заголовка Host в отправленном HTTP-запросе. Похоже, вам нужно настроить прокси, чтобы можно было указать порт для виртуального хостинга. Удаление порта - это нормально, но тот факт, что это имеет значение, означает, что вам следует исправить некоторую конфигурацию прокси. - person Eric Anderson; 12.11.2020
comment
@EricAnderson благодарит за информацию. Вот как это сработало. Я не знал, как реализована абстракция. - person Nguyễn Hoàng Hưng; 13.11.2020