Ошибка подключения веб-клиента Node.js к серверу Java gRP C - PullRequest
0 голосов
/ 14 апреля 2020

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

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

Сервер работает на порту 8080, а прокси-сервер-посредник настроен на порт 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 docker build -t m-server ., а docker run -p 9090:9090 -td m-server /bin/bash и классы прототипа для внешнего интерфейса загружаются статически.

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

Ответы [ 3 ]

1 голос
/ 18 апреля 2020

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

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

Изменение 'localhost' на '0.0 .0.0 ', как предложено в , этот ответ также важен.

0 голосов
/ 15 апреля 2020
socket_address:
  address: localhost

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

0 голосов
/ 15 апреля 2020

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

...