Version: v1alpha1
Rider SDK 定义了编写插件需要用到的 API。
Rider 提供了一个名为 envoy
全局可见的对象, 用户可以用 envoy.*
的形式调用 SDK。
建议采用下面的方法, 使用本地变量将 envoy
以及用到的方法缓存下来, 通过减少查找来提高性能
local envoy = envoy
local get_request_header = envoy.req.get_header
而不是直接使用
local foo = envoy.req.get_header("foo")
插件中所定义所有函数, 都建议声明为 local
, 避免全局可见。
获取指定的 header
Parameter
- name: header name
Return
- a string for header value
- nil if not exist
获取所有 header
Return
- a table, key is header name, value is header value
local get_request_headers = envoy.req.get_headers
function handler:on_request(conf, handle)
local headers = get_request_headers
for key, val in pairs(headers) do INFO_LOG(key, val) end
end
获取 request body, 该方法会使 coroutine yield 直至获取到所有 body
当 buffer 的数据超过 per_connection_buffer_limit_bytes
(默认为 1M), envoy 会返回 413 错误
Return
table
a buffer object represents the request body
返回的对象有两个方法
length()
返回number
body 字节数getBytes(start, end)
返回string
body 内容, 从 start 到 end - 1
Usage
local body = envoy.req.get_body()
envoy.logDebug("body is: "..body:getBytes(0, body:length())) --- "body is: hello world"
获取 route 中的 metadata , 目前只支持获取 string
和 integer
Parameter
- key: string, key specifies key of the value
- filter_name: string, filter_name specifies from which filter to get metadata
Return
- a string for the value
- nil if not found
例如, 获取下面配置中的 api_id
envoy.req.get_metadata("api_id", "metadatahub")
virtual_hosts:
- name: local_service
domains:
- "foo.com"
routes:
- match:
prefix: "/"
route:
cluster: web_service
metadata:
filter_metadata:
com.netease.metadatahub:
api_id: 11111
svc_id: "svc_id_test"
设置一个 header, 如果原来存在则覆盖
Parameter
- name: string, header name
- value: string, header value
Return
- No return value
移除指定的 header
Parameter
- name: string, header name
Return
- No return value
使用场景,请求阶段可以调用该函数来清除路由缓存,下一次获取路由时会重新计算路由
Return
- No return value
设置 header, 如果原来存在则覆盖
Parameter
Return
获取指定的 header
Parameter
- name: string, header name
Return
- a string for header value
- nil if not exist
获取所有 header
Return
- No return value
移除指定的 header
Parameter
- name: string, header name
Return
- No return value
用于保存临时变量,在请求结束时被释放。通常用于在 request 阶段存储一些信息,在 response 阶段引用
local envoy = envoy
local get_req_headers = envoy.req.get_headers
function handler:on_request(conf, handle)
envoy.stream.shared.original_headers = get_req_headers()
-- Then modify headers
end
function handler:on_response(conf, handle)
local original_headers = envoy.stream.shared.original_headers
end
envoy.stream.shared
生命周期不能超过请求的生命周期, 像下面的代码会引起异常
local envoy = envoy
local foo
function handler:on_request(conf, handle)
foo = envoy.stream.shared
end
function handler:on_response(conf, handle)
foo.x = y
end
发送异步 http 请求, coroutine 会 yield 直到请求返回
cluster
参数对应 envoy 中配置的 cluster
headers
中可以通过 :method
, :path
, :authority
来配置 http method, url (https://en.wikipedia.org/wiki/URL)
Parameter
- cluster(string, required): upstream cluster
- headers(table, required): request headers
- body(string, optional): request body, nil for empty body
- timeout(number, required): timeout in milliseconds
Return
table
response headersstring
response body, nil for empty body
Usage
local headers, resp_body = envoy.httpCall(
"security-server",
{
[":method"] = "POST",
[":path"] = "/",
[":authority"] = "security-server"
},
"hello world",
1000
) --- POST http://security-server/
if resp_body then
envoy.logDebug("response body lengh: "..#resp_body)
end
直接向 downstream 发送 response, 必须在 on_request
阶段执行, 调用后从插件逻辑返回, 后续代码不会再执行
Parameter
- headers(table, required): response headers
- body(string, optional): response body
Return
- nil
Usage
local host = envoy.req.get_header(":authority")
if host == "bar.com" then
envoy.respond({[":status"] = 403}, "nope")
end
Parameter
- msg(string, required): message
Return
- nil
Usage
envoy.filelog("write to file")
The time that the first byte of the request was received.
Return
number
unix timestamp in milliseconds
Usage
envoy.streaminfo.start_time() --- 1591168355117
Current time in milliseconds.
Return
number
unix timestamp in milliseconds
Usage
envoy.streaminfo.current_time_milliseconds() --- 1591168355453
The downstream local address.
Return
string
Usage
envoy.streaminfo.downstream_local_address() --- 127.0.0.1:8000
The downstream remote ddress.
Return
string
Usage
envoy.streaminfo.downstream_remote_address() --- 127.0.0.1:51042
The upstream cluster.
Return
string
cluster namenil
if not exist
Usage
envoy.streaminfo.upstream_cluster() --- web_service
The upstream host.
Return
string
host addressnil
if not exist
Usage
envoy.streaminfo.upstream_host() --- 127.0.0.1:8000
通过下面的函数可以利用 envoy 的日志接口打印信息(msg is string type)
- envoy.logErr(msg)
- envoy.logWarn(msg)
- envoy.logInfo(msg)
- envoy.logDebug(msg)
- envoy.logTrace(msg)
local logInfo = envoy.logInfo
logInfo("hello envoy")