本节将介绍 avi.requests() 函数以及通过 DataScript 配置带外请求处理的步骤。

当虚拟服务收到请求时,可以将整个请求、部分请求或完全不同的请求发送到第三方端点以验证特定条件。对原始请求执行的操作基于因此收到的响应。可以暂停处理某些入站客户端请求,以便通过 DataScript 从外部资源检索信息。

外部资源可以是单个服务器(可能属于第三方实体)或服务器池。服务器可通过 IP 地址或 FQDN 进行访问。

本节将介绍 DataScript avi.requests.xxx,它支持:

  • 暂停入站客户端请求

  • 配置新的 HTTP 请求 将请求发送到第三方池

  • 等待来自第三方池的响应

  • 恢复初始客户端请求、关闭该请求或使用本地重定向/响应重新发布

注:

确保在 NSX Advanced Load Balancer 中将第三方或外部实体配置为池。

外部请求验证的一些用例包括:

  • 查询 LDAP 以获取属性并将其作为标头插入后端服务器

  • 在向第三方服务器发送信息之前,将令牌名称转换为服务器中的用户名

  • 实时查找数据库,而不是使用静态数据库阻止来自特定国家/地区的用户

函数

avi.requests.[get/post/put/head](pool [, server [, port]], URI [, req_args])

描述

每当入站客户端请求到达 NSX Advanced Load Balancer 时,都会将外部 HTTP 请求发送到 DataScript 中的外部(第三方)服务器。允许暂停客户端请求并配置自定义 HTTP 请求(或转发原始客户端请求),将其发送到第三方资源,等待其响应,然后使用该响应在将初始客户端请求发送到后端服务器时为初始客户端请求做出负载均衡决策。

函数

HTTP 方法将是函数名称,而不是参数,如下所示:

  • avi.requests.get(pool [, server [, port]], URI [, req_args])

  • avi.requests.post(pool [, server [,port]], URI [, req_args])

  • avi.requests.head(pool [, server [,port]], URI [, req_args])

  • avi.requests.put(pool [, server [,port]], URI [, req_args])

事件

  • http_auth

  • http_post_auth

  • http_req

  • http_req_body

参数

Pool

要选择的外部池的名称 (<String>)

Server

外部服务器的名称 [可选](<String>)

Port

外部服务器的端口 [可选](<Number>)

Method

字符串中的 HTTP 方法名称。例如,get、post、head、put、patch 和 delete [可选](<String>)

URI

外部请求的 URI(路径 + 查询字符串)(<String>)

req_args

其他可选请求配置 [可选](<Table>)

Headers

要发送的请求标头的表。这些值必须为数字或字符串。(<Table>) NSX Advanced Load Balancer 将插入 HTTP 需要但未提供的标头,如 Host、Content-Length(如果请求为 PUT/POST)和 Accept (*/*)

Body

如果这是 POST 请求 (<String>),则为请求正文。如果方法是 POST,但未提供正文(或者正文为 nil),则默认情况下,将流式传输客户端的请求正文(仅在 REQ_BODY 事件中,否则将显示 [500] 错误)

返回的值

表包含以下值:

  • 状态:响应状态代码 (<Number>)

  • 标头:响应标头的表 (<Table>)

  • 正文:如果存在,则为 HTTP 响应正文,否则为 nil (<String>)

配置

要使用外部请求验证 API,请使用要将外部请求发送到的外部服务器配置新的 Pool 对象:

[admin:controller]: > configure vsdatascriptset vsds-external-request
 [admin:controller]: vsdatascriptset> pool_refs pool-1
 [admin:controller]: vsdatascriptset> save
注:

要发送 HTTPS 请求,请使用 SSL 配置文件配置池,并确保服务器端口具有 SSL 端口。

示例

headers = {

               Host= "www.example.com:80",

                Accept= "*/",

               ["Content-Type"] = "text/html",

          }

req_args = {headers = headers, body = "example body"}
-- Pool must have "Lookup server by name" turned on
resp = avi.requests.post("pool-1", "www.example.com", "/", req_args)

由于存在可选参数,可以通过多种方式调用 avi.requests.xxxx API:

 avi.requests.get('pool', '/index.html')
 avi.requests.get('pool', 'server', '/index.html')
 avi.requests.get('pool', 'server', 80, '/index.html')
 avi.requests.get('pool', /index_html', req_args)
 avi.requests.get('pool', 'server', '/index_html', req_args)
 avi.requests.get('pool', 'server', 80, '/index.html', req_args)

配置带外请求处理的步骤

  1. 配置池。可以通过多种方式定义/引用外部应用程序。它可以是单个服务器或服务器池。要在 DataScript 中使用外部池,请将该池附加到 VSDataScriptSet 对象。

  2. 使用 avi.requests() 函数编写 DataScript。

  3. 将池与 DataScript 关联

  4. 将 DataScript 绑定到需要带外处理的虚拟服务。

带外请求处理中的数据包流场景

让我们考虑客户端请求恢复的数据包流场景。



  1. 客户端发送入站请求,这将触发发送带外请求的 DataScript 条件

  2. DataScript 创建 HTTP 请求并将其发送到配置的外部服务器

  3. 该服务器提供 HTTP 响应,DataScript 将对其进行评估

  4. 根据外部服务器响应处理初始客户端请求后,将客户端请求转发到后端

  5. NSX Advanced Load Balancer 从后端服务器接收响应

  6. NSX Advanced Load Balancer 将后端服务器响应转发到客户端

注意事项

  • 不支持同时发送多个带外请求

  • 不支持异步带外请求

  • 不支持发送分块请求

  • 只能发送 HTTP/1.1 请求