开放API网关实践(一)——设计一个开放API网关

开放API⽹关实践(⼀)——设计⼀个开放API⽹关
前⾔
随着业务的发展, 所对接的第三⽅越来越多, 各个业务系统⾯临着同样⼀个问题: 如何让第三⽅安全快速接⼊. 此时有⼀个集验签、鉴权、限流、降级等功能于⼀⾝的API⽹关服务变得尤为重要.
接下来将分享如何设计实现⼀个轻量级的API开放⽹关, 包括接⼝设计、数据库设计、签名验签⽅案、鉴权等. 本⽂侧重于总体设计, 具体实现细节将陆续在后续的⽂章中分享.
API⽹关简介
API⽹关在微服务中尤为重要, 其抽象了鉴权、限流、降级等各个业务系统通⽤的功能. 作为众多内部业务系统外的⼀层屏障.
基本需求
1. 签名及验签
2. 鉴权
3. 路由
4. 权限及资源管理
总体设计
验签、鉴权等功能以职责链的⽅式进⾏处理, ⽹关根据配置进⾏路由并附加参数⽤以配合业务系统进⾏处理(如数据过滤等). 简要请求处理流程如下:
接⼝设计
⽹关最基本的功能是转发请求, 常见的⽅式是根据配置中的路由规则将请求转发给内部服务, 如:
将/order/*的请求转发给内部的订单系统、/user/*的请求转发给内部的⽤户系统, 这种做法常⽤于对整个业务系统负责的基础⽹关.⽽本⽂所设计的是服务于第三⽅的开放API⽹关, 并未使⽤上述做法, ⽽是将请求的资源作为参数放到请求体中, 其原因如下:
lora通信
1. 开放API服务于第三⽅, 屏蔽内部路径, 有利于提供命名统⼀且规范的接⼝.
2. 请求接⼝的映射由⽹关的路由表维护, 内部接⼝升级甚⾄切换到新服务对外接⼝不变.
3. 能够更细粒度地针对接⼝进⾏权限控制、限流、统计等.
地址
开放API⽹关对外提供唯⼀⼊⼝, 具体请求的资源作为参数传⼊.
公共参数
为了简化签名和验签的操作, 同时也提⾼灵活度, 唯⼀⼊⼝的约定了固定的公共参数和返回值, 如下:
公共请求参数
参数名称是否必须类型⽰例备注
app_id是string应⽤ID
led光源模组
method是string 请求⽅法
charset是string UTF-8编码
format是string JSON业务参数格式
sign_type是string RSA2签名类型
usb暖手鼠标垫sign是string签名
timestamp是number1564929661796时间戳, 单位: 毫秒
nonce是string63DCB93D270E44D49499F9E5D55705FE随机字串(建议使⽤UUID) version是string  1.0接⼝版本
biz_content是string{“start_time”:“1564929661796”, …}请求业务参数
app_id: 应⽤ID, 应⽤ID是授权的主体, 是调⽤⽅的⾝份标识
method: 请求⽅法, 与内部URL对应, 由⽹关的路由表维护.
timestamp和nonce⽤来防重放攻击.
biz_content: 业务参数, 这个参数将转发给内部业务系统.
公共返回参数
参数名称是否必须类型⽰例备注
code是number0错误码message否string错误信息charset是string UTF-8编码
format是string JSON返回参数格式sign_type是string RSA2签名类型sign是string签名timestamp是number时间戳, 单位: 毫秒biz_content是string{“id”:“1564929661796”, …}返回业务参数
biz_content: 返回业务参数, ⽹关转发业务系统的返回值.
[版权声明]
本⽂发布于, 允许⾮商业⽤途转载, 但转载必须保留原作者 及链接:. 如有授权⽅⾯的协商或合作, 请联系邮箱: .
签名⽅案
调⽤⽅和服务⽅均⽣成2048位RSA秘钥, 交换公钥. 私钥⽤于签名, 公钥⽤于验签, 开放API⽹关对外接⼝使⽤https, 故暂不需额外做加密处理.
签名算法
签名算法名称标准签名算法名称备注
RSA2SHA256WithRSA强制要求 RSA 密钥的长度⾄少为 2048
签名规则
签名参数内容
剔除sign之后的全部参数.
签名参数排序
按照参数名的ASCII码递增排序(字母升序排序).
签名⽣成⽅式
出线间隔
排序后的参数列表组合成参数名a=参数值a&参数名b=参数值b&...&参数名z=参数值z的字符串, 并使⽤私钥⽣成sign.
数据库设计
数据库⽤于存储秘钥权限等配置, 程序和数据库之间有多级缓存⽤以提⾼访问速度. 简要ER图如下:
长效复合肥
app: 调⽤⽅主体, ⽤于标识请求⽅⾝份.
group: 组, app分组, 可通过group统⼀进⾏授权.
auritasubject: 主体(app/group).
resource: 资源, 维护请求资源与内部接⼝的映射关系, url+http_method 对应唯⼀的resource_id.
技术选型
⽹关除了满⾜功能上的需求外, 性能上的需求也需要着重考虑, 毕竟作为各个业务系统对外的唯⼀⼊⼝, ⽹关的性能可能会成为整个业务系统的瓶颈. 业务并不复杂, 性能要求⾼, 响应式编程正是⼀个不错的选择.
Spring WebFlux + netty: 响应式Web框架.
Spring Data Reactive Redis + Lettuce: 响应式redis客户端.
Guava: Google⼯具包, 使⽤LoadingCache作为进程内缓存.
结语
⽹关作为内部系统外⾯的⼀层屏障和⼊⼝, 除基本功能和性能上的需求外, 监控、统计、⽇志等都是需要考虑到的问题, ⽹关⽅⾯开源产品众多, 但选择时⼀定要考虑⾃⾝业务, 适合⾃⾝的前提下参考各个成熟的⽅案进⾏实践.
[版权声明]
本⽂发布于, 允许⾮商业⽤途转载, 但转载必须保留原作者 及链接:. 如有授权⽅⾯的协商或合作, 请联系邮箱: .

本文发布于:2024-09-22 11:38:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/106445.html

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

标签:参数   业务   签名   请求   系统
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议