DirectResponse插件

DirectResponse插件支持对发往指定服务的指定路径的HTTP请求,不再向服务转发请求,而是立即返回固定的响应内容。此插件可以选择生效至网关或注入Sidecar的工作负载。当绑定至网关时,将对请求的域名、端口、路径进行匹配;当绑定至注入Sidecar的工作负载时,将对请求发往的端口和路径进行匹配。

前提条件

配置字段

名称

数据类型

填写要求

默认值

描述

patch_context

string

必填

-

指定插件的生效场景,根据插件的具体生效范围指定, 有两个取值:

  • SIDECAR_INBOUND:在具体工作负载中生效。

  • GATEWAY: 在网关中生效。

host

string

选填

-

该参数指定需要直接响应的域名。

  • 当插件生效至网关时,必须填写此参数。

  • 当插件生效至工作负载时则不需要。

重要

该参数指定的域名必须在应用于网关的VirtualService的hosts字段中同样进行指定。

port

string

必填

-

该参数指定请求发往的服务端口。

  • 当插件生效至网关时,此参数为网关监听端口。

  • 当插件生效至具体工作负载时,此参数为工作负载对应的服务端口

path

string

必填

-

该参数指定请求发往的路径,比如/productpage

response

string

必填

-

该参数指定直接响应返回的响应体内容。

response_status

string

必填

-

该参数指定直接响应返回的响应状态码。

配置示例

为网关配置直接响应

可以直接在网关上启用DirectResponse插件、配置直接响应,当网关匹配到发往指定的host及path的内容时,将直接返回指定的响应内容,而不再将请求转发至具体服务。 对于示例中的httpbin应用来说,应用于网关的VirtualService如下:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  "*"
  gateways:
  httpbin-gateway
  http:
  route:
    destination:
        host: httpbin
        port:
          number: 8000

VirtualServicehttpbinhosts字段中指定匹配域名为*,因此可以配置插件参数如下:

patch_context: GATEWAY #在此示例中,插件生效于网关,需指定patch_context为GATEWAY
host: "*" #VirtualService httpbin中仅指定了host "*",因此插件中匹配的host也只能填写"*"
port: "80" #填写网关的监听端口80
path: /get #匹配一个指定路径 /get进行直接响应
response: test #可填写任意字符串作为直接响应的内容,示例中使用"test"
response_status: "200" #可填写有效的状态码,作为直接响应的响应状态码

选择插件的生效范围为网关生效,并选择生效至网关ingressgateway。测试如下:

$ curl {网关ip地址}/get 
test

当访问网关且路径为/get时,可以看到网关直接返回了指定的响应内容“test”,而没有进一步将请求转发给httpbin服务。

为httpbin服务配置直接响应

也可以在httpbin服务上启用DirectResponse插件、配置直接响应,当请求发送到httpbin服务的指定path时,将直接返回指定的响应内容,而不再将请求交给工作负载处理。 在示例中使用的httpbin服务定义如下,其服务端口为8000:

apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
    service: httpbin
spec:
  ports:
  name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin

由于插件生效于具体工作负载,因此不再需要为插件配置host参数指定匹配域名。配置插件参数如下:

patch_context: SIDECAR_INBOUND #在此示例中,插件生效于httpbin服务,需要将patch_context指定为SIDECAR_INBOUND
port: "8000" #填写httpbin的服务端口:8000
path: /get #匹配一个指定路径 /get进行直接响应
response: test #可填写任意字符串作为直接响应的内容,示例中使用"test"
response_status: "200" #可填写有效的状态码,作为直接响应的响应状态码

选择插件的生效范围为工作负载生效,并选择生效至httpbinService。测试如下:

$ curl {网关ip地址}/get 
test

测试效果与网关的直接响应相同,但此示例中是网关转发给httpbin服务的Sidecar后,由Sidecar进行的直接响应。