实验3:Header操作

在这个实验中,我们将学习如何在不同的配置级别上操作请求和响应头。

我们将使用一个单一的例子,它的作用如下:

  • 对所有的请求添加一个响应头 lab: 3
  • 在虚拟主机上添加一个请求头 vh: one
  • /json 路由匹配添加一个名为 json 响应头。响应头有来自请求头 hello 的值

我们将只有一个名为 single_cluster 的上游集群,监听端口为 3030。让我们运行监听该端口的 httpbin 容器:

docker run -d -p 3030:80 kennethreitz/httpbin

让我们创建遵循上述规则的 Envoy 配置:

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 10000
    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
          stat_prefix: hello_service
          http_filters:
          - name: envoy.filters.http.router
          route_config:
            response_headers_to_add:
              - header:
                  key: "lab"
                  value: "3"
            virtual_hosts:
            - name: vh_1
              request_headers_to_add:
                - header: 
                    key: vh
                    value: "one"
              domains: ["*"]
              routes:
                - match:
                    prefix: "/json"
                  route:
                    cluster: single_cluster
                  response_headers_to_add:
                    - header: 
                        key: "json"
                        value: "%REQ(hello)%"
                - match:
                    prefix: "/"
                  route:
                    cluster: single_cluster
  clusters:
  - name: single_cluster
    connect_timeout: 5s
    load_assignment:
      cluster_name: single_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 3030

将上述 YAML 保存为 2-lab-3-header-manipulation-1.yaml 并运行 Envoy 代理:

func-e run -c 2-lab-3-header-manipulation-1.yaml

让我们先对 /headers 做一个简单的请求,这将匹配 / 前缀:

$ curl -v localhost:10000/headers
...
< x-envoy-upstream-service-time: 2
< lab: 3
<
{
  "headers": {
    "Accept": "*/*",
    "Host": "localhost:10000",
    "User-Agent": "curl/7.64.0",
    "Vh": "one",
    "X-Envoy-Expected-Rq-Timeout-Ms": "15000"
  }
}

我们会注意到响应 Header lab: 3 被设置了。这来自路由配置,并将被添加到我们的所有请求中。

在响应中,我们可以看到 Vh: one 头(注意这个大写字母来自 httpbin 代码)被添加到请求中。httpbin 的响应显示了所收到的头信息(即请求头信息)。

让我们试着向 /json 路径发出请求。发送到该路径上的 httpbin 的请求将返回一个 JSON 样本。此外,这一次我们将包括一个名为 hello: world 的请求头。

$ curl -v -H "hello: world" localhost:10000/json
> GET /json HTTP/1.1
> Host: localhost:10000
> User-Agent: curl/7.64.0
> Accept: */*
> hello: world
>
< HTTP/1.1 200 OK
< server: envoy
< json: world
< lab: 3
...

注意这次我们设置的请求头(hello: world),在响应路径上,我们看到 json: world 头,它的值来自我们设置的请求头。同样地,lab: 3 响应头被设置。请求头 Vh: one 也同时被设置,但这次我们看不到它,因为它没有被输出。