Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

概述

服务编排是Fizz网关提供的一个强大的功能,能够基于现有的业务微服务通过在线配置的方式快速的生成一个聚合接口,减少中间层胶水代码以及降低编码投入。在服务编排中支持使用函数,本进阶教程中我们分三篇文章(上篇:列表展开&合并、中篇:列表提取&关联、下篇:列表字段重命名&字段移除)来介绍数据列表类函数的使用。

本文为服务编排处理列表数据系列的上篇。

函数

函数是服务编排提供的一个强大又便捷的功能,通过将一些常用的逻辑封装成函数,在服务编排中使用函数对服务编排过程的数据进行处理,从而简化我们的配置又能实现复杂的功能。

函数分类

版本要求:v2.3或以上版本

函数以fn.开头,如fn.date.timestamp(), date为类别, 网关内置了以下几大类函数

  • 公共类 fn.common
  • 日期类 fn.date
  • 字符串类 fn.string
  • 编解码类 fn.codec
  • 数学类 fn.math
  • 数据列表类 fn.list

引用值

在函数里支持使用引用值,如:

fn.string.concat({step1.result.channelCode},{step1.result.nonce})

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

{step1.result.channelCode} 表示引用值, 引用step1的结果

fn.string.concat({step1.result.channelCode},{g.account.name})

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

{g.account.name} 表示引用值, 引用公共资源”account.name”, 以g开头表示引用公共资源

嵌套调用

支持多重嵌套调用,如:

fn.codec.md5(fn.date.add(fn.date.add("2021-07-09 22:44:55", "yyyy-MM-dd HH:mm:ss", 1, fn.math.addExact(999,1)), "yyyy-MM-dd HH:mm:ss", fn.math.addExact(0,1), 1000))

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并
fn.string.toUpperCase(fn.codec.sha256(fn.string.concat({step1.result.channelCode},{step1.result.nonce},{step1.result.timestamp},{step1.result.appSecret})))

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

数据列表类函数

