Erreur de connexion du nœud.client web js vers serveur Java gRPC


J'ai un serveur gRPC écrit en Java et j'essaie actuellement de créer un client Web, avec React. Cependant, je n'arrive pas à gérer la connexion entre le proxy envoy auquel le client se connecte et le serveur réel.

Je m'attendrais à recevoir le même message qu'avec le client Java, mais j'obtiens l'erreur "Http response at 400 or 500 level", recevant une réponse vide avec le client Web, alors que le serveur Java n'obtient même pas la demande.

Le serveur s'exécute sur le port 8080, et le proxy envoy est configuré sur le port 9090, qui est celui utilisé par le client Web.

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

Les commandes que j'utilise pour construire et exécuter le conteneur docker sont docker build -t m-server ., et docker run -p 9090:9090 -td m-server /bin/bash et les classes proto pour le front-end sont chargées statiquement.

S'il y a plus de code qui serait utile à poster, veuillez me le faire savoir. Tout avis est apprécié, merci!

Author: andreea, 2020-04-14

3 answers

Pour moi la solution a été de changer la commande passée pour exécuter le conteneur, donc docker run -p 9090:9090 -td m-server /bin/bash devient docker run -d -p 9090:9090 -p 9901:9901 m-server. La principale différence était de mettre -d au lieu de-td et le deuxième mappage de port est pour le serveur envoy.

J'apprends juste Docker et d'après ce que j'ai compris de la documentation , l'explication serait que j'exécutais le conteneur en mode détaché, mais avec un pseudo-tty alloué, qui est utilisé en mode premier plan. Je l'ai vu ici, mais le but était légèrement différent et à l'époque, je l'ai mal compris car seul le fait de garder le conteneur en marche n'était pas ce dont j'avais besoin.

Changer 'localhost' en '0.0.0.0', comme suggéré dans cette réponse est également importante.

 1
Author: andreea, 2020-04-18 19:21:07

On dirait qu'Envoy ne transmet pas la demande à votre serveur Java. Envoyé a une interface d'administration https://www.envoyproxy.io/docs/envoy/latest/operations/admin . Cela et les fichiers journaux Envoy devraient aider à résoudre ce problème.

 0
Author: San P, 2020-04-15 19:13:01
socket_address:
  address: localhost

C'est le problème. Votre envoyé essaie de se transférer s'il s'exécute en tant qu'image dockerisée, car localhost n'est pas votre machine hôte docker pour l'exécution du conteneur (où le serveur grpc est en cours d'exécution) , mais en fait localhost du conteneur en cours d'exécution. Utilisez docker compose, mappage de port ou réseau externe. Bonne chance

 0
Author: Alexander.Furer, 2020-04-15 21:34:47