服务编排案例演示
本节将通过一个实际案例,对数据服务产品的使用方法及流程进行梳理,更好的方便用户了解产品整体的功能及用法。
背景
当前需要提供一个查询用户预定酒店的服务,前端只需要传一个订单ID,后端就会返回整个订单的信息,包括用户信息、酒店信息和房间信息等。
对上述需求进行分析:
- 首先,当请求订单详情时将先返回订单对应的用户ID、酒店ID、房间ID,因此将涉及4个API服务;
- 其次,根据各类ID查询对应的信息,例如订单ID返回用户ID、酒店ID以及房间ID;用户ID查询用户账号、姓名、年龄以及性别;酒店ID查询酒店名称、星级以及地点;房间ID查询房型、楼层以及是否有窗;
- 最后,通过服务编排功能将上述几个服务进行加工整合,将整合好的数据进行返回。
示例图如下:
准备
准备阶段需要完成数据、权限以及资源组的准备工作。
案例数据
本案例中涉及的数据源为MySQL,需要事先在MySQL中准备数据,数据包括:酒店订单表、用户详情表、酒店详情表以及房间详情表四张表,示例如下:
- 酒店订单表
订单ID 用户ID 酒店ID 房间ID 10001 01 20001 1601 10002 01 20002 1503 10003 02 20003 1201 10004 03 20004 1101 10005 05 20002 1602 10006 04 20001 1202 10007 07 20003 1601 10008 06 20002 1601
参考代码:
Create table training2.hotel_order_info(
`order_id` int(10) comment '酒店订单ID',
`user_id` int(10) comment '用户ID',
`hotel_id` int(10) comment '酒店ID',
`room_id` int(10) comment '房间ID'
)comment '酒店订单表'
Insert into training2.hotel_order_info VALUES(10001,01,20001,1601),(10002,01,20002,1503), (10003,02,20003,1201), (10004,03,20004,1101), (10005,05,20002,1602), (10006,04,20001,1202), (10007,07,20003,1601), (10008,06,20002,1601);
- 用户详情表
用户ID | 账号 | 姓名 | 年龄 | 性别 |
---|---|---|---|---|
01 | MH0001 | 逍遥生 | 25 | 男 |
02 | MH0002 | 杀破狼 | 24 | 男 |
03 | MH0003 | 舞天姬 | 20 | 女 |
04 | MH0004 | 玄彩娥 | 18 | 女 |
05 | MH0005 | 龙太子 | 20 | 男 |
06 | MH0006 | 虎头怪 | 25 | 男 |
07 | MH0007 | 神天兵 | 28 | 男 |
参考代码:
Create table training2.user_info(
`user_id` int(10) comment '用户ID',
`user_account` varchar(64) comment '账号',
`user_name` varchar(64) comment '姓名',
`user_age` int(10) comment '年龄',
`user_gender` varchar(64) comment '性别'
)comment '用户详情表'
Insert into training2.user_info VALUES(01,'MH0001', '逍遥生' ,25, '男'),(02,'MH0002', '杀破狼' ,24, '男'), (03,'MH0003', '舞天姬' ,20, '女'), (04,'MH0004', '玄彩娥' ,18, '女'), (05,'MH0005', '龙太子' ,20, '男'), (06,'MH0006', '虎头怪' ,25, '男'), (07,'MH0007', '神天兵' ,28, '男');
- 酒店详情表
酒店ID 酒店名称 星级 地点 20001 云来酒店 四星 长安 20002 长寿村酒店 四星 长寿村 20003 傲来国客栈 三星 傲来国 20004 长安酒店 五星 长安
参考代码:
Create table training2.hotel_info(
`hotel_id` int(10) comment '酒店ID',
`hotel_name` varchar(64) comment '酒店名称',
`hotel_level` varchar(64) comment '星级',
`hotel_addr` varchar(64) comment '地点'
)comment '酒店详情表'
Insert into training2.hotel_info VALUES(20001,'云来酒店', '四星' , '长安'),(20002,'长寿村酒店', '四星' , '长寿村'), (20003,'傲来国客栈', '三星' , '傲来国'), (20004,'长安酒店', '五星', '长安');
- 房间详情表
房间ID 房型 楼层 是否有窗 1101 通铺 1楼 否 1201 柴房 2楼 否 1202 地字1号 2楼 是 1601 天字1号 6楼 是 1602 人字1号 6楼 是 1503 天字2号 5楼 是
参考代码:
Create table training2.hotel_room_info(
`room_id` int(10) comment '房间ID',
`room_style` varchar(64) comment '房型',
`room_floor` varchar(64) comment '楼层',
`room_window` int(10) comment '是否有窗,1:是,0:否'
)comment '房间详情表'
Insert into training2. hotel_room_info VALUES(1101,'通铺', '1楼', 0),(1201,'柴房', '2楼', 0), (1202,'地字1号', '2楼', 1), (1601,'天字1号', '6楼', 1) , (1602,'人字1号', '6楼', 1) , (1503,'天字2号', '5楼', 1);
权限
此案例中会涉及到API集合、API列表、应用管理、策略管理、资源组等功能模板,因此需要配置相应的权限给不同的角色或用户。
涉及该步骤的角色:项目负责人、管理员 |
在安全中心页面,在左侧菜单栏选择安全管理 - 功能权限,在右侧点击添加方案,进入方案配置页面。在页面中选择具体的授权对象,如此处选择数据服务。
在实际使用过程中可根据要求对权限进行设置,此处权限设置如下:
功能模块:
功能模块主要用来设置是否有权限查看数据服务中各功能页面,如无查看权限,则相应的功能项将被隐藏,无法进行查看。
集合:
集合主要用来设置角色或用户是否在API集合功能模块里具有对API集合新建、查看、编辑、删除的权限。
API:
该项主要是用来设置角色或用户是否在API列表功能模块里具有API或服务编排的新建、查看、导出下载、测试、编辑、删除、复制等权限。
应用:
该项主要是用来设置角色或用户是否在应用管理功能模块里具有对已有应用的查看、编辑、删除以及新建应用的权限。
访问策略、流控策略、报警策略、行级权限:
这几项主要是用来设置角色或用户对各种策略的使用权限,设置方式相同,仅以一种为例。
资源组:
该项主要是用来设置角色或用户是否具有资源组新建以及对现有资源组的编辑、查看、删除权限。
配置完各模块的权限之后,在授权对象处指定角色或用户,点击保存完成配置。
资源组配置
在数据服务页面,点击下方配置管理进入配置管理页面,在左侧菜单栏中选择资源组管理,点击右侧页面中新建按钮即可开始资源组的创建。
涉及该步骤的角色或用户:已在安全中心授予资源组新建等权限的角色或用户 |
因为本次案例会涉及API和服务编排的创建,所以在资源组里面要完成两类资源组的配置,具体配置参数视不同环境而异,这里需要注意的是资源类型的选择,对于API的资源组需要选择资源类型为API,对于服务编排资源组的资源类型选服务编排。
API集合
准备环节完成后就进入到具体的配置环节,首先配置API集合,集合名称叫做酒店订单,用来存放API和数据服务。
在数据服务页面选择服务开发 - API管理列表 - API集合,点击右侧新建API集合。
在新建弹框中,输入集合名称为酒店订单,集合Path为hotelorder,集合Path和API Path会生成唯一的API请求地址Path。
创建完成后的集合会在集合列表中进行展示,点击右侧API列表,可查看属于该集合的API和服务编排。
新建API
在API列表页面,点击新建API开始API创建,根据前面分析,此处需要创建4个API。
涉及该步骤的角色或用户:已在安全中心授予API新建等权限的角色或用户 |
酒店订单表API
在配置API信息页面完成如下信息填写:
配置项 | 配置参数 |
---|---|
API名称 | hotel_order_test |
API集合 | 酒店订单 |
API Path | hotel_order_test |
协议 | HTTP |
请求方式 | GET |
返回类型 | JSON |
超时时间 | 10000 |
描述 | 酒店订单表API |
apiToken鉴权 | 开启 |
除了配置上述信息外,还需要完成入参定义的配置。
配置项 | 配置参数 |
---|---|
参数名 | order_id |
入参类型 | 普通入参 |
参数类型 | 整型 |
是否必填 | 否 |
示例值 | 10001 |
描述 | 10001-10008 |
点击下一步按钮,进入选择表和参数配置页面。在选择表项中,根据实际存放数据位置进行数据源的选择,此案例中数据源为MySQL,所以配置如下:
在选择返回和排序参数中,选择需要返回的参数,并将参数的返回值进行排序。此处,需返回参数为user_id(用户ID)、hotel_id(酒店ID)、room_id(房间ID)。
添加请求参数项中设置绑定参数order_id,绑定字段。
配置完成后点击完成,开始测试进入测试页面。在绑定资源组选择已经创建好的API资源组,进行连通性测试。同时在请求参数处输入测试值,例如10001。
点击开始测试,在右侧查看测试结果,请求结果显示成功,可在返回内容处查看返回结果是否是自己预期的。在这个API当中,我们期望输入order_id,返回room_id、user_id以及hotel_id。
点击完成,API创建完成。
用户详情表API
同酒店订单表API类似,首先需要完成配置API信息页面的参数填写。
配置项 | 配置参数 |
---|---|
API名称 | user_info_test |
API集合 | 酒店订单 |
API Path | user_info_test |
协议 | HTTP |
请求方式 | GET |
返回类型 | JSON |
超时时间 | 10000 |
描述 | 用户详情表API |
apiToken鉴权 | 开启 |
除了配置上述信息外,还需要完成入参定义的配置。
配置项 | 配置参数 |
---|---|
参数名 | user_id |
入参类型 | 普通入参 |
参数类型 | 整型 |
是否必填 | 否 |
示例值 | 1 |
描述 | 1-7 |
点击下一步按钮,进入选择表和参数配置页面。在选择表项中,根据实际存放数据位置进行数据源的选择,此案例中数据源为MySQL,所以配置如下:
在选择返回和排序参数中,选择需要返回的参数,并将参数的返回值进行排序。此处,需返回参数为user_account、user_name、user_age、user_gender。
添加请求参数项中设置绑定参数user_id,绑定字段。
配置完成后点击完成,开始测试进入测试页面。在绑定资源组选择已经创建好的API资源组,进行连通性测试。同时在请求参数处输入测试值,例如1。
点击开始测试,在右侧查看测试结果,请求结果显示成功,可在返回内容处查看返回结果是否是自己预期的。在这个API当中,我们期望输入user_id,返回user_account、user_name、user_age及user_gender。
点击完成,API创建完成。
酒店详情表API
在配置API信息页完成如下配置:
配置项 | 配置参数 |
---|---|
API名称 | hotel_info_test |
API集合 | 酒店订单 |
API Path | hotel_info_test |
协议 | HTTP |
请求方式 | GET |
返回类型 | JSON |
超时时间 | 10000 |
描述 | 酒店详情表API |
apiToken鉴权 | 开启 |
除了配置上述信息外,还需要完成入参定义的配置。
配置项 | 配置参数 |
---|---|
参数名 | hotel_id |
入参类型 | 普通入参 |
参数类型 | 整型 |
是否必填 | 否 |
示例值 | 20001 |
描述 | 20001-20008 |
点击下一步按钮,进入选择表和参数配置页面。在选择表项中,根据实际存放数据位置进行数据源的选择,此案例中数据源为MySQL,所以配置如下:
在选择返回和排序参数中,选择需要返回的参数,并将参数的返回值进行排序。此处,需返回参数为hotel_name、hotel_level、hotel_addr。
添加请求参数项中设置绑定参数hotel_id,绑定字段。
配置完成后点击完成,开始测试进入测试页面。在绑定资源组选择已经创建好的API资源组,进行连通性测试。同时在请求参数处输入测试值,例如20001。
点击开始测试,在右侧查看测试结果,请求结果显示成功,可在返回内容处查看返回结果是否是自己预期的。在这个API当中,我们期望输入user_id,返回hotel_name、hotel_level及hotel_addr。
点击完成,API创建完成。
房间详情表API
在配置API信息页完成如下配置:
配置项 | 配置参数 |
---|---|
API名称 | room_info_test |
API集合 | 酒店订单 |
API Path | room_info_test |
协议 | HTTP |
请求方式 | GET |
返回类型 | JSON |
超时时间 | 10000 |
描述 | 房间详情表API |
apiToken鉴权 | 开启 |
除了配置上述信息外,还需要完成入参定义的配置。
配置项 | 配置参数 |
---|---|
参数名 | room_id |
入参类型 | 普通入参 |
参数类型 | 整型 |
是否必填 | 否 |
示例值 | 1101 |
描述 | 1101,1201,1202,1601,1602,1503 |
点击下一步按钮,进入选择表和参数配置页面。在选择表项中,根据实际存放数据位置进行数据源的选择,此案例中数据源为MySQL,所以配置如下:
在选择返回和排序参数中,选择需要返回的参数,并将参数的返回值进行排序。此处,需返回参数为room_style、room_floor、room_window。
添加请求参数项中设置绑定参数room_id,绑定字段。
配置完成后点击完成,开始测试进入测试页面。在绑定资源组选择已经创建好的API资源组,进行连通性测试。同时在请求参数处输入测试值,例如1201。
点击开始测试,在右侧查看测试结果,请求结果显示成功,可在返回内容处查看返回结果是否是自己预期的。在这个API当中,我们期望输入user_id,返回room_style、room_floor及room_window。
点击完成,API创建完成。
服务编排
新建完API之后开始创建服务编排,在API列表页面点击服务编排,配置信息如下:
配置项 | 配置参数 |
---|---|
服务编排名称 | hotel_order_detail_info |
API集合 | 酒店订单 |
API Path | hotel_order_detail_info |
协议 | HTTP |
请求方式 | GET |
返回类型 | JSON |
超时时间 | 10000 |
描述 | 酒店详细信息 |
apiToken鉴权 | 开启 |
选择资源组 | 服务编排资源组(由用户事先创建完成) |
点击下一步进入工作流配置页面。根据要求拖动左侧节点类型至画布进行逻辑编排,如下图:
其中,输出节点和聚合节点是python节点用来编写API节点之间的逻辑关系。
开始
该节点作为起始节点,需要进行入参设置,入参参数名称为order_id,参数类型为整型,示例值为10001。
酒店订单
该节点为API节点,需要选择hotel_order_test(酒店订单表API),选择API后,参数部分的信息会自动根据API内容进行填写。
输出
该节点的输入为酒店订单节点的输出内容,即user_id、hotel_id以及room_id,由于使用规则限制,API节点下不能为API节点,因此这里需要一个python节点过渡下,并不包含具体的逻辑。
import json,time,random,pickle,re,math
def handle(inputJson):
# 入参字典
input = json.loads(inputJson)
# 统一用output字典封装返回结果
output = {}
#自定义代码区
output = input['data'][0]
return json.dumps(output)
用户详情
该节点为API节点,需要选择user_info_test(用户详情表API),选择API后,参数部分的信息会自动根据API内容进行填写。
酒店详情表
该节点为API节点,需要选择hotel_info_test(酒店详情表API),选择API后,参数部分的信息会自动根据API内容进行填写。
房间详情表
该节点为API节点,需要选择room_info_test(房间详情表API),选择API后,参数部分的信息会自动根据API内容进行填写。
聚合
由于最后的输出结果是将三个API的结果进行聚合后输出,因此此处使用python节点进行逻辑加工。
import json,time,random,pickle,re,math
def handle(inputJson):
# 入参字典
input = json.loads(inputJson)
# 统一用output字典封装返回结果
output = {}
#自定义代码区
out1=input['42']
out2=input['47']
out3=input['48']
out1=out1['data'][0]
out2=out2['data'][0]
out3=out3['data'][0]
out3.update(out2)
out3.update(out1)
list1=[]
list1.append(out3)
output['data']=list1
return json.dumps(output)
此处,需要注意的是42,47,48这三个为上游节点的node_id,当上游只有存在多个节点时,下游可通过node_id去识别。
- 结束
结束节点需要输出最后的返回参数,此处需要输出user_account、user_name、user_age、user_gender、hotel_name、hotel_level、hotel_addr、room_style、room_floor及room_window。
配置完所有节点后点击画布上方运行按钮进行测试。输入测试值10001,点击开始测试。
在运行结果处会展示返回结果,符合返回预期便可点击完成并退出。
策略管理
创建完成后可对API和服务编排进行策略绑定。绑定前需要先完成各个策略的创建。
涉及该步骤的角色或用户:已在安全中心授予访问策略、流控策略、报警策略以及行级权限新建等权限的角色或用户 |
流控策略
在流控策略中,创建API调用限制的策略,如下:
创建完成后,点击绑定API进入详情页,在详情页中点击绑定API,选择需要绑定的API名称,这里选择服务编排hotel_order_detail_info。
访问策略
在访问策略中,创建需要加入白名单或者黑名单的IP地址,再将相关的API进行绑定。
创建完成后,同样绑定服务编排hotel_order_detail_info。
报警策略
在报警策略中,系统预置错误率报警策略,当API提交发布后将自动绑定该策略。除此之外,还支持QPS、平均响应时间、慢查询(占比)、慢查询(数量)的报警策略配置,根据实际需求进行设置。
行级权限
行级权限的设置仅针对入参为必填的字段。例如,order_id当中不包含10004,则在实际用有数BI调用时会提示行级校验未通过,入参值未匹配。(此处只是演示,该步骤不包含在本案例里面)
应用的新建和申请
涉及该步骤的角色或用户:已在安全中心授予应用新建等权限的角色或用户 |
在应用管理页面,点击新建应用按钮进行创建,在弹窗中输入应用名称酒店app。
如果是应用的创建人且是API的创建人或者有相关权限的角色或用户可直接将API或服务编排绑定到应用,如果不是,则需要通过API集市进行申请。
在应用管理页面,点击左侧查看授权按钮,进入应用详情页面,绑定服务编排hotel_order_detail_info。
如果没有权限的用户,可前往API集市,找到需要绑定的API名称,点击申请API,填写相关信息进行申请,申请审批人为API的创建人。
API调用测试
由于在构建时,选择开启了apiToken,因此在填写Query Headers时需要填写version、appKey以及apiToken。其中,version为v2;appkey可从应用详情页获取;apiToken可在API详情页获取。
appkey:
apiToken:
同时还需要请求地址,请求地址也在API详情页获取:
在有数BI中填写信息如下:
查看返回JSON: