前言随着业务的发展,接入的第三方越来越多,各个业务系统都面临着同一个问题:如何让第三方安全、快速的接入。这时候,一个集签名校验、鉴权、限流、降级等功能于一身的A??PI网关服务就显得尤为重要。接下来我将分享如何设计和实现一个轻量级的API开放网关,包括接口设计、数据库设计、签名验证方案、鉴权等。本文着重于整体设计,具体实现细节将在后续文章中分享。API网关简介API网关在微服务中尤为重要,它抽象了各种业务系统的通用功能,如鉴权、限流、降级等。作为许多内部业务系统之外的网关一层壁垒。签名和签名验证与认证的基本要求。路由权限和资源管理总体设计。如数据过滤等)。简单的请求处理流程如下:接口设计网关最基本的功能就是转发请求。常见的方式是根据配置中的路由规则将请求转发到内部服务,如:转发/order/*的请求对于内部订单系统,/user/*的请求转发到内部用户系统.这种方式常用于负责整个业务系统的基础网关。本文旨在为第三方开放API网关服务,并没有采用上述方式,而是将请求的资源作为参数放在请求体中。原因如下:开放API服务于第三方,屏蔽内部路径,有利于提供统一规范的接口。请求接口的映射由网关的路由表维护,内部接口升级甚至切换到新的服务,外部接口保持不变。可以更细粒度的对接口进行权限控制、限流、统计等。地址开放API网关对外提供唯一的入口,具体请求的资源作为参数Input传递。公共参数为了简化签名和验证的操作,同时也提高灵活性,唯一入口约定了固定的公共参数和返回值,如下:公共请求参数app_id:应用ID,应用ID为授权对象,是调用方法的标识:请求方法,对应内部URL,由网关的路由表维护。timestamp和nonce用于防止重放攻击。biz_content:业务参数,将转发给内部业务系统。公共返回参数biz_content:返回业务参数,网关转发业务系统的返回值。【版权声明】本文发表于朴瑞卿博客,非商业性转载,但转载须保留原作者朴瑞卿以及链接:http://blog.piaoruiqing.com。如有授权洽谈或合作,请联系邮箱:piaoruiqing@gmail.com。签名方案的调用方和服务端都生成一个2048位的RSA密钥并交换公钥。私钥用于签名,公钥用于签名验证,开放API网关的对外接口使用https,所以暂时不需要额外的加密处理。签名算法签名规则签名参数内容排除签名后的所有参数。签名参数按照参数名称的ASCII码升序排序(字母排序)。将签名生成方法排序后的参数列表组合成参数名a=参数值a&参数名b=参数值b&...&参数名z=参数值z的字符串,用私钥生成sign。数据库设计数据库用于存储秘钥权限等配置,程序与数据库之间存在多级缓存,提高访问速度。ER简图如下:app:callerbody,用于标识请求方身份。group:group,app分组,可以通过group进行授权。主题:主题(应用程序/组)。resource:资源,维护请求资源和内部接口的映射关系,url+http_method对应一个唯一的resource_id。技术选择除了满足功能需求外,还需要认真考虑类型网关的性能需求。毕竟作为各个业务系统唯一的对外入口,网关的性能可能会成为整个业务系统的瓶颈。业务不复杂,性能要求高。响应式编程是一个不错的选择。SpringWebFlux+netty:响应式网络框架。SpringDataReactiveRedis+Lettuce:响应式Redis客户端。Guava:Google工具包,使用LoadingCache作为进程内缓存。结语网关作为系统内部的一层屏障和入口,除了基本的功能和性能要求外,监控、统计、日志等都是需要考虑的问题。网关的开源产品很多,但是在选择的时候一定要考虑自己的业务,适合自己。在参考各个成熟方案的前提下进行实践。
