Fizz Gateway网关脚本功能的高级用法教程

发布时间:2021-10-19 11:39:22 作者:iii
来源:亿速云 阅读:185

这篇文章主要讲解了“Fizz Gateway网关脚本功能的高级用法教程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Fizz Gateway网关脚本功能的高级用法教程”吧!

创建服务

Fizz Gateway网关脚本功能的高级用法教程

#创建聚合接口

Fizz Gateway网关脚本功能的高级用法教程

#配置输入

Fizz Gateway网关脚本功能的高级用法教程

#配置步骤

#配置步骤的基础信息

Fizz Gateway网关脚本功能的高级用法教程

#步骤说明

#数据转换

支持配置固定值,引用值和脚本

#固定值

Fizz Gateway网关脚本功能的高级用法教程

#脚本

Fizz Gateway网关脚本功能的高级用法教程

#星号 *

星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里

样例:userInfo = {"userName": "Fizz", "userID": 1234}

#优先级与覆盖顺序

固定值 < 引用值 < 脚本 < 星号*

当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高

#引用值规范

# 获取入参请求头aaa的值
input.request.headers.aaa

# 获取入参请求体bbb字段的值
input.request.body.bbb

# 获取入参URL Query参数fff字段的值
input.request.params.fff

# 获取步骤1里request1的请求头ccc的值
step1.request1.request.headers.ccc

# 获取步骤1里request1的响应体ddd的值
step1.request1.response.body.ddd

# 获取步骤1结果里eee的值
step1.result.eee

input: 表示调用方的输入数据,如H5页面提交上来的参数

stepN.requestN: 表示步骤N里调用接口N的相关参数

stepN.result: 表示步骤N的转换结果

#Fallback与预处理条件

Fizz Gateway网关脚本功能的高级用法教程

Fallback:

当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:

预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口

#配置步骤结果处理

Fizz Gateway网关脚本功能的高级用法教程

配置返回给调用方的结果

#脚本

#简介

Fizz 支持通过自定义脚本进行服务编排:

Fizz支持 javascript 和 groovy 两种脚本语言,方便开发人员灵活的选择自己熟悉的语言进行服务编排。

其中,

如果使用javascript ,可以 通过 common 对象获取一系列工具函数,方便进行逻辑处理;

而在 groovy 中,所有的工具函数都挂载在 context下,你可以很方便的使用它们。

#脚本编写格式

#javascript

编写JavaScript脚本时,需要按照以下固定格式进行编写。 function name dyFunc 不可修改。

返回值只能是基本类型,如 string/number/booleanobject/array类型的必须通过JSON.stringify 序列化后返回。

Fizz 是通过调用 js引擎执行javascript脚本,然后捕获执行结果,只能获取基本的数据类型。

object/array类型捕获前,会调用原型上的toString 方法,得到的结果为 [object type] 的字符串,并非预期的数据,所以必须通过JSON.stringify()序列化为jsonString后再返回。

请勿在js 中使用document等api

function dyFunc(paramsJsonStr) {
    var ctx = JSON.parse(paramsJsonStr)['context'];
    // do something...
    
    // return string/number/boolean/jsonString
    return JSON.stringify({});
}

#groovy

编写groovy脚本时,支持返回groovy支持的任何数据类型。

import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.JSONArray
import com.alibaba.fastjson.JSONObject

// do something...

// return any result
return result

#配置输入——脚本校验

在 编辑服务编排接口时,允许在 配置输入 中,对输入的数据进行自定义的脚本校验,校验 请求头、请求体、query参数是否通过验证。

返回的验证结果,必须是一个 序列化后的 数组,且:

参考示例:

javascript

function dyFunc(paramsJsonStr) {
    var ctx = JSON.parse(paramsJsonStr)['context'];
    // 获取聚合接口用户输入的数据
    // 获取请求头
    var token = common.getInputReqHeader(ctx, 'token');
    // 获取请求参数
    var account = common.getInputReqParam(ctx, 'account');
    var validate = [];
    
    // 校验请求参数
    if (!token) {
        // 将校验不通过的错误信息push到validate中
        validate.push('缺少 token');
    }
    
    if (!account) {
        validate.push('缺少 account');
    }
    
    // 将 数组 validate 序列化后返回
    // 空数组表示校验通过,非空表示校验不通过
    return JSON.stringify(validate);
}

