API低代码平台之ADI平台
ADI平台是指Application data integration,即“应用数据集成”,使用springboot开发,并通过springcloud实现微服务,是一个动态定义Http API接口的“零代码”或“低代码”平台,支持GET(查)、POST(增)、PUT(改)、DELETE(删)四种请求方式直接操作数据库数据;可动态添加多个数据源(实现原理),支持的数据库包括Oracle、Mysql、SqlServer、PostgreSQL;可以作为本方业务系统与第三方业务系统对接的桥梁,支持动态修改报文格式、字典转换、请求转发、报文加解密、签名验签、自动获取第三方的access_token、记录接口调用日志等常见的接口对接需求;接口定义完成后基于Swagger自动生成在线的接口文档,支持对接口进行在线测试。
平台使用到的技术栈包括Redis、MongoDB、Elasticsearch等,于2018年上线,经过岁月的洗礼,对接了上千个接口,在适应场景和执行效率上不断追求极致体验(配置缓存、线程并行),成为公司业务系统与第三方业务系统对接的不二之选,受到公司研发人员的一致好评!
利用该平台,业务系统研发周期至少缩短3个月。
一.ADI平台与第三方系统对接的四种基本场景
- 本方业务系统查询第三方系统的数据(比如查询婚姻信息),对接方式:本方业务系统把请求参数传给ADI,ADI把请求转发到第三方系统,接收到第三方系统的响应后,ADI利用内部配置的JavaScript转换为本方业务系统需要的数据格式,返回给本方业务系统;
- 本方业务系统推送数据给第三方系统(比如本方系统推送业务申请数据给第三方业务系统),对接方式:本方业务系统把业务编号传给ADI,ADI根据业务编号在本方数据库查询数据,利用配置的JavaScript把查询所得数据转换为第三方系统需要的数据格式后,发送给第三方系统,接收到第三方系统的响应后,返回本方系统;
- 第三方系统推送数据给本方系统(比如第三方系统推送受理数据给本方系统),对接方式:在ADI定义一个接口,把接口地址提供给第三方,ADI接收到第三方推送的数据后,把数据写入某些数据库表(是否需要写库可自定义),然后把第三方的数据利用配置的JavaScript转换为本方系统需要的数据格式,推送给本方系统(需要本方系统提供接口地址给ADI),接收到本方系统的响应后,把响应结果返回给第三方;
- 第三方系统查询本方系统的数据,对接方式:在ADI定义一个接口,把接口地址提供给第三方,根据第三方传入的查询参数,从本方数据库表查询数据,把查询结果利用平台配置的JavaScript转换为第三方需要的数据格式后,返回给第三方。
注:如果研发人员不小心在平台配置的JavaScript有死循环的bug,是不是会导致平台最终无法正常提供服务?当然不会,平台针对JavaScript的执行具有监控功能,当监控到有死循环发生时,会立即终止当前线程,并响应死循环提示信息。
二.动态定义接口-快速将数据库表生成API能力
- 最基本的数据查询功能(自定义sql语句,支持联合查询);
- 同时查多个数据库(多数据源模式);
- 数据新增功能(支持多表写入);
- 数据修改功能(支持多表更新);
- 数据删除功能(支持多表删除);
- 值得注意的是,平台支持条件判断,比如当满足某个条件时,才操作指定的数据库或表,不操作其它数据库或表。
三.动态定义接口-快速与第三方系统对接
- 一对一的对接(一次请求对应一个第三方系统);
- 一对多的对接(一次请求分发多家系统),值得注意的是,平台支持条件判断,比如当满足某个条件时,才分发给指定的系统,不分发给其它系统;
- 自动获取第三方系统的access_token(自定义缓存时间);
- 验证ADI调用者的access_token(基于OAuth2.0客户端认证)。
本方业务系统只需要调用ADI接口时基本上只需要传入极少的入参(往往是一个入参),ADI通过自定义sql语句查询组装为json报文(支持多层嵌套),发送给第三方系统,大大降低了业务系统研发人员的工作量。
四.报文格式转换
- 对请求ADI的报文进行格式转换,把报文转换为本方业务系统需要的格式;
- 对ADI请求第三方系统的报文进行格式转换,把报文转换为目标系统需要的格式;
- 对第三方响应的报文进行格式转换,把报文转换为本方业务系统需要的格式;
- 对ADI响应给调用者的报文进行格式转换,把报文转化为接口调用者需要的数据格式。
格式转换涉及到“低代码”的使用,在线配置一段javascript程序即可实现,无需重启应用,而且javascript中可以调用ADI平台内置的一些java工具类哦,比如通过文件url获取文件base64字符串、15位身份证号码转18位、java中Date对象的使用等等。
五.字典值自动转换
- 把请求ADI报文中的字典值转换为本方业务系统的字典值;
- 请求第三方系统时把本方系统的字典值自动转换为第三方业务系统的字典值;
- 把第三方系统响应报文中的字典值转换为本方业务系统的字典值;
- 把ADI响应报文中的字典值转换为接口调用者需要的字典值。
六.报文加解密
- 对请求ADI的报文进行解密(支持RSA、SM2、SM4);
- 对请求第三方系统的报文进行加密(支持RSA、SM2、SM4);
- 对第三方系统响应的报文进行解密(支持RSA、SM2、SM4);
- 对ADI响应报文进行加密(支持RSA、SM2、SM4)。
七.报文签名验签
- 对请求ADI报文进行验签;
- 对请求第三方系统的报文进行签名;
- 对第三方系统响应的报文进行验签;
- 对ADI响应报文进行签名。
八.数据合法性验证
- 对POST、PUT请求ADI的json报文进行合法性验证(基于JsonSchema);
- 对第三方业务系统响应的json报文进行合法性验证(基于JsonSchema);
- 对GET请求ADI的参数进行合法性验证。
九.调用数据库存储过程
- 先把数据写入目标表,然后执行存储过程;
- 先执行存储过程,再执行sql查询语句;
我们公司有些老系统使用的技术比较老(asp),不太方便开发新接口来接收其他系统的数据,只能依赖执行存储过程来处理接口数据。
十.定义异步执行策略
- 把策略设置为异步执行,使之满足特定场景的数据共享;
- 一般场景不推荐使用该策略,因为API数据共享的目的就是尽量保证数据的实时性,异步策略可能导致无法及时发现数据共享失败。
十一.定义前置执行策略
- 当一个接口有多个需要执行的策略时,可以把其中一个策略设置为前置执行,也就是说当且仅当这个策略执行成功时,才会执行后续策略;
- 使用场景:A系统要通过ADI平台发送业务申请数据给B系统,B系统要求先接收结构化数据,然后才能接收非结构化数据,此时可以定义一个接口(比如就叫申请数据发送接口),并且给这个接口定义两个执行策略(结构化数据发送策略、非结构化数据发送策略),把发送结构化数据的策略设置为前置策略即可。
十二.定义静默执行策略
- 当一个接口有多个需要执行的策略时,可以把其中一些策略设置为静默执行,所谓静默执行,是指该策略如果执行成功,那么不会把结果信息返回给调用者,但如果该策略执行失败,则会给调用者返回错误信息;
- 使用场景:A系统要通过ADI平台发送业务申请数据给B系统,B系统要求先接收结构化数据,然后才能接收非结构化数据,此时可以定义一个接口(比如就叫申请数据发送接口),并且给这个接口定义两个执行策略(结构化数据发送策略、非结构化数据发送策略),如果不设置静默策略,那么ADI会把两个策略的执行结果合并后返回给A系统,可能造成A系统难以解析ADI的响应报文,此时就可以把非结构化数据发送策略设置为静默执行。
十三.自动生成接口在线测试文档
- 接口配置完成后,将自动生成在线测试文档,无需PostMan等工具即可对接口进行测试;
- 接口文档使用Swagger生成。
十四.接口调用日志查询
- 每个策略的每次执行都会产生一条日志信息;
- 每条日志都可以抓取请求报文中的某个字段作为日志跟踪值(一般是某个业务的唯一标识字段,比如业务编号),方便后期快速查询定位日志。
- 日志同步写入ES(任意查、高效查)和MongoDB(减少Mysql数据库的压力)
十五.接口调用日志清理
- 可配置策略日志的清理模式,避免无效日志占用太多的存储空间;
- 指定只保留多少天以内的日志;
- 指定清理调用失败的日志;
- 指定清理测试阶段的日志;
- 指定清理调用成功,但是无有效响应数据的日志(比如轮询服务要查询某个系统的某个业务是否到达了某个指定进度,达到进度前的查询结果可能都是空的,那么可以指定清理这些日志)。