【问题标题】:Error connecting Node.js web client to Java gRPC server将 Node.js Web 客户端连接到 Java gRPC 服务器时出错
【发布时间】:2020-04-14 13:15:31
【问题描述】:

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

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

服务器运行在 8080 端口,envoy 代理配置在 9090 端口,这是 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

我用于构建和运行 docker 容器的命令是 docker build -t m-server .docker run -p 9090:9090 -td m-server /bin/bash,前端的 proto 类是静态加载的。

如果还有其他有用的代码可以发布,请告诉我。感谢您的任何建议,谢谢!

【问题讨论】:

    标签: java node.js docker grpc envoyproxy


    【解决方案1】:

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

    我只是在学习 Docker,根据我从 documentation 中了解到的情况,解释是我在分离模式下运行容器,但分配了一个伪 tty,用于前台模式。我见过它here,但目的略有不同,当时我误解了它,因为我不需要只保持容器运行。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
        socket_address:
          address: localhost
        

        这就是问题所在。如果它作为 dockerized 镜像运行,您的 envoy 会尝试转发给自己,因为 localhost 不是您运行容器的 docker 主机(运行 grpc 服务器的位置),但实际上是运行容器的 localhost。使用 docker compose、端口映射或外部网络。祝你好运

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-20
          • 2020-09-09
          • 2015-05-16
          • 1970-01-01
          • 1970-01-01
          • 2022-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多