多平台统一管理软件接口,如何实现多平台统一管理软件接口
337
2023-03-16
本文目录一览:
API 网关(API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简单的操作,即可快速、低成本、低风险地开放数据或服务。辅助用户简单、快速、低成本、低风险的实现微服务聚合、前后端分离、系统集成,向合作伙伴、开发者开放功能和数据
提供防攻击、防重放、请求加密、身份认证、权限管理、流量控制等多重手段保证 API 安全,降低 API 开放风险。
提供 API 定义、测试、发布、下线等全生命周期管理,并生成 SDK、API 说明文档,提升 API 管理、迭代的效率。
提供便捷的监控、报警、分析、API 市场等运维、运营工具,降低 API 运营、维护成本。
API 网关将能力的复用率最大化,企业间能够互相借力,企业发展能够专注自身业务,实现共赢。
API 便捷管理 (便捷的 API 管理功能,便捷的 API 管理工具)
API 生命周期管理:覆盖 API 的定义、测试、发布的整个生命周期管理,便捷的日常管理、版本管理,支持热升级和快速回滚。
便捷工具文档:提供页面调试工具,自动生成 API 文档和 SDK,大大降低人力成本。
安全稳定 (严格的权限管理、精准的流量控制、全面的监控报警)
安全防护:API 请求到达网关需要经过严格的身份认证、权限认证,才能到达后端服务。支持 HMAC(SHA-1,SHA-256)算法签名,支持 SSL 加密
流量控制:可控制单位时间内 API 允许被调用次数。用来保护企业的后端服务,实现业务分级和用户分级。
支持对 API 流控,您可以根据 API 的重要程度来配置不同流控,从而保障重要业务的稳定运行。
支持用户、应用和例外流控,您可以根据用户的重要性来配置不同流控,从而可以保证大用户的权益。
流控粒度:分钟、小时、天。
请求管理 (通过参数校验过滤无效请求,通过参数转换实现 API 高度复用,一套 API 多种服务)
参数校验:请求经过 API 网关,可根据您的配置进行参数类型、参数值(范围、枚举、正则、Json Schema)的校验,减少后端对非法请求、无效请求的资源消耗和处理成本。
参数转换:您可以在 API 网关定义参数映射规则,网关通过映射规则将后端服务通过映射翻译成任何形式,以满足不同用户的不同需求,从而避免功能重复开发。
监控告警 (结合阿里云监控服务,提供灵活全面的监控告警能力,该部分持续升级中)
监控告警:提供实时、可视化的 API 监控,包括:调用量、调用方式、响应时间、错误率,让您能够清楚的了解 API 的运行状况和用户的行为习惯。
支持自定义报警规则,来针对异常情况进行报警,降低故障处理时间。
API 市场 (一站式解决 API 管理和 API 变现)
API 市场:API 接入 API 网关后,还能以 API 服务的方式上架到阿里云 API 市场。API 网关和API 市场将为您解决计量计费、Quota 控制、运营售卖等需求。
API网关 API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简单的操作,即可快速、低成本、低风险地开放数据或服务。
利用API网关你可以提高自己公司API安全性,也可以上架到API云市场,供用户购买和使用。
这个没什么可说的,主要是你要想办法尽可能安全地存储你的AppKey和AppSecrect。
所属分组是API的基本属性,所以需要先创建分组,再在分组下创建API。每个账号默认最多可创建100个分组,如需更多分组需要提交工单。分组有所属区域(Region)的概念,比如华东上海区,选择之后就不能修改了。创建完分组之后,系统会给该分组分配一个二级域名,供测试使用,不过,每个二级域名每天最多可访问1000次。
如果你的API支持HTTPS协议,还需要为该独立域名上传 SSL 证书。我们需要把我们的域名解析到该分组上,之后才能绑定到该分组上。绑定的域名需要现在阿里云系统备案。绑定域名之后,该分组下的API就可以通过该域名来访问了,不再需要调用系统分配的二级域名了。
在API分组的环境管理中,你可以自定义环境变量,同一个变量可以再在线上、预发和测试三个环境下对应不同的值,这样在API的定义中就可以使用这里定义好的环境变量了。可以在Path、入参默认值和后端服务服务地址中加入环境变量,在API的定义中使用环境变量需要以 #变量名# 的方式使用。 如果要修改已发布的API用到的环境变量,先把老的环境变量给删掉,再重新定义一个新的同名环境变量赋上新值之后再把全部对应的API重新发布一遍,这个是异步生效的,一般发布后1分钟内生效。
这里的内容还是蛮多的,包括基本配置,前端和后端地址,请求参数配置等,详细文档可以看阿里API的官方文档,这里说几点重要的:
创建好API之后,就可以对应用进行授权了,点击API的“授权”就可以在指定环境下授权某个APP可以访问该API了,如果你在调用API的过程中控制台打印了x-ca-message中包含了Unauthorized错误,你应该想到你的API还未对该APP进行授权访问。
API编辑完成之后就可以发布到指定环境上去了,发布之后就立马生效了。可以多次编辑然后发布到不同的环境下,如果你编辑完了忘记发布到指定环境下了,是不会生效的。在分组API列表下,直接点击API名字进入的是当前API最后一次编辑保存的状态,不一定跟发布的状态一直哦。点击API右边的线上、预发或测试后面的"运行中"可以看到在该环境下最后一次编辑发布后的状态哦。
网关会在请求的时候加上日期、时间戳、nonce、userAgent、Host、AppKey、version等参数值,如果是POST请求的话,需要对参数值进行urlEncode。如果有body值的话,需要对body值,将body中的内容MD5算法加密后再采用BASE64方法Encode成字符串,放入HTTP头中。最后再通过将httpMethod、headers、path、queryParam、formParam经过一系列的运算,合成一个字符串用hmacSha256算法双向加密进行签名。
在我们分组上绑定好了域名之后,我们不管是预发还是线上环境都可以通过这同一个域名进行访问,那网关是怎么帮我们区分环境的呢?这个时候就用到上面的环境变量管理了,我们通过在环境变量中定义一个变量在不同环境下不同的值达到区分环境的效果。在网络请求的时候,我们可以在头部指定 X-Ca-Stage 参数值来让网关帮我们转发到对应环境的后端服务上,对应的值分别是:线上(RELEASE)默认、预发(PRE)和测试(TEST)。
这里重点说一下参数位置下可选的Body选项,这个地方坑了我们蛮久。我们知道在我们客户端发起POST请求时,我们会在头部指定“Content-Type”为“application/x-www-form-urlencoded”,然后把请求的参数组装成"key1=value1key2=value2"的字符串,然后在编码成二进制,放在请求的Body里,以Form表单的形式提交的。所以呢,我们在定义API的参数时,应该把参数位置选择为Body选项。但是我们在很长一段时间里,创建API时或编辑API时,参数位置处下拉一直没有Body选项,我们就把参数定义成了Query类型的了。在使用时也没有啥问题,但是一旦当我们的参数值非常长时,比如一个json字符串,这个是就报错了“414 Request-URI Too Large”,这个时候呢,网关就不会再帮我们把请求转发到服务端了。排查了很久终于找到了罪魁祸首在这里等着呢,通过把参数位置改成Body就可以了。这个可能是阿里API网关前端页面上的一个bug,有时候根本选不到Body选项,这个时候你可以先把“请求Body(非Form表单数据,比如JSON字符串、文件二进制数据等)”选项给勾选上,然后再取消勾选,再下拉展开“参数位置”就可以看到Body选项了。(该文发布时是如此,我已经将该问题反馈给阿里API网关,可能后面会修复该bug。)
另外一个问题是如果你的参数值中包含了emoji表情,需要对参数值进行urlEncode,服务端在收到请求时需要对参数值进行urlDecode。否则用的过程中会出现各种奇怪的问题。问了阿里网关的服务人员,他们的解释是,如果不进行urlEncode,参数在传到网关时可能会丢失。可以对所有Post请求的参数值统一urlEncode,服务端对收到的参数值统一进行urlDecode。
在使用网关时,timestamp和nonce这两个header参数值是可选的,如果加上这两个值,网关层会对请求进行校验,防止重放攻击。不过有个问题:在当前时间的前后15分钟的时间戳都是可以的,一旦超过15分钟就会请求失败,所以,如果用户修改了客户端的系统时间的话,API就会调不通了。这个校验有点严格,如果不知道这一点的话,用户反馈客户端不能用,而你这里测试又没有任何问题,那就泪奔了,哈哈。当然这个是可选的校验,如果不传这两个值的话,就不会校验,这个时候防重放攻击的工作就需要我们自己的服务端做了。
目前网关不支持multipart形式的上传,所以一般我们的上传API不太适合录入网关,阿里的说法是现在大家的做法普遍是先将文件上传到文件服务器,然后通过调用接口把文件地址等信息报错到服务器的方式,所以,目测以后也不大可能支持定义multipart形式的上传API。
每个 API 分组的默认流控上限是500QPS,如果你要调大QPS,需要提交工单并支付相应费用。另外网关有个“流量控制策略”的功能,它是针对API的,也就是说定好策略之后,选中对哪些API生效,这些API就会单独的受这个流量控制策略的控制。但是,需要注意的是,如果你要调大流量控制策略,也必须先调大API所在分组的QPS才会生效,否则流量控制策略可以创建但不会实际生效。
虽然我们可以在分组的环境管理中添加不同的环境变量来实现同一个API分组下可以定义不同服务域名的API,这样我们客户端在发起请求的时候,域名只需要配一个就可以了,非常方便。但是,一旦网关这一层瘫痪(尽管是小概率事件,但不排除),这个时候我们就心有余而力不足了,只能等网关尽快恢复了。如果我们一个分组对应一个我们真正的服务域名的话,一旦网关出问题,我们可以快速把该分组绑定的域名指向我们真正的该分组的服务上。
服务编排/数据聚合 指的是可以通过一个请求来依次调用多个微服务,并对每个服务的返回结果做数据处理,最终整合成一个大的结果返回给前端。
例如一个服务是“查询用户预定的酒店”,前端仅需要传一个订单ID,后端会返回整个订单的信息,包括用户信息、酒店信息和房间信息等。
这个服务背后可能对应着以下几个操作:
微服务架构上对功能做了解耦,使用服务编排可以快速从各类服务上获取需要的数据,对业务实现快速响应。总的来说,编排有以下几点优势:
Goku API Gateway (中文名:悟空 API 网关)是一个基于 Golang 开发的微服务网关,能够实现高性能 HTTP API 转发、服务编排、多租户管理、API 访问权限控制等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行 API 服务治理、提高 API 服务的稳定性和安全性。
Goku API Gateway支持一个编排API对应多个后端服务,每个后端服务的请求参数可以使用前端传入的参数,也可以在编排里自定义(写静态参数或从返回数据里获得)。每个后端服务的返回数据支持过滤、删除、移动、重命名、拆包和封包等操作;编排API能够设定编排失败时的异常返回。
Goku API Gateway 的社区版本(CE)同时拥有完善的使用指南和二次开发指南,内置的插件系统也能够让企业针对自身业务进行定制开发。
项目地址: https://github.com/eolinker/goku-api-gateway
官网地址: https://www.eolinker.com
我们将编排的整个操作放到网关进行,由网关对数据做处理与转换,这样无需对后端服务做改动。一个请求到达网关,网关调用多个后端服务,并且在网关上对各个服务的返回数据做处理(操作有过滤、移动、重命名、封包、拆包,后面会对各操作做详细解释),最后由网关将数据整合好返回给前端。
网关将编排过程中对 API的转发处理过程 (转发-获取返回数据-数据处理)称为一个 Step 。
添加一个转发服务,该服务为 查询订单详情API,配置相应的转发地址、传入的参数、对返回数据做何种处理等。
由于篇幅原因,后续的Step(查询用户详情、查询酒店详情、查询房间详情)就不一一展示了。
网关将编排过程中对 API的转发处理过程 (转发-获取返回数据-数据处理)称为一个 Step。
我们将处理查询订单详情API称为 Step1 ,其中Step1的返回数据有:用户ID、酒店ID、房间ID。同理,将查询用户信息这步称为 Step2 ,将查询酒店信息称为 Step3 ,将查询房间信息称为 Step4 。
传参规则:
以下为转发路径的传参写法:
Step2中需要接收Step1里返回的userID作为参数,同时需要接收前端传入的Authorization参数
在网关里Step2的请求参数配置如下所示,请求参数存在多个的话用换行表示:
1.查询订单详情的API,返回数据称为json1,内容如下:
2.查询用户详情的API,返回数据称为json2,内容如下:
3.查询酒店详情的返回数据,称为json3,内容如下:
4.查询房间详情的返回数据,称为json4,内容如下:
5.可以在每一个Step里对返回Json做处理,网关会将处理过的数据最后整合起来,再返回前端,例如这是通过网关返回的最终数据:
这里以查询酒店详情API的返回数据json3为例,讲解网关如何在编排过程中对返回数据做处理。
查询酒店详情API返回的原始数据如下:
从网关返回给前端的数据中截取酒店信息的数据如下:
从原始数据到处理后的数据需要经过以下操作:
字段黑名单的作用是排除某些字段,支持数组形式。
在网关的Step3里配置如下:
经过网关处理后,实际的返回数据如下,可以看到data对象里的id字段已经被过滤掉:
拆包是指将指定对象的内容提取出来作为该步骤(step)的返回结果。其中匹配目标只能为object,匹配目标为空时,结果为 {},可用于清除数据。
在网关的Step里配置如下:
经过网关处理后,实际的返回数据如下,可以看到data对象被拆开,最终数据仅保留了data对象里面的字段:
字段封包会将当前的数据整体打包为最终返回数据中的一个对象,不支持*,不支持数组。
在网关的Step里配置如下:
经过网关处理后,实际的返回数据如下,数据被整体打包为hotelinfo对象:
经过三个步骤,就可以将原始数据变成最终的数据。
本文仅列举了编排过程中部分数据处理的操作,如需了解更多编排细则,可通过文末给出的教程链接。
相关链接
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~