groovy

// 获取聚合接口用户输入的数据
// 获取请求头
String token = context.getInputReqHeader('token')
// 获取请求参数
String account = context.getInputReqAttr('params').get('account')
List<String> validate = new LinkedList<>()

// 校验请求参数
if (token == null || token.trim().isEmpty()) {
    // 将校验不通过的错误信息add到validate中
    validate.add('缺少 token')
}

if (account == null || account.trim().isEmpty()) {
    validate.add('缺少 account')
}

// 空数组表示校验通过,非空表示校验不通过
return validate

#配置输出

#输出 完整response

在 编辑服务编排接口时,允许在 配置输出 中,自定义输出结果。

对于返回结果,建议以 { 状态码, 请求信息,请求结果 } 的数据结构进行返回,示例如下:

{
    "msgCode": 0, // 状态码
    "message": "success", // 请求信息
    "data": { // 请求结果
        "count": 1
    }
}

当脚本内部执行时,检查到发生异常,需要终止请求,可在 响应的结果中, 添加_stopAndResponse: true 用于中断,直接将当前结果返回到用户端。

{
    "msgCode": 1, // 状态码
    "message": "request error",
    "_stopAndResponse": true // 终止请求并返回响应结果
}

配置输出脚本示例:

// javascript脚本函数名不能修改
function dyFunc(paramsJsonStr) {
  var context = JSON.parse(paramsJsonStr)['context'];
  var data = common.getStepRespBody(context, 'step2', 'request1', 'data');

  // do something


  // 自定义 返回结果,如果返回的Object里含有_stopAndResponse=true字段时将会终止请求并把脚本结果响应给客户端(主要用于有异常情况要终止请求的场景)
  var result = { // 对于result 内的数据结构无其他特殊要求,msgCode/message/data字段仅做示例
    // _stopAndResponse: true,
    msgCode: '0',
    message: '',
    data: data
  };
  // 返回结果为Array或Object时要先转为json字符串
  return JSON.stringify(result);
}

#单个字段 输出脚本处理

在 编辑服务编排接口时,允许在 配置输出 中,通过脚本处理,自定义单个字段的值。

在字段配置中,选择 脚本后,即可通过脚本 配置 单个字段的值。

这里的脚本执行的结果只赋值给单个字段。

// javascript脚本函数名不能修改
function dyFunc(paramsJsonStr) {
  var context = JSON.parse(paramsJsonStr)['context'];
  var token = common.getStepRespBody(context, 'step2', 'request1', 'token');

  // do something
  var memberId = parseToken(token);
  return memberId;
}

#配置步骤

与 上面的 配置输入——脚本校验 和__配置输出__ 相同。

#结果校验

结果校验指为最终返回给用户端的数据进行校验。

返回的验证结果,必须是一个 序列化后的 数组,且:

参考示例:

javascript

function dyFunc(paramsJsonStr) {
    var ctx = JSON.parse(paramsJsonStr)['context'];
    // 获取聚合接口用户输入的数据
    // 获取请求头
    var token = common.getInputReqHeader(ctx, 'token');
    // 获取请求参数
    var account = common.getInputReqParam(ctx, 'account');
    var validate = [];
    
    // 校验请求参数
    if (!token) {
        // 将校验不通过的错误信息push到validate中
        validate.push('缺少 token');
    }
    
    if (!account) {
        validate.push('缺少 account');
    }
    
    // 将 数组 validate 序列化后返回
    // 空数组表示校验通过,非空表示校验不通过
    return JSON.stringify(validate);
}

groovy

// 获取聚合接口用户输入的数据
// 获取请求头
String token = context.getInputReqHeader('token')
// 获取请求参数
String account = context.getInputReqAttr('params').get('account')
List<String> validate = new LinkedList<>()

