# api-router **Repository Path**: null_426_7292/api-router ## Basic Information - **Project Name**: api-router - **Description**: Api路由,通过配置化的方式,提供随意组装接口的统一入口。 - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2017-09-29 - **Last Updated**: 2021-06-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1、为什么要做服务化 目前SCOPA产品本身的tuning web提供了大量接口,实现了基于titan、hbase等的数据查询功能,如:根据身份证号获取实体人信息、根据id进行关系推演、获取住宿事件等。底层的这些接口只是实现了若干个功能,并不能完全满足项目的所有场景。 同时,各GA项目根据自身的业务需求,有各自的业务场景,也会产生差异化的数据和功能接口。在有些场景下,可能会同时需要产品的若干接口以及项目中的某些接口,目前的做法是各项目根据自己的需要,在接口层面做二次开发,对产品和项目的功能进行封装,这样产生的封装逻辑,无法复用于其他项目。 基于以上问题,要将这些适用于项目的业务场景,进行服务化封装,而不是简单的代码封装,以提高项目之间的复用率。 # 2、如何做 业务场景依赖的底层逻辑,都比较独立,一般是若干个接口,或若干个数据运算单元,这些功能逻辑可以各自封装成独立的适配器,比如tuning web的接口可以封装成通用的适配器,built-in,任何项目都可以使用,同时各个项目会有自己特有的逻辑的,作为plugin的适配器。 各项目中的业务场景不尽相同,即使同样的业务场景,比如获取人的电子档案,需要整合的接口、数据也各有差异,因此业务场景层面抽象出来的应该是可配置化的,而不是写死的hard code。 # 3、架构图 ![image](http://git.oschina.net/mayuanxiaonong/resource/raw/master/api-router/attachment_1.png) # 4、V1.0版 & 场景案例 > 代码工程:[http://git.oschina.net/hbga/api-router (需授权)](http://git.oschina.net/hbga/api-router) ### 适配器实现 继承BaseAdapter,添加Adapter注解,标明适配器名称、描述,重写call方法,从request中获取参数,编写定制化的逻辑。按需实现。 ![image](http://git.oschina.net/mayuanxiaonong/resource/raw/master/api-router/attachment_2.png) ### 服务配置 配置服务名到适配器列表的映射,一个服务名对应若干个适配器名称,以分号隔开。按需配置。 ![image](http://git.oschina.net/mayuanxiaonong/resource/raw/master/api-router/attachment_3.png) ### 接口层 提供统一入口,服务地址根据配置动态映射,使用线程池异步调用依赖的若干个适配器。 ![image](http://git.oschina.net/mayuanxiaonong/resource/raw/master/api-router/attachment_4.png) ### 请求地址 根据配置文件中的服务名确定。如获取用户信息的接口地址为 *`/api/service/getPersonInfo`* ### 响应时间 接口调用为异步方式,由耗时最长的一个适配器决定总的响应时间。比如依赖的三个适配器,各自需要3秒、5秒、4秒,最终所需总时间约为5秒。 ### 返回数据 JSON格式,由各个适配器返回的数据组合而成。 ``` json { "statusCode":"200", // 状态码 "map":{ "A":Object, // A适配器返回的数据对象 "F":Object // A适配器返回的数据对象 } } ``` # 5、如何使用 ``` bash mvn clean install cd dist sh app.sh [-daemon] start|stop|status ``` # 6、说明 1. 具体的服务化场景需要多个项目逐渐积累 2. 设计该架构的目的在于减少服务化所需的成本 3. 无法满足链式依赖的适配器配置,后续会优化 4. 请求 *`/api/adapters`*,会返回已加载的适配器信息