将 Node.js 网络客户端连接到 Java gRPC 服务器时出错

Error connecting Node.js web client to Java gRPC server

我有一个用 Java 编写的 gRPC 服务器,我目前正在尝试使用 React 创建一个 Web 客户端。但是,我似乎无法管理客户端连接到的特使代理与实际服务器之间的连接。

我希望收到与 Java 客户端相同的消息,但我收到错误 "Http response at 400 or 500 level",网络客户端收到空响应,而 Java服务器甚至没有收到请求。

服务器运行在8080端口,envoy代理配置在9090端口,也就是web客户端使用的端口

Docker 文件:

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 和前端的原型 类静态加载。

如果还有更多对 post 有用的代码,请告诉我。感谢任何建议,谢谢!

看起来 Envoy 没有将请求转发到您的 Java 服务器。 Envoy 有一个管理界面 https://www.envoyproxy.io/docs/envoy/latest/operations/admin 。那和 Envoy 日志文件应该有助于解决这个问题。

socket_address:
  address: localhost

这就是问题所在。如果它是 运行 作为 docker 化图像,你的特使会尝试转发给自己,因为 localhost 不是 运行 容器的 docker 主机(其中 grpc 服务器是 运行) ,但实际上是 运行 容器的本地主机。使用docker compose,端口映射或者外网。祝你好运

对我来说,解决方案是更改传递给 运行 容器的命令,因此 docker run -p 9090:9090 -td m-server /bin/bash 变为 docker run -d -p 9090:9090 -p 9901:9901 m-server。主要区别在于使用 -d 而不是 -td,第二个端口映射用于 envoy 服务器。

我只是在学习 Docker 以及我从 documentation, the explanation would be that I was running the container in detached mode, but with a pseudo-tty allocated, which is used in foreground mode. I've seen it here 中了解到的内容,但目的略有不同,当时我误解为只保留容器 运行ning不是我需要的。

按照 中的建议将 'localhost' 更改为“0.0.0.0”也很重要。