DirectResponse
插件支持对发往指定服务的指定路径的HTTP请求,不再向服务转发请求,而是立即返回固定的响应内容。此插件可以选择生效至网关或注入Sidecar的工作负载。当绑定至网关时,将对请求的域名、端口、路径进行匹配;当绑定至注入Sidecar的工作负载时,将对请求发往的端口和路径进行匹配。
前提条件
已部署入口网关。具体操作,请参见创建入口网关。
已在数据面集群部署httpbin服务。具体操作,请参见部署httpbin应用。
配置字段
名称 | 数据类型 | 填写要求 | 默认值 | 描述 |
patch_context | string | 必填 | - | 指定插件的生效场景,根据插件的具体生效范围指定, 有两个取值:
|
host | string | 选填 | - | 该参数指定需要直接响应的域名。
重要 该参数指定的域名必须在应用于网关的 |
port | string | 必填 | - | 该参数指定请求发往的服务端口。
|
path | string | 必填 | - | 该参数指定请求发往的路径,比如 |
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
VirtualServicehttpbin
在hosts
字段中指定匹配域名为*
,因此可以配置插件参数如下:
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" #可填写有效的状态码,作为直接响应的响应状态码
选择插件的生效范围为工作负载生效,并选择生效至httpbin
Service。测试如下:
$ curl {网关ip地址}/get
test
测试效果与网关的直接响应相同,但此示例中是网关转发给httpbin
服务的Sidecar后,由Sidecar进行的直接响应。