如何通过特使代理传递 grpc 请求?

问题描述

所以,我有一个 grpc 请求,我调用如下:

grpcurl -vv \
       -import-path ./protos/src \
       -proto protobuf/grpc/my_api.proto \
      -H 'Authorization:Bearer <token>' \
-d '{"data":"yes"}'  usvc.dev.company.com:443  com.protobuf.grpc.package/DoSomething

我得到了预期的回复

我已经建立了一个 Envoy grpc 反向桥接如下:

# envoy-grpc.yaml

admin:
  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: 8050
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.httpconnectionManager
          access_log:
          - name: envoy.access_loggers.stdout
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/DoSomething"
                route:
                  host_rewrite_literal: usvc.dev.company.com
                  cluster: grpc
                  timeout: 25.00s
                typed_per_filter_config:
                  envoy.filters.http.grpc_http1_reverse_bridge:
                    "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_http1_reverse_bridge.v3.FilterConfigPerRoute
                    
              - match:
                  prefix: ""
                route:
                  host_rewrite_literal: usvc.dev.company.com
                  cluster: grpc
                  timeout: 25.00s
          http_filters:
          - name: envoy.filters.http.grpc_http1_reverse_bridge
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_http1_reverse_bridge.v3.FilterConfig
              content_type: application/grpc+proto
              withhold_grpc_frames: true
          - name: envoy.filters.http.router
  clusters:
  - name: other
    type: LOGICAL_DNS
    connect_timeout: 20.000s
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: some_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: localhost
                port_value: 4630
  - name: grpc
    type: STRICT_DNS
    connect_timeout: 20.000s
    lb_policy: ROUND_ROBIN
    typed_extension_protocol_options:
      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
        "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
        explicit_http_config:
          http2_protocol_options: {}
    load_assignment:
      cluster_name: grpc
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: usvc.dev.company.com
                port_value: 443
layered_runtime:
  layers:
  - name: disable_apple_dns
    static_layer:
      envoy.restart_features.use_apple_api_for_dns_lookups: false

如何通过 localhost:8050 处的此代理传递 grpc 请求?到目前为止,我尝试使用 curl 作为:

curl -v localhost:8050/com.protobuf.grpc.package/DoSomething -H 'Content-type: application/grpc+proto' -H 'Authorization:Bearer <token>' -d '{"data":"yes"}'

然后我看到如下回复

< HTTP/1.1 200 OK
< content-type: application/grpc
< grpc-status: 2
< grpc-message: envoy reverse bridge: upstream responded with unsupported content-type application/grpc,status code 200
< date: Wed,07 Jul 2021 06:49:34 GMT
< server: envoy
< content-length: 0
<
* Connection #0 to host localhost left intact
* Closing connection 0

无论如何我可以通过 curl 将此请求转换为 grpc 请求吗? grpcurl 没有 --proxy 标志,所以我使用了 curl。但看起来 usvc.dev.company.com 不想回应。 usvc.dev.company.com 确实接受 grpc 请求。

我的特使配置是否有问题,它没有正确翻译/发送请求?目的是通过此代理(特使)发送 gRPC 请求,该代理将其转换为 HTTP1.1 请求并将其转发到目标以进行响应。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)