第43卷㊀第4期2020年12月㊀㊀上㊀海㊀船㊀舶㊀运㊀输㊀科㊀学㊀研㊀究㊀所㊀学㊀报JOURNALOFSHANGHAISHIPANDSHIPPINGRESEARCHINSTITUTEVol.43No.4Dec.2020收稿日期:2020 ̄08 ̄13
作者简介:李㊀翔(1985 )ꎬ男ꎬ湖南益阳人ꎬ工程师ꎬ主要从事系统架构设计㊁大数据处理方面的工作ꎮ㊀㊀文章编号:1674 ̄5949(2020)04 ̄0039 ̄06
基于WSO2APIM的API全生命周期
管理平台架构设计与研发
李㊀翔
(中远海运科技股份有限公司ꎬ上海200135)
摘㊀要:为了能集中高效地对企业中已有的各类应用程序编程接口(ApplicationProgrammingInterfaceꎬAPI)进行管理ꎬ基于WSO2APIM的开源组件ꎬ设计并搭建一套支持定义㊁开发㊁测试㊁发布和调用管理等API全生命周期管理的API管理平台ꎮ通过引入ELK㊁Kafka和eCharts等第三方组件进行二次集成研发ꎬ实现对API调用记录的保存和大屏显示等功能ꎮ经在某大型集团公司实际应用ꎬ验证该平台具有良好的效果ꎮ
关键词:应用程序编程接口管理平台ꎻ全生命周期ꎻ集成研发
中图分类号:TP317.1㊀㊀㊀文献标志码:A
ArchitectureDesignandDevelopmentofAPILifecycleManagementPlatformBasedonWSO2APIM
LIXiang
(COSCOSHIPPINGTechnologyCo.ꎬLtd.ꎬShanghai200135ꎬChina)
Abstract:OneofthemajorchallengesforenterprisemanagerishowtomanageawiderangeofAPI(ApplicationProgrammingInter ̄face)efficiently.BasedontheopensourceAPIM(API ̄Manager)providedbyWSO2ꎬanAPImanagementplatformisdesignedandbuilttosupportAPImanagementinthefulllifecycleꎬincludingdefinitionꎬdevelopmentꎬtestingꎬreleaseandinvokingman
微服务网关设计agement.Byintroducingsomethird ̄partycomponentssuchasELKꎬKafkaꎬeChartsꎬthefunctionsꎬlikerecodingtherawlogofAPIcallingandtheplatformdashboardaredeveloped.Thisplatformhasbeenofficiallylaunchedinalargegroupcompanyandachievedexcellentre ̄sults.Keywords:APImanagementplatformꎻfulllifecycleꎻsystemintegration0㊀引㊀言㊀㊀随着微服务架构的不断发展ꎬ各应用服务之间的数据交互越来越多地采用应用程序编程接口(Applica ̄tionProgrammingInterfaceꎬAPI)完成ꎮAPI可完成系统内部各组件和各系统间的数据交换ꎮ以API的方式进行服务调用ꎬ可避免重复开发代码ꎬ从而提高系统集成的效率ꎻ同时ꎬ各应用系统间的数据孤岛可被打破ꎬ数据资源可得到更加高效的利用ꎮ公司或组织(即API提供者)通过API的方式将其数据资产或服务提供给内部或第三方(即API消费者)ꎬ能更好地开发和提升其业务价值[1]ꎮ目前ꎬ除了企业内部ꎬ越来越多的互联网企业开始采用API提供公共服务ꎬ即开放API(OpenAPI)ꎮ因此ꎬ企业内部应用系统可很好地利用OpenAPI为企业创新应用赋能ꎬ提高系统的处理能力ꎬ扩大其业务范围ꎮ
某大型集团公司在信息化系统建设过程中形成了大量内部APIꎬ如何便捷高效地对这些接口进行管理ꎬ
是该公司未来提升整体信息化服务能力需考虑的重点问题之一ꎮ对此ꎬ该公司通过对行业内流行的商业和开源方案进行比较ꎬ综合考虑功能完整性㊁性能㊁定制开发能力和运营成本等多方面因素之后ꎬ最终选择由WSO2开源的API ̄Manager(APIM)搭建API管理平台ꎬ并在试运行期间针对原生平台存在的不足进行完善和二次研发ꎬ从而实现对API生成㊁管理和集成的全面管控ꎬ实现对应用系统㊁数据库和已存在的业务API的统一整合ꎬ提供连接各信息孤岛的数据通路ꎬ进而为数据融合㊁应用重组和业务重构奠定技术基础ꎮ1㊀平台架构设计
API管理平台采用由WSO2开源的构建于轻量企业服务总线(EnterpriseServiceBusꎬESB)组件Apache
Synapse上的APIM设计ꎮ整个管理平台采用微服务架构ꎬ各组件可实现动态伸缩ꎬ保证平台不存在性能瓶颈ꎮ平台提供完善的API管理能力ꎬ具有限流㊁分项授权㊁后端负载均衡和故障转移等功能ꎮ整个API管理平台由开发者门户㊁API发布组件㊁API网关㊁身份信息服务和统计服务等5部分组成ꎬ其架构见图
1ꎮ图1㊀API
管理平台系统架构
图2㊀API生命周期管理流程1.1㊀发布工具
API管理平台通过API发布工具对API进行生命周期管理ꎬ包括开发㊁发布㊁管理和监控ꎮ在API管理
平台中ꎬSOAP(SimpleObjectAccessProtocol)风格接口和Restful风格接口都能得到良好的支持ꎮ1)对于Restful风格的接口ꎬAPI管理平台通过集成Swagger工具提供支持ꎮ目前ꎬ基于SwaggerYAML/JSON的API描述定义已成为Restful风格API的事实性标准ꎮ在业务系统的接口开发中ꎬ通过Swagger相关工具包ꎬ可自动生成API的描述文档ꎮ接口开发人员可通过将描述定义粘贴到发布工具中ꎬ完成对API的定义ꎮ2)对于SOAP风格的接口ꎬ在发布工具中ꎬ可直接通过提供WSDL(WebServicesDescriptionLanguage)
接口定义的方式完成对API的定义ꎮ
在完成接口定义之后ꎬ接口发布人员可指定接口后
端服务的测试环境地址和生产环境地址ꎬ便于接口使用
者对接口进行测试和正式调用ꎮ考虑到对分布式大规模
系统的支持ꎬ发布工具中允许对各类地址定义多个后端ꎬ
通过负载均衡提供更大的吞吐量和更强的并发性ꎮ
整个API的生命周期包含创建㊁原型㊁发布㊁阻止㊁弃
用和下线等6个阶段ꎮ各阶段的转换关系见图2ꎮ㊀㊀API生命周期各阶段的含义如下ꎮ
1)创建:API已在平台中定义ꎬ但还没有发布ꎬ此时
API用户无法看到对应的APIꎮ1
4李㊀翔:基于WSO2APIM的API全生命周期管理平台架构设计与研发㊀㊀㊀㊀㊀㊀
24上㊀海㊀船㊀舶㊀运㊀输㊀科㊀学㊀研㊀究㊀所㊀学㊀报2020年第4期㊀2)原型:API以原型方式发布ꎬ已定义相关的接口ꎬ且通过平台的简单模拟实现对接口的反馈ꎬ该阶段可与API用户进行接口原型设计ꎮ
㊀㊀3)发布:API接口正式发布ꎬ服务上线ꎮ此时用户可在开发者门户中看到对应的APIꎮ
4)弃用:当API接口后端服务被弃用ꎬ或有新版本的接口上线时ꎬ可弃用老版本的接口ꎮ此时ꎬ新用户无法看到该APIꎬ但原用户可继续调用ꎮ
㊀㊀5)下线:API接口终止服务ꎬ无法继续调用ꎮ
6)阻止:调用被临时禁止ꎬ一般用于接口后端服务需进行临时维护的场景ꎮ
1.2㊀开发者门户
开发者门户为API的调用者提供API浏览和测试的支持ꎮ在开发者门户中ꎬAPI调用者可直接浏览API接口的定义ꎬ包括描述信息㊁参数定义和相关接口文档等ꎮ同时ꎬ通过继承Swagger工具ꎬ调用者可直接在页面中对API接口进行调用测试ꎮ
在浏览API的同时ꎬAPI调用者可对API接口进行订阅ꎬAPI接口只有在被订阅之后才能调用ꎮ在订阅时可选择不同的并发等级ꎬ例如300次/s㊁500次/s等ꎮ不同的订阅等级可对应不同的费用级别ꎬ为后期API管理平台实行计费提供支持ꎮ
1.3㊀API网关
API网关可看作一个复杂的反向代理ꎬ在API管理平台中ꎬ所有的API调用都由网关完成ꎮAPI
调用者的调用请求到达网关之后ꎬ由网关完成身份认证㊁调用并发限制和请求内容检查等操作ꎬ在满足相关要求之后ꎬ数据被转发至接口的后端服务中ꎬ完成接口调用ꎮ在完成请求转发的同时ꎬ整个调用过程被完整地记录下来ꎬ相关流水信息被发送至统计服务中进行后续分析处理ꎮ
1.4㊀身份信息服务
身份信息服务提供对平台整个用户信息体系的管理ꎮAPI管理平台在调用接口过程中ꎬ其身份验证采用的是OAuth2协议ꎮToken的产生和生命周期管理等均由身份信息服务提供ꎮ同时ꎬ平台支持对单独APIEndpoint进行授权ꎬ相关的权限检查也由身份信息服务完成ꎮ
1.5㊀统计服务
API的调用流水数据由网关产生之后被发送至统计服务中ꎮ统计服务采用流式计算框架Siddhiꎬ在接收到调用流水数据之后ꎬ在内存中进行实时聚合ꎬ并定期写入后台数据库中ꎬ形成各种维度的报表ꎮ同时ꎬ各API接口的健康状况由统计服务进行分析ꎮ通过对得到的流水数据进行分析ꎬ统计服务可获得各API接口的运行情况ꎬ当出现异常(例如1min内调用量发生急剧变化)时ꎬ能通过邮件等方式及时通知相关人员ꎮ
1.6㊀平台部署
结合目前业界流行的容器管理技术ꎬ整个API管理平台以微服务的方式部署在集团内部的Kubernetes容器平台中ꎮ通过充分利用容器平台高可用㊁高冗余的管理能力[2]ꎬAPI管理平台能根据负载进行高效弹性伸缩和自动故障恢复的部署ꎮ同时ꎬ平台拥有一定的 自愈 能力ꎬ当某个微服务因出现故障而失效时ꎬ容器云会自动对其进行重启ꎬ实现快速恢复ꎮ在重启期间ꎬ流量会定向至其他正常运行的微服务ꎬ保证服务不中断ꎮ
2㊀平台二次集成研发
通过使用APIM已有组件ꎬ整个API管理平台能满足企业内部的大部分功能需求ꎬ但随着平台的部署实施和上线使用ꎬ已有组件逐渐无法满足部分管理需求ꎬ如调用流水记录㊁终端授权㊁用户信息透传和大数据监控等ꎮ对此ꎬ还需引入其他组件ꎬ并进行二次集成研发ꎬ对平台的功能进行完善和增强ꎮ
2.1㊀API调用流水记录
在已有的功能组件中ꎬAPI调用的流水记录仅用于产生统计汇总数据ꎬ原始流水记录并没有保存ꎬ这对于服务于整个集团的API管理平台而言是一个较大的功能缺失项ꎮ
从使用的便捷性和功能的完整性的角度来说ꎬ日志管理平台首推ELK(ElasticSearch㊁Logstash㊁Kibana)ꎮ通过查阅统计分析服务的相关手册得知ꎬSiddhi支持RDBMS㊁KAFKA㊁ES和HTTP等方式的数据输出ꎮ对
此ꎬ参考已有的统计分析应用ꎬ直接将API的流水记录发送给ElasticSearch集ꎮ
上线运行一段时间之后ꎬ发现该方案存在以下不足:1)无法对数据的格式进行调整ꎮ由于是直接从统计分析服务中写入ES集ꎬ中间没有任何数据处理ꎬ无法利用Logstash强大的filter插件ꎮ2)稳定性有一定的欠缺ꎮ由于统计分析服务中对流水记录不作任何缓存ꎬ当因某些外部原因导致连接中断时ꎬ流水记录会丢失ꎮ
参考文献[3]ꎬ引入KAFKA组件对消息进行暂存ꎬ借以减轻Logstash的压力ꎬ避免日志在处理之前丢失ꎮ新的消息传输机制见图
3ꎮ图3㊀新的消息传输机制㊀㊀消息发送到KAFKA中暂存ꎬ由Logstash消费KAFKA获取流水记录ꎬ经过Filter调整格式之后ꎬ发送至ES集中进行保存和后续查询分析ꎮ2.2㊀单个APIEndpoint的授权APIM发布工具可对整个API接口进行授权ꎬ实现不同角的人员查看不同的APIꎮ但是ꎬ在平台运维过程中可能会出现一些特殊的权限管理要求ꎬ如API调用对象是一个系统而不是开发者ꎬ需分别对API中的Endpoint单独授权ꎮ对此ꎬ采用XACML实现ꎮ
可扩展访问控制标记语言(eXtensibleAccessControlMarkupLanguageꎬXACML)定义一种基于属性的声明性细粒度访问控制策略语言㊁体系结构和处理模型ꎬ描述如何根据策略中定义的规则评估访问请求[4]ꎮ通过XACMLꎬ可描述如何控制某个具体APIEndpoint的访问权限ꎬ如要求调用者属于某个角ꎬ或角名符合某个表达式等ꎮ
在身份信息服务中ꎬ采用内置的XACML编辑器编写相应的业务控制规则ꎬ如某个APIEndpoint需用户属于特定的角ꎮ在规则发布之后ꎬAPI网关将在调用API时按对应的规则检查ꎮ若符合规则要求ꎬ则正常转发请求至后端服务ꎬ否则返回HttpCode403(Forbidden)ꎬ禁止用户调用该APIEndpointꎮXACML编辑器界面见图4ꎮ
图4㊀XACML编辑器界面
2.3㊀用户信息透传
由于API管理平台具有透明性ꎬ在后端接口的服务中ꎬ默认无法获取当前调用的用户信息ꎮ一般的API3
4李㊀翔:基于WSO2APIM的API全生命周期管理平台架构设计与研发㊀㊀㊀㊀㊀㊀
44上㊀海㊀船㊀舶㊀运㊀输㊀科㊀学㊀研㊀究㊀所㊀学㊀报2020年第4期㊀
对接流程是ꎬAPI的后端服务不进行身份验证ꎬ由API管理平台实现用户管理ꎬ对于后端系统而言ꎬ所有的接口调用均匿名ꎮ在部分接口发布过程中ꎬ后端系统明确要求将当前用户的信息传输至后端系统中ꎮ对此ꎬ需对API管理平台的传输机制进行调整改造ꎮ
APIM平台采用OAuth2.0的身份认证机制ꎬ在默认配置下ꎬ采用AccessToken进行身份信息交互ꎬ简单将该Token传输至后端系统中无法满足需求ꎮ由此ꎬ对身份验证服务的配置进行调整ꎬ使其在传输调用信息至后端接口时生成一个包含当前用户信息的JWTTokenꎬ附加在Header中ꎮ后端接口通过对应的Header字段获取JWTTokenꎬ经过解码之后即可获得相关的用户信息ꎮ
在APIM平台中ꎬ已存在相关的内置类(DefaultClaimsRetriever)实现Token的生成和注入ꎮ由于此内置
类提供的用户属性较少ꎬ不满足业务需求ꎬ需自行编程实现其他属性的注入ꎮ编写相应的Java代码ꎬ继承APIM框架的AbstractJWTGenerator类ꎬ通过populateStandardClaims方法实现用户指定属性的注入ꎮ相关代码如下:
publicMap<StringꎬString>populateStandardClaims(TokenValidationContextvalidationContext)throw
sAPIManagementExcep ̄tion{
longcurrentTime=System.currentTimeMillis()ꎻ
longexpireIn=currentTime+getTTL()∗1000ꎻ
StringapplicationId=validationContext.getValidationInfoDTO().getApplicationId()ꎻ
Stringtier=validationContext.getValidationInfoDTO().getTier()ꎻ
StringendUserName=validationContext.getValidationInfoDTO().getEndUserName()ꎻ
StringkeyType=validationContext.getValidationInfoDTO().getType()ꎻ
StringapplicationTier=validationContext.getValidationInfoDTO().getApplicationTier()ꎻ
if(endUserName.endsWith("@carbon.super")){
endUserName=endUserName.replace("@carbon.super"ꎬ"")ꎻ
}
Map<StringꎬString>claims=newLinkedHashMap<StringꎬString>(20)ꎻ
claims.put("applicationid"ꎬapplicationId)ꎻ
claims.put("applicationtier"ꎬapplicationTier)ꎻ
claims.put("enduser"ꎬendUserName)ꎻ
claims.put("exp"ꎬString.valueOf(expireIn))ꎻ
claims.put("keytype"ꎬkeyType)ꎻ
claims.put("tier"ꎬtier)ꎻ
claims.put("version"ꎬvalidationContext.getVersion())ꎻ
returnclaimsꎻ
}
2.4㊀API管理平台监控大屏
在发布工具中ꎬAPI管理平台提供对API情况的分析ꎬ可从API调用次数㊁API调用者和我的API调用
等维度进行统计分析ꎮ但是ꎬ从API管理平台管理的角度出发ꎬ已有的分析数据还不足以反映整个API管理
平台的运行情况ꎮ
为获取已有API的统计数据和实时调用数据ꎬ从系统文档出发ꎬ仔细对API管理平台的开发者门户和统
计服务提供的相关API进行梳理ꎮ针对2个方面的需求ꎬ逐一对照整理ꎬ形成以下结论:
1)对于API数量和分类等静态信息ꎬ可调用开发者门户的接口ꎻ
2)对于API调用次数和最近调用API等动态信息ꎬ可调用统计分析服务的接口ꎮ
统计分析服务使用的Siddhi组件采用的是类似大数据的处理方式ꎬ通过调用接口提交一个类SQL语

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。