// 校验请求参数
if (token == null || token.trim().isEmpty()) {
    // 将校验不通过的错误信息add到validate中
    validate.add('缺少 token')
}

if (account == null || account.trim().isEmpty()) {
    validate.add('缺少 account')
}

// 空数组表示校验通过,非空表示校验不通过
return validate

#javascript 脚本中的context

javascript脚本中的context 是仅作用域函数作用域中的,作为 function dyFunc(paramsJsonStr){} 的第一个入参传入。

function dyFunc(paramsJsonStr) {
    // 传入的 paramsJsonStr 仅是一个字符串,需要通过JSON.parse进行序列化后获取`context`
    var ctx = JSON.parse(paramsJsonStr)['context'];
    // do something...
    
}

context 数据结构描述:

interface context {
    debug: boolean; // 是否DEBUG模式
    elapsedTimes: elapsedTime[]; // 各个操作的耗时
    input: { // 客户输入和接口的返回结果
        request: {  // 请求
            path: string; // 请求路径
            method: string; // 请求方法 POST/GET/PUT/DELETE/...
            headers: {
                [head: string]: any;
            }; // 请求头
            body: {
                [field: string]: any;
            }; // 请求体
            params: {
                [param: string]: any;
            }; // 响应体
        };
        response: { // 响应
            headers: {
                [head: string]: any;
            }; // 响应头
            body: {
                [field: string]: any;
            }; // 响应体  聚合接口的响应
        };
    };
    [stepName: string]: { // 步骤
        [requestName: string]: { // 接口
            request: {  // // 请求相关参数
                url: string; // 请求路径
                method: string; // 请求方法 POST/GET/PUT/DELETE/...
                headers: {
                    [head: string]: any;
                }; // 请求头
                body: {
                    [body: string]: any;
                }; // 请求体
                params: {
                    [param: string]: any;
                }; // 响应体
            };
            response: { // 响应 根据转换规则转换后的接口响应
                headers: {
                    [head: string]: any;
                }; // 响应头
                body: {
                    [field: string]: any;
                }; // 响应体
            };
        }
    };
    result: string | number | boolean; // object/array 需要使用 JSON.stirngify 序列化
}

interface elapsedTime {
    [acticeName: string]: number; // 操作名称:耗时
}

为了方便在脚本中使用context ,我们提供了 javascript 和 groovy 两种脚本的工具函数。

#工具函数——javascript

#工具函数——groovy

#抛出异常

当要在脚本里中止请求时可以通过以下方式来实现

Fizz Gateway网关脚本功能的高级用法教程

返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。

#重定向

通过脚本可以实现重定向,脚本返回一个对象且这个对象同时包含_stopAndResponse=true和_redirectUrl属性,_redirectUrl的值为重定向的目标URL,Fizz会终止后续的操作并进行重定向。JavaScript脚本样例如下:

Fizz Gateway网关脚本功能的高级用法教程

#在线测试

Fizz Gateway网关脚本功能的高级用法教程

支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题

#脚本执行异常

当脚本执行异常时context里会记录异常信息

// 上下文数据结构设计
// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果
var context = {
	// 是否DEBUG模式
	debug:false,
	
	// exception info
	exceptionMessage: "",
	exceptionStacks: "",
  exceptionData: "", // such as script source code that cause exception

  // ... other fields
}

在请求里加上returnContext=true可以返回context上下文,异常信息样例:

Fizz Gateway网关脚本功能的高级用法教程

导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布

#发布|下线和审核

Fizz Gateway网关脚本功能的高级用法教程

目前发布|下线申请有以上两个入口。

Fizz Gateway网关脚本功能的高级用法教程

#发布流程说明

申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。

感谢各位的阅读,以上就是“Fizz Gateway网关脚本功能的高级用法教程”的内容了,经过本文的学习后,相信大家对Fizz Gateway网关脚本功能的高级用法教程这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. shell脚本如何编写ping包及arp的监控并发送短信功能
  2. SpringCloud的知识点有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

javascript fizz gateway

上一篇:巨好用的Java程序员高效工具有哪些

下一篇:种软件开发职位的技能需求有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》