You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by me...@apache.org on 2019/11/28 01:07:16 UTC
[incubator-apisix] branch master updated: plugin(grpc-transcode):
support new options for `protocol buffer` encoding. (#846)
This is an automated email from the ASF dual-hosted git repository.
membphis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-apisix.git
The following commit(s) were added to refs/heads/master by this push:
new b230961 plugin(grpc-transcode): support new options for `protocol buffer` encoding. (#846)
b230961 is described below
commit b23096139e78064bd9ccf0e70b8539596ceab9c5
Author: tom2nonames <13...@139.com>
AuthorDate: Thu Nov 28 09:07:09 2019 +0800
plugin(grpc-transcode): support new options for `protocol buffer` encoding. (#846)
* bugfix: Adjust the MaxLength parameter in grpc proto from 4096b to 1M (#820)
* change: grpc-transcode plugins add schema check
---
doc/plugins/grpc-transcoding-cn.md | 71 +++++++++++++++++++++++++-
lua/apisix/plugins/grpc-transcode.lua | 43 ++++++++++++++--
lua/apisix/plugins/grpc-transcode/request.lua | 15 ++++--
lua/apisix/plugins/grpc-transcode/response.lua | 10 +++-
lua/apisix/plugins/grpc-transcode/util.lua | 6 ++-
5 files changed, 133 insertions(+), 12 deletions(-)
diff --git a/doc/plugins/grpc-transcoding-cn.md b/doc/plugins/grpc-transcoding-cn.md
index 200504f..f95b448 100644
--- a/doc/plugins/grpc-transcoding-cn.md
+++ b/doc/plugins/grpc-transcoding-cn.md
@@ -53,7 +53,7 @@ curl http://127.0.0.1:9080/apisix/admin/proto/1 -X PUT -d '
* `proto_id`: `.proto`内容的id.
* `service`: grpc服务名.
* `method`: grpc服务中要调用的方法名.
-
+* `option`: proto 编码过程中的转换选项. [ "int64_as_string" / "enum_as_value" / "auto_default_values" / "enable_hooks" ]
### 示例
@@ -107,3 +107,72 @@ Proxy-Connection: keep-alive
这表示已成功代理。
+
+#### 使用 grpc-transcode 插件的 pb_option 选项
+
+在指定 route 中,代理 grpc 服务接口:
+
+**选项清单**
+ * 枚举类型
+ > enum_as_name
+ > enum_as_value
+
+ * 64位整型
+ > int64_as_number
+ > int64_as_string
+ > int64_as_hexstring
+
+ * 使用默认值
+ > auto_default_values
+ > no_default_values
+ > use_default_values
+ > use_default_metatable
+
+ * Hooks开关
+ > enable_hooks
+ > disable_hooks
+
+```shell
+curl http://127.0.0.1:9080/apisix/admin/routes/23 -X PUT -d '
+{
+ "methods": ["GET"],
+ "uri": "/zeebe/WorkflowInstanceCreate",
+ "service_protocol": "grpc",
+ "plugins": {
+ "grpc-transcode": {
+ "proto_id": "1",
+ "service": "gateway_protocol.Gateway",
+ "method": "CreateWorkflowInstance",
+ "pb_option":["int64_as_string"]
+ }
+ },
+ "upstream": {
+ "type": "roundrobin",
+ "nodes": {
+ "127.0.0.1:26500": 1
+ }
+ }
+}'
+```
+
+#### 测试
+
+访问上面配置的 route:
+
+```
+$ curl -i "http://127.0.0.1:9080/zeebe/WorkflowInstanceCreate?bpmnProcessId=order-process&version=1&variables=\{\"orderId\":\"7\",\"ordervalue\":99\}"
+HTTP/1.1 200 OK
+Date: Wed, 13 Nov 2019 03:38:27 GMT
+Content-Type: application/json
+Transfer-Encoding: chunked
+Connection: keep-alive
+grpc-encoding: identity
+grpc-accept-encoding: gzip
+Server: APISIX web server
+Trailer: grpc-status
+Trailer: grpc-message
+
+{"workflowKey":"#2251799813685260","workflowInstanceKey":"#2251799813688013","bpmnProcessId":"order-process","version":1}
+```
+
+`"workflowKey":"#2251799813685260"` 这表示已成功。
diff --git a/lua/apisix/plugins/grpc-transcode.lua b/lua/apisix/plugins/grpc-transcode.lua
index 7791a4f..4c8191f 100644
--- a/lua/apisix/plugins/grpc-transcode.lua
+++ b/lua/apisix/plugins/grpc-transcode.lua
@@ -16,18 +16,53 @@
--
local ngx = ngx
local core = require("apisix.core")
+local schema_def = require("apisix.schema_def")
local plugin_name = "grpc-transcode"
local proto = require("apisix.plugins.grpc-transcode.proto")
local request = require("apisix.plugins.grpc-transcode.request")
local response = require("apisix.plugins.grpc-transcode.response")
+local pb_option_def = {
+ { description = "enum as result",
+ type = "string",
+ enum = {"int64_as_number",
+ "int64_as_string",
+ "int64_as_hexstring"},
+ },
+ { description = "int64 as result",
+ type = "string",
+ enum = {"ienum_as_name",
+ "enum_as_value"},
+ },
+ { description ="default values option",
+ type = "string",
+ enum = {"auto_default_values",
+ "no_default_values",
+ "use_default_values",
+ "use_default_metatable"},
+ },
+ { description = "hooks option",
+ type = "string",
+ enum = {"enable_hooks",
+ "disable_hooks" },
+ },
+}
+
local schema = {
type = "object",
- additionalProperties = true
+ properties = {
+ proto_id = schema_def.id_schema,
+ service = { type = "string" },
+ method = { type = "string" },
+ pb_option = { type = "array",
+ items = { type="string", anyOf = pb_option_def },
+ minItems = 1,
+ },
+ requried = { "proto_id", "service", "method" },
+ additionalProperties = true }
}
-
local _M = {
version = 0.1,
priority = 506,
@@ -66,7 +101,7 @@ function _M.access(conf, ctx)
return
end
- local ok, err = request(proto_obj, conf.service, conf.method)
+ local ok, err = request(proto_obj, conf.service, conf.method, conf.pb_option)
if not ok then
core.log.error("transform request error: ", err)
return
@@ -96,7 +131,7 @@ function _M.body_filter(conf, ctx)
return
end
- local err = response(proto_obj, conf.service, conf.method)
+ local err = response(proto_obj, conf.service, conf.method, conf.pb_option)
if err then
core.log.error("transform response error: ", err)
return
diff --git a/lua/apisix/plugins/grpc-transcode/request.lua b/lua/apisix/plugins/grpc-transcode/request.lua
index 86ad724..d985d66 100644
--- a/lua/apisix/plugins/grpc-transcode/request.lua
+++ b/lua/apisix/plugins/grpc-transcode/request.lua
@@ -22,9 +22,9 @@ local bit = require("bit")
local ngx = ngx
local string = string
local table = table
+local ipairs = ipairs
-
-return function (proto, service, method, default_values)
+return function (proto, service, method, pb_option, default_values)
core.log.info("proto: ", core.json.delay_encode(proto, true))
local m = util.find_method(proto, service, method)
if not m then
@@ -33,8 +33,15 @@ return function (proto, service, method, default_values)
end
ngx.req.read_body()
- local encoded = pb.encode(m.input_type,
- util.map_message(m.input_type, default_values or {}))
+
+ if pb_option then
+ for _, opt in ipairs(pb_option) do
+ pb.option(opt)
+ end
+ end
+
+ local map_message = util.map_message(m.input_type, default_values or {})
+ local encoded = pb.encode(m.input_type, map_message)
if not encoded then
return false, "failed to encode request data to protobuf"
diff --git a/lua/apisix/plugins/grpc-transcode/response.lua b/lua/apisix/plugins/grpc-transcode/response.lua
index 617a07a..e764938 100644
--- a/lua/apisix/plugins/grpc-transcode/response.lua
+++ b/lua/apisix/plugins/grpc-transcode/response.lua
@@ -20,9 +20,9 @@ local pb = require("pb")
local ngx = ngx
local string = string
local table = table
+local ipairs = ipairs
-
-return function(proto, service, method)
+return function(proto, service, method, pb_option)
local m = util.find_method(proto, service, method)
if not m then
return false, "2.Undefined service method: " .. service .. "/" .. method
@@ -51,6 +51,12 @@ return function(proto, service, method)
buffer = string.sub(buffer, 6)
end
+ if pb_option then
+ for _, opt in ipairs(pb_option) do
+ pb.option(opt)
+ end
+ end
+
local decoded = pb.decode(m.output_type, buffer)
if not decoded then
ngx.arg[1] = "failed to decode response data by protobuf"
diff --git a/lua/apisix/plugins/grpc-transcode/util.lua b/lua/apisix/plugins/grpc-transcode/util.lua
index 3d9deba..83d89ab 100644
--- a/lua/apisix/plugins/grpc-transcode/util.lua
+++ b/lua/apisix/plugins/grpc-transcode/util.lua
@@ -67,7 +67,11 @@ local function get_from_request(name, kind)
if prefix == "int" then
if request_table[name] then
- return tonumber(request_table[name])
+ if kind == "int64" then
+ return request_table[name]
+ else
+ return tonumber(request_table[name])
+ end
end
end