函数返回值类型用途参数说明 fn.list.expand(

List

如:

data=[[{a:1}],[{a:2}],[{a:3}]]

fn.list.expand(data)

返回:[{a:1},{a:2},{a:3}] data: 二维数组(列表) fn.list.merge(

List

data1=[{a:1}]

data2=[{a:2}]

data3=[{a:3}]

fn.list.merge(data1,data2,data3)

返回:[{a:1},{a:2},{a:3}] data: 列表,可多个 fn.list.extract(

List

String… fields) List

data=[

{a:1,b:4,c:7},

{a:2,b:5,c:8},

{a:3,b:6,c:9}

fn.list.extract(data, “a”, “c”)

返回:[

{a:1,c:7},

{a:2,c:8},

{a:3,c:9}

] data: 列表

fields: 【可选】字段,可多个 fn.list.join(

List

List

String joinField,

String… fields) List

dest=[

{a:1,b:4,c:7},

{a:2,b:5,c:8},

{a:3,b:6,c:9}

src=[

{a:1,d:444,e:777},

{a:2,d:555,e:888}

fn.list.join(dest,src, “a”, “d”)

返回:[

{a:1,b:4,c:7,d:444},

{a:2,b:5,c:8,d:555},

{a:3,b:6,c:9}

] dest: 目标列表

src: 被合并的列表

joinField: 两个列表关联的字段

格式:

dest列表的关联字段:src列表的

关联字段,如:userName:uname,

如果两个列表的关联字段一样可

只填一个,如:userName

fields: 【可选】被合并列表里需合并的字段,可多个,不填则合并所有字段 fn.list.rename(

List

String… fieldPairs) List

data=[

{a:1,b:4,c:7},

{a:2,b:5,c:8},

{a:3,b:6,c:9}

fn.list.rename(data, “a:apple”, “c:cat”)

返回:[

{apple:1,b:4,cat:7},

{apple:2,b:5,cat:8},

{apple:3,b:6,cat:9}

] data: 列表

fieldPairs: 【可选】需重命名

的字段对,可多个。格式:

原字段名:新字段名,如:c:cat fn.list.removeFields(

List

String… fields) List

data=[

{a:1,b:4,c:7},

{a:2,b:5,c:8},

{a:3,b:6,c:9}

fn.list.removeFields(data, “b”)

返回:[

{a:1,c:7},

{a:2,c:8},

{a:3,c:9}

] data: 列表

fields: 【可选】需删除的

字段,可多个

资料准备

Fizz网关安装

可参考: https://www.fizzgate.com/fizz/guide/installation

底层服务接口

本文服务编排调用的底层服务接口源码可从github(https://github.com/wehotel/fizz-examples)获取。从github克隆最新的fizz-examples源码,并启动fizz-examples-rest-api服务。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

管理后台(菜单位置:RPC管理->服务声明)配置服务声明,如图所示。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

新增编排接口

管理后台,菜单位置:服务编辑->接口列表,点击新增。

列表展开 fn.list.expand

本例子在编排接口中调用底层fizz-examples-rest-api服务的/fn-list/user-basic-info-list-by-roles/{roleList}接口(接口源码:FnListController)来获取用户基本信息列表,并对该接口的响应数据进行列表展开以满足我们想要的数据格式。

基础信息

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

配置输入

在配置输入中可以定义接口的入参和请求头等信息,如果不配置入参或请求头,网关会原样接收调用方传过来的所有入参或请求头,但不会对接收到的参数做任何校验。在本例子中我们不需要入参,全留空。

配置步骤

新增1个步骤step1,然后在步骤step1里新增1个请求request1,服务选择我们预先准备好的fizz-examples-rest-api服务,请求/fn-list/user-basic-info-list-by-roles/developer,manager接口。配置响应部分留空,网关会原样接收接口的返回结果。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

配置输出

在配置输出中我们使用step1.request1.response.body.*来引用配置步骤中请求的响应结果(相关引用值的使用方式可参考文档:数据转换使用文档)。

配置要返回给前端的响应报文,这里配置了响应体有以下字段:

code:引用类型,值为步骤step1中请求request1的响应的code字段;

message:引用类型,值为步骤step1中请求request1的响应的message字段;

data:引用类型,值为步骤step1中请求request1的响应的data字段并用fn.list.expand函数对其进行展开。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

测试

直接调用/fn-list/user-basic-info-list-by-roles/developer,manager接口得到的响应如图所示。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

测试接口得到响应如图所示。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

从测试接口的响应可以看出服务编排接口已完成了对/fn-list/user-basic-info-list-by-roles/developer,manager接口的请求并正确对响应的data字段的列表进行了展开。

列表合并 fn.list.merge

本例子在编排接口中两次调用底层fizz-examples-rest-api服务的/fn-list/user-basic-info-list-by-roles/{roleList}接口(接口源码:FnListController)来获取用户基本信息列表,并对该接口的两次调用响应数据进行列表合并以满足我们想要的数据格式。

基础信息

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

配置输入

在本例子中我们不需要入参,全留空。

配置步骤

新增1个步骤step1,在步骤step1里新增1个请求request1,服务选择fizz-examples-rest-api,请求/fn-list/user-basic-info-list-by-role/admin接口。在步骤step1里新增1个请求request2,服务选择fizz-examples-rest-api,请求/fn-list/user-basic-info-list-by-role/manager接口。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

配置输出

配置要返回给前端的响应报文,这里配置了响应体有以下字段:

code:引用类型,值为步骤step1中请求request1的响应的code字段;

message:引用类型,值为步骤step1中请求request1的响应的message字段;

data:引用类型,值为步骤step1中请求request1的响应的data字段与step1中请求request2的响应的data字段并用fn.list.merge函数对其进行合并。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

测试

直接调用/fn-list/user-basic-info-list-by-role/admin接口得到的响应如图所示。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

直接调用/fn-list/user-basic-info-list-by-role/manager接口得到的响应如图所示。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

测试接口得到响应如图所示。

Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

从测试接口的响应可以看出服务编排接口已完成了对/fn-list/user-basic-info-list-by-role/admin接口的请求和对/fn-list/user-basic-info-list-by-role/manager接口的请求并正确对两次调用的响应的data字段的列表进行了合并。

Fizz网关介绍

Fizz Gateway 是一个基于 Java开发的微服务聚合网关,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、回调管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。

官网:https://www.fizzgate.com

GitHub: https://github.com/wehotel/fizz-gateway-community

码云:https://gitee.com/fizzgate/fizz-gateway

入门教程:https://www.fizzgate.com/fizz/guide/GettingStarted/

进阶教程:https://www.fizzgate.com/fizz/guide/advanced/

作者:ZHONG.J

Original: https://www.cnblogs.com/ZHONG-J/p/16287462.html
Author: ZHONG_J
Title: Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(上)-展开与合并

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593167/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 关于.NET CORE 编译时错误:Microsoft.AspNetCore.Razor.Design.CodeGeneration.targets(79, 5): The project XXXXX must provide a value for Configuration.

    此笔记记载了本人在编译.Net Core项目时遇到的 Microsoft.AspNetCore.Razor.Design.CodeGeneration.targets(79, 5)…

    Java 2023年6月15日
    064
  • 【转】虚拟机网络服务启动失败Failed to start LSB 解决方法

    场景:克隆了一个虚拟机后不能重启它的网络服务编辑IP配置文件:vi /etc/sysconfig/network-scripts/ifcfg-ens33重新修改了ip后,发现还是报…

    Java 2023年5月30日
    091
  • 【JAVA UI】HarmonyOS功能很强大的弹窗XPopup

    ​参考资料 我们也可以参考Android的XPopup的框架去比较学习 api讲解 项目集成XPopup 1.我们需要在项目级的bulid.gradle 添加如下代码 reposi…

    Java 2023年5月29日
    093
  • 最新MongoDB安装,学习笔记

    MongoDB 导读 作者还在陆续更新中,如果喜欢作者的笔记,觉得可以学习到有帮助,后面会不断学习新内容,就点个关注吧,如果觉得文章有关注可以点个赞,谢谢; 官网:https://…

    Java 2023年6月9日
    073
  • 2022年6月1日笔记

    2022年6月1日笔记 求阶乘 输入一个数n,求n的阶乘; 程序源码: #include <stdio.h> main(){ int i=1,result=1,n; s…

    Java 2023年6月9日
    097
  • vue3进阶学习

    vue3进阶学习 官方网站:https://v3.vuejs.org/中文文档: https://staging-cn.vuejs.org/guide/introduction.h…

    Java 2023年6月5日
    0111
  • Qt QThread线程的简单使用

    一、概述 案例:在GUI编程中一般把耗时任务放入单独的线程中执行,用以防止主线程卡死,导致页面播放不流畅等问题。下面就简单说下在Qt中使用其自带的QThread来实现一个线程 实现…

    Java 2023年5月30日
    092
  • 【Java全栈进阶】-多态

    多态 多态的概述 多态是继封装、继承之后,面向对象的第三大特性。 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学 张三既是学生也是人,即出现两种形态。 Ja…

    Java 2023年6月7日
    053
  • 如何优化好UITableView,值得思考

    如果你觉得 UITableViewDelegate 和 UITableViewDataSource 这两个协议中有大量方法每次都是复制粘贴,实现起来大同小异;如果你觉得发起网络请求…

    Java 2023年6月16日
    066
  • Nginx + FastCgi + Spawn-fcgi + c 的架构

    参考: nginx+c/c++ fastcgi:http://www.yis.me/web/2011/11/01/66.htm cgi探索之路:http://github.tian…

    Java 2023年5月30日
    078
  • Nginx 配置反向代理及负载均衡的实现

    一、nginx的反向代理及多台虚拟机负载均衡的实现 主机负载均衡服务器:192.168.232.132 的nginx.conf 配置如下 http { include mime.t…

    Java 2023年5月30日
    062
  • Markdown语法

    Markdown语法 1.标题 示例: 这是一级标题 ## 这是二级标题 ### 这是三级标题 #### 这是四级标题 ##### 这是五级标题 ###### 这是六级标题 渲染结…

    Java 2023年6月8日
    074
  • main 方法可以继承吗?

    阿里二面:main 方法可以继承吗? 昨天,微信群里一位网友,在群里发了自己面试阿里的过程。其中一个面试,他在群里 PUA 其他网友。这道面试题就是: Java &#x4E…

    Java 2023年6月7日
    095
  • IDEA下某个module无法build生成target

    部署web项目的时候并没有成功,说是资源不可访问,于是查找原因 1、首先检查了业务代码,看前端到controller有无问题 2、其次检查了项目的配置 3、后来发现在out输出里面…

    Java 2023年6月15日
    056
  • SpringCloud(三).Hystrix熔断器

    一.服务器雪崩效应 在SpringCloud中存在多个微服务的调用情况,当服务的提供者不可用时,多次调用失败可能会导致服务调用者的不可用,逐渐扩展到整个系统不可用,这种情况称为服务…

    Java 2023年6月7日
    069
  • Linux系统与Windows系统之间的文件上传与下载

    Linux系统与Windows系统之间的文件上传与下载 在日常开发过程中,常常会遇到需要在Linux与Windows系统之间的文件的传输,有一些常用的方法与命令,在此记录 1、文件…

    Java 2023年6月8日
    065
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球