gRPC HTTP/1.1 反向桥接

这是一个过滤器,可以将传入的 gRPC 请求转换成 HTTP/1.1 请求,使得服务器不需要了解 HTTP/2 或者 gRPC 协议语义也可以处理该请求。

过滤器的工作原理:

  • 检查传入请求的内容类型。如果是 gRPC 请求,则启用过滤器。

  • 内容类型被修改为可配置的值。通过配置 application/grpc ,可以将其设置为空。

  • 可以从请求体中剥离 gRPC 帧头部。当然如果是这样,头部中的内容长度也会被调整。

  • 收到响应后,将会验证响应的内容类型,并且状态代码会被映射为一个 grpc 状态,这个 grpc 状态会被插入到响应的 trailer 。

  • 响应体可以用 gRPC 帧报头作为前缀,如果需要的话会再一次调整头部中的内容长度。

由于已映射到 HTTP/1.1,因此此过滤器仅适用于单个连接的 gRPC 调用。

gRPC 帧头管理

通过设置 withhold_grpc_frame 选项, 过滤器将假定上游不了解任何 gRPC 的协议语义,并将请求体转换成简单的二进制编码,并对响应体执行反向转换。这样会简化了服务器侧处理这些请求,因为它们不再需要关注解析并生成 gRPC 格式的数据。

这是通过从请求体中剥离 gRPC 帧头部,同时在响应中注入 gRPC 帧头部来实现的。

如果未使用此功能,则上游必须准备好接收前缀带 gRPC 帧头部的HTTP/1.1请求,并使用 gRPC 响应格式进行响应。

如何禁用每个路由的 HTTP/1.1 反向网桥过滤器

admin:
  access_log_path: /dev/stdout
  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: 80
    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.file
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
              path: /dev/stdout
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/route-with-filter-disabled"
                route:
                  host_rewrite: localhost
                  cluster: grpc
                  timeout: 5.00s
                # per_filter_config disables the filter for this route
                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
                    disabled: true
              - match:
                  prefix: "/route-with-filter-enabled"
                route:
                  host_rewrite: localhost
                  cluster: other
                  timeout: 5.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
            typed_config: {}
  clusters:
  - name: other
    connect_timeout: 5.00s
    type: LOGICAL_DNS
    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
    connect_timeout: 5.00s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    load_assignment:
      cluster_name: grpc
      endpoints:
        - lb_endpoints:
            - endpoint:
                address:
                  socket_address:
                    address: localhost
                    port_value: 10005