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!
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.
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.
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