Ошибка подключения веб-клиента Node.js к серверу Java gRPC

У меня есть сервер gRPC, написанный на Java, и в настоящее время я пытаюсь создать веб-клиент с помощью React. Однако я не могу управлять соединением между прокси-сервером посланника, к которому подключается клиент, и фактическим сервером.

Я ожидал бы получить то же сообщение, что и с клиентом Java, но я получаю сообщение об ошибке "Http response at 400 or 500 level", получая пустой ответ с помощью веб-клиента, в то время как сервер Java даже не получает запрос.

Сервер работает на порту 8080, а прокси-сервер envoy настроен на порт 9090, который используется веб-клиентом.

Dockerfile:

FROM envoyproxy/envoy-dev:latest
COPY ./envoy.yaml /etc/envoy/envoy.yaml
CMD /usr/local/bin/envoy -c /etc/envoy/envoy.yaml -l trace --log-path /tmp/envoy_info.log

envoy.yaml:

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9901 }

  static_resources:
    listeners:
      - name: listener_0
        address:
          socket_address: { address: 0.0.0.0, port_value: 9090 }
        filter_chains:
          - filters:
              - name: envoy.http_connection_manager
                config:
                  codec_type: auto
                  stat_prefix: ingress_http
                  route_config:
                    name: local_route
                    virtual_hosts:
                      - name: local_service
                        domains: ["*"]
                        routes:
                          - match: { prefix: "/" }
                            route:
                              cluster: m_service
                        cors:
                          allow_origin:
                            - "*"
                          allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
                          expose_headers: grpc-status,grpc-message
                          enabled: true
                  http_filters:
                    - name: envoy.grpc_web
                    - name: envoy.cors
                    - name: envoy.router
    clusters:
      - name: m_service
        connect_timeout: 0.25s
        type: logical_dns
        http2_protocol_options: {}
        lb_policy: round_robin
        hosts:
socket_address:
  address: localhost
  port_value: 8080

Команды, которые я использую для создания и запуска контейнера докеров, docker build -t m-server . и docker run -p 9090:9090 -td m-server /bin/bash, а прото-классы для внешнего интерфейса загружаются статически.

Если есть еще какой-то код, который было бы полезно опубликовать, дайте мне знать. Любой совет приветствуется, спасибо!


person andreea    schedule 14.04.2020    source источник


Ответы (3)


Для меня решением было изменить команду, переданную для запуска контейнера, таким образом docker run -p 9090:9090 -td m-server /bin/bash превратился в docker run -d -p 9090:9090 -p 9901:9901 m-server. Основное отличие заключалось в установке -d вместо -td, а второе сопоставление портов предназначалось для сервера посланника.

Я только изучаю Docker, и из того, что я понял из документации, объяснение будет будь то я запускал контейнер в автономном режиме, но с выделенным псевдо-tty, который используется в режиме переднего плана. Я видел это здесь, но цель была немного другой, и в то время я неправильно понял ее, поскольку только поддержание работы контейнера было не то, что мне нужно.

Также важно изменить localhost на 0.0.0.0, как предлагается в этом ответе.

person andreea    schedule 18.04.2020

Похоже, Envoy не пересылает запрос на ваш Java-сервер. Envoy имеет интерфейс администратора https://www.envoyproxy.io/docs/envoy/latest/operations/admin. Это и файлы журнала Envoy должны помочь в устранении этой проблемы.

person San P    schedule 15.04.2020

socket_address:
  address: localhost

Это проблема. Ваш посланник пытается перенаправить самому себе, если он работает как dockerized образ, потому что localhost - это не ваш хост-компьютер докера для запуска контейнера (где запущен сервер grpc), а на самом деле localhost для запущенного контейнера. Используйте docker compose, сопоставление портов или внешнюю сеть. Удачи

person Alexander.Furer    schedule 15.04.2020