乐趣区

关于java:打造一个-API-快速开发平台牛逼

起源:toutiao.com/i6914469326074479108/

在我之前谈 API 网关的时候已经谈到过疾速开发平台,行将 API 疾速开发的一些内容放入到 API 网关中,理论来看围绕 API 全生命周期治理,自身包含了开发态,运行态,运维态。

对于 API 网关更多的是解决运行态的问题,API 网关自身应该轻量化设计,不做太多的协定转换,适配,数据映射等工作,这些工作应该放到 API 开发平台来实现。API 开发平台最终就是开发实现并裸露一个规范的 Http API 接口,并将接口注册和接入到 API 网关。

API 全生命周期治理

围绕 API 全生命周期治理来看,整个子系统划分如下:

简略来讲这部分能够合成为四个子系统,即 API 开发平台,API 网关引擎,API 监控运维平台,API 全生命周期管控平台。

对于传统 ESB 总线外面的适配器,协定转换等相干比拟重的内容,都能够转移到 API 疾速开发平台来实现,即 API 开发平台裸露规范的 API 服务接口,注册和接入到 API 网关引擎。而对于 API 监控平台则从引擎采集日志信息,进行 API 性能监控和日志监控剖析。

API 全生命周期管控平台实现 API 接口从设计,开发,测试,部署上线的全生命周期治理,也能够了解为底层三个子系统的一个对立治理门户,实现和上面三个子系统集成。

对于 API 开发平台开发和配置实现的微服务 API 接口,能够反对主动部署到微服务运行平台。

基于对象建模驱动

在整个 API 开发平台实现中,核心思想依然应该是基于对象建模驱动,通过对象建模很好的实现接口和底层数据库,数据库表之间的解耦,也不便实现底层多数据库,多表的反对能力。

以后很多 API 疾速开发平台都是基于数据库对象或表,间接公布相似 CRUD 的 API 接口服务,然而基于是数据库表的间接公布,咱们依然倡议逆向对象这层,不便后续在对象层进行相干的组合,规定扩大等操作。

对象建模和 API 接口契约

能够间接在 API 开发平台创建对象,并对数据项进行定义,对象是一个多层的树状构造实体。一个对象能够向数据库生成多张表。对于曾经存在的数据对象,也能够进行组合,将多个组合为一个复合对象构造。

对象的益处即是一个残缺的对象属于同一生命周期,能够一起进行事务管制。

一个设计好的对象能够默认生成规范的 POST,GET,DELETE 等接口操作方法,相似下图,整个对象接口契约的生成也应该是主动的。

定义好的对象能够间接生成相似 RAML,YAML,WADL 等接口契约文件。

相似 Swagger 工具一样,实现的对象建模自身也能够间接导出不同语言,不同开发框架下的客户端生产框架,服务端提供框架代码。

对象适配到数据库

后面讲到了,既能够是数据库间接逆向对象,也能够是在对象建模实现后,将对象适配到数据库。实现对象和数据库表之间的映射。一个对象能够映射到多张数据库表,因而在映射过程中除了实现数据库表和字段映射外,还须要实现主外键关联关系的映射操作。

在实现对象模型和数据库表之间的映射和适配后,根本公布的 API 接口曾经可用。

API 接口公布

对于实现的对象定义,能够抉择具体公布哪些 API 接口服务能力。比方能够只抉择公布查问接口,也能够只抉择公布数据导入的 POST 接口等。

留神 API 接口的公布,具体能够基于全局的对象建模,配置具体须要公布到接口的数据项信息。很多时候咱们对数据对象的操作,并不是操作整个对象选集,而仅仅是局部数据项。

API 接口模仿测试和验证

能够对公布的 API 接口进行模仿测试和验证,因而须要提供在线的 API 测试工具,可能不便在线进行 API 接口的测试工作。同时能够对测试过的用例和测试数据进行保留。

API 接口文档生成

反对主动生成 API 接口文档的能力。这个中央能够间接对接相似开源 Swagger 等工具来实现 API 接口文档的主动生成性能。

对象罕用接口操作

当对象定义实现后,能够基于对象进行相干 API 接口的主动生成。在这里简略列下基于对象罕用的接口办法,次要包含新增一条数据,基于主键更新,查问,删除数据。其它的则是基于条件查问对数据进行查问相干操作等。

在 GtiHub 外面开源又一个 xmysql 的工具,能够间接将整个 MySQL 数据库中的数据库表公布为 RestAPI 接口,具体能够装置试用。

npm install -g xmysql
xmysql -h localhost -u mysqlUsername -p mysqlPassword -d databaseName
http://localhost:3000

留神须要提前装置 Node.js,局部接口办法列表如下:

因为生成的 API 接口都没有相干的权限管制,因而该开源工具也仅仅用于本人测试和验证应用。然而生成的办法和 API 能够作为 API 开发工具时候参考。

实际上对于 API 接口的生成,咱们并不倡议对于简单查问条件下的查问都通过 GET 办法来实现,更好的思路还是通过 POST 办法,将查问条件作为 POST 输出进行解决。

复合对象一次生成

比方将订单作为一个对象,理论包含了订单头和订单明细表,而在进行 API 生成时候能够一次生成基于订单对象的插入操作,查问操作。最终查问进去的是一个订单复合实体 Json 数据。而对于订单插入,也是先筹备好整个订单实体信息,一次调用 API 接口实现数据插入,也不便在 API 接口实现的时候进行事务管制。

复合对象生成的 API 接口更相似于畛域对象裸露的 API 接口服务能力。

分页反对

对于查问 API 接口服务的生成,应该反对分页能力,具体分页的大小,本次查问拜访具体页数等信息都能够作为 API 接口的查问输出参数进行设置。

间接定义 API 接口并公布

在后面谈到了基于对象来公布 API 接口服务,然而还有一些业务规定逻辑类接口,简单的治理数据查问类接口等并不能简略的通过对象来主动生成。

因而还须要可能实现基于办法来公布 API 接口服务。

即在 API 疾速开发平台可能进行 API 接口的自定义,具体的定义 API 接口的输出参数和输入参数信息。同时对于定义实现的接口实现和后盾办法的绑定。

实现和 JAR 包外面的 API 接口的绑定

能够实现和一个 JAR 包外面办法或函数的绑定,将一个办法或函数公布为一个 Http API 接口办法。在以后很多私有云的云服务总线产品上能够看到这个实现形式。

实现和动静 SQL 的绑定

能够将定义的一个 API 接口办法和动静 SQL 进行绑定。其中动静 SQL 自身具体动静输出参数,这些输出参数和 API 接口定义中的输出进行数据映射。同时 SQL 语句查问的输入后果和 API 接口定义的输入字段进行映射。

如果动静 SQL 是插入或更新类,同样也能够通过参数化变量形式进行数据映射和绑定操作。

和存储过程进行绑定

一个数据库的存储过程,理论即是一个办法函数,因而能够将 API 接口定义的输出和输入和数据库存储过程的输出和输入进行映射绑定。

要留神的是针对不同的数据库存储过程 schema 信息获取和适配自身有差别,这也是在上图中构建一个独立的对立数据库适配层的起因。

规定解决

在 API 接口开发过程中,能够进行一些简略的规定解决。具体如下:

  • 输出数据完整性校验,对输出数据进行完整性校验,其中包含场景的数据类型,长度,范畴束缚等,这些都是属于比拟容易通过配置进行实现的内容。
  • 数据项间规定解决,能够对多个数据项进行简略规定解决,其中包含了场景的数据映射,数据丰盛,数据截取等。这些自身也是在支流的传统 ESB 总线产品中都反对的内容。
  • 自定义脚本语言,对于 API 疾速开发平台自身能够作为低代码开发平台的一个子类,因而如果可能反对自定义脚本语言进行规定解决,那么整体扩展性和灵活性也会失去大幅度晋升。
  • 音讯头和输入预留,对于 API 开发平台公布的 API 接口,须要对输出音讯头,输入的异样类型,异样编码,信息等字段进行提前约定。

在输出的音讯头中往往包含了相似用户名,Token 等用于拜访平安校验的字段,也包含了相似路由,分页等相干扩大字段信息。对于输入字段,须要对返回的异样类型,编码,异样信息等进行约定。特地是波及到数据 CUD 操作的时候,须要按约定的输入字段进行输入。

服务组合和编排

对于 API 开发平台还能够进一步提供服务组合和服务编排的能力。这个能力的实现也不适宜放在 API 网关来实现,而是应该布局到 API 开发平台来实现。

服务组合编排是服务组合,服务组装等,心愿通过服务编排可能实现这些事件,而不是简略的实现繁多服务的设计和开发。行将多个原子服务组合或组装在一起,最终造成一个新的服务并提供的能力。咱们举例来说明下。

比方存在 A,B,C 三个原子服务,咱们通过服务编排造成一个新的 D 服务。

三个原子服务全副是查问服务,心愿组装一个新服务,一次返回 A,B,C 三个服务查问后果

这个即咱们说的服务组合能力,比方咱们能够对合同根本信息查问,合同条款信息查问,合同执行信息查问三个根本原子服务进行组合,最终返回一个服务综合信息查问的服务,一次返回三个查问后果。

在这种场景下咱们须要思考查问后果是并行返回还是按档次返回即可。

二个查问类的原子服务,最终须要返回两个数据集关联查问的后果集

这个在微服务架构做了底层数据库拆分后常常会遇到,比方对于物料根本信息查问,和洽购订单明细查问是在两个独立的数据库独立服务提供。而咱们心愿返回的查问后果集是物料编码,名称,型号,单位,价格,洽购数量的复合后果集。

这种场景下往往个别都是在前端性能开发的时候进行组装,而实际上能够思考是否能够在服务编排层解决这个问题,该问题写代码来解决容易,然而要做为可视化服务编排组态形式来做实际上有肯定的难度。

对单个已有服务进行裁剪和丰盛并造成一个新服务输入

这个临时也将其纳入到服务编排的领域,即依然是输出服务,然而输入是提供了一个新服务。

即对单个已有的服务进行服务裁剪和丰盛,比方对于输入后果过滤掉一些数据项,对于输出固定输出一些数据项等。这些简略的服务裁剪,丰盛,或简略的数据转换能够在服务编排的时候实现,并提供一个新服务。

对多个原子服务进行流程式的前后串接并造成服务提供

这个是咱们常常看到的一种服务编排场景,即 A,B,C 三个服务间接进行编排,即 A 服务的输入间接变为 B 服务的输出,B 服务的输入又变为 C 服务的输入。如果仅仅是下面假如的这样,那么这种流程式的服务编排依然很简略,也很容易去实现。

然而实际上的难点在于 A 服务的输入自身也须要作为 C 服务的输入,同时 A,B 服务的输入也可能是整体输入的一部分,这自身就加大了服务编排可视化设计的难度。

繁多业务服务为主体服务,然而编排多个业务规定逻辑解决类服务

这也是常常会遇到的场景,比方咱们在进行合同信息导入的时候,首先要调用合同有效性校验服务,同时还有调用估算信息检查和扣减服务进行相干的完整性和业务规定校验。在这些校验实现后再调用理论的合同信息导入服务,如果校验失败则间接返回失败后果。

这类服务编排往往也正是咱们理论在进行前端性能开发时候服务进行组装的逻辑。

多个导入服务组装为一个导入服务合并导入并造成一个新服务

这个场景实际上和场景 1 是对应的,既然多个服务能够组合后造成组合后果返回,那么天然能够将多个导入服务合并为一个导入服务,一次性的实现数据导入。

比方有我的项目信息导入和我的项目 WBS 信息导入两个原子服务,那么咱们就能够提供一个新的我的项目信息导入服务,一次实现我的项目根本信息和我的项目 WBS 信息的导入。

在这些场景外面能够看到,实际上服务编排就是服务串联,服务并联下的输出和输入合并,服务内容丰盛和裁剪等常见场景。在一个现实的场景下,咱们最心愿实现的就是一个业务性能点的实现齐全可能通过服务编排可视化设计形式来实现。

源代码导出

对于 API 疾速开发平台,很难去实现简单的业务规定编码。因而在存在简单业务规定实现的时候依然是倡议开发人员本人开发代码来实现。因而整个平台应该提供源代码导出性能,导出的源代码应该间接可能编译通过,脱离 API 开发平台部署和运行。

对于导出的源代码,思考到后续 API 接口变更的场景,倡议是对扩大局部进行约定。

比方一个规范的 API 接口服务实现办法,能够在前后减少扩大解决。

//BeforeDo();
//ProcessAPI();
//AfterDo();

这样在接口实现前能够进行额定的业务规定解决和完整性校验,在接口返回数据前还能够对输入的数据进一步进行解决和加工。

微服务利用

能够将多个对象或多个 API 接口服务打包到一个微服务利用再进行部署和公布。因而在这里引入一个微服务集的概念,对微服务 API 进行打包解决。

打包实现的微服务能够导出为独立的 JAR 包进行部署,也能够间接在 API 开发平台进行托管部署。对于 API 开发平台自身应该对接到微服务运行平台。

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2022 最新版)

2. 劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版