您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

如何设计实现一个轻量的开放API网关

时间:2019-09-03 13:51:48  来源:  作者:
来源:公众号代码如诗 , 
作者 朴瑞卿
如何设计实现一个轻量的开放API网关.文章地址: https://blog.piaoruiqing.com/blog/2019/08/05/开放api网关实践/

前言

随着业务的发展, 所对接的第三方越来越多, 各个业务系统面临着同样一个问题: 如何让第三方安全快速接入. 此时有一个集验签、鉴权、限流、降级等功能于一身的API网关服务变得尤为重要.

接下来将分享如何设计实现一个轻量级的API开放网关, 包括接口设计、数据库设计、签名验签方案、鉴权等. 本文侧重于总体设计, 具体实现细节将陆续在后续的文章中分享.

 

API网关简介

API网关在微服务中尤为重要, 其抽象了鉴权、限流、降级等各个业务系统通用的功能. 作为众多内部业务系统外的一层屏障.

 

基本需求

  1. 签名及验签
  2. 鉴权
  3. 路由
  4. 权限及资源管理

 

总体设计

验签、鉴权等功能以职责链的方式进行处理, 网关根据配置进行路由并附加参数用以配合业务系统进行处理(如数据过滤等). 简要请求处理流程如下:

 

如何设计实现一个轻量的开放API网关

 

 

 

接口设计

网关最基本的功能是转发请求, 常见的方式是根据配置中的路由规则将请求转发给内部服务, 如:

将/order/*的请求转发给内部的订单系统、/user/*的请求转发给内部的用户系统, 这种做法常用于对整个业务系统负责的基础网关.

而本文所设计的是服务于第三方的开放API网关, 并未使用上述做法, 而是将请求的资源作为参数放到请求体中, 其原因如下:

  1. 开放API服务于第三方, 屏蔽内部路径, 有利于提供命名统一且规范的接口.
  2. 请求接口的映射由网关的路由表维护, 内部接口升级甚至切换到新服务对外接口不变.
  3. 能够更细粒度地针对接口进行权限控制、限流、统计等.

地址

开放API网关对外提供唯一入口, 具体请求的资源作为参数传入.

公共参数

为了简化签名和验签的操作, 同时也提高灵活度, 唯一入口的约定了固定的公共参数和返回值, 如下:

公共请求参数

如何设计实现一个轻量的开放API网关

 

  • App_id: 应用ID, 应用ID是授权的主体, 是调用方的身份标识
  • method: 请求方法, 与内部URL对应, 由网关的路由表维护.
  • timestamp和nonce用来防重放攻击.
  • biz_content: 业务参数, 这个参数将转发给内部业务系统.

公共返回参数

如何设计实现一个轻量的开放API网关

 

  • biz_content: 返回业务参数, 网关转发业务系统的返回值.

[版权声明]

本文发布于朴瑞卿的博客, 允许非商业用途转载, 但转载必须保留原作者朴瑞卿 及链接:http://blog.piaoruiqing.com. 如有授权方面的协商或合作, 请联系邮箱: piaoruiqing@gmail.com.

签名方案

调用方和服务方均生成2048位RSA秘钥, 交换公钥. 私钥用于签名, 公钥用于验签, 开放API网关对外接口使用https, 故暂不需额外做加密处理.

签名算法

如何设计实现一个轻量的开放API网关

 

签名规则

签名参数内容

剔除sign之后的全部参数.

签名参数排序

按照参数名的ASCII码递增排序(字母升序排序).

签名生成方式

排序后的参数列表组合成参数名a=参数值a&参数名b=参数值b&...&参数名z=参数值z的字符串, 并使用私钥生成sign.

数据库设计

数据库用于存储秘钥权限等配置, 程序和数据库之间有多级缓存用以提高访问速度. 简要ER图如下:

 

如何设计实现一个轻量的开放API网关

 

 

  • app: 调用方主体, 用于标识请求方身份.
  • group: 组, app分组, 可通过group统一进行授权.
  • subject: 主体(app/group).
  • resource: 资源, 维护请求资源与内部接口的映射关系, url+http_method 对应唯一的resource_id.

技术选型

网关除了满足功能上的需求外, 性能上的需求也需要着重考虑, 毕竟作为各个业务系统对外的唯一入口, 网关的性能可能会成为整个业务系统的瓶颈. 业务并不复杂, 性能要求高, 响应式编程正是一个不错的选择.

  • Spring WebFlux + netty: 响应式Web框架.
  • Spring Data Reactive redis + Lettuce: 响应式redis客户端.
  • Guava: google工具包, 使用LoadingCache作为进程内缓存.

结语

网关作为内部系统外面的一层屏障和入口, 除基本功能和性能上的需求外, 监控、统计、日志等都是需要考虑到的问题, 网关方面开源产品众多, 但选择时一定要考虑自身业务, 适合自身的前提下参考各个成熟的方案进行实践.



Tags:API网关   点击:()  评论:()
声明:本站部分内容来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
使用微服务模式构建应用程序并将这些服务部署到Kubernetes上已成为当今运行云原生应用程序的实际方法。 在微服务架构中,单个应用程序被分解为多个微服务。 每个微服务均由...【详细内容】
2020-06-22   API网关  点击:(1)  评论:(0)  加入收藏
相关名词剖析随着互联网的快速发展,企业的IT建设也是飞速发展的,但是在建设企业信息化时没有统筹考虑,建设往往不成体系、重复开发、烟囱式的建设,造成了资源的冗余和浪费,为了针...【详细内容】
2020-06-13   API网关  点击:(67)  评论:(0)  加入收藏
前言假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务,比如会员、商品、推荐服务等等。 那么这里就会遇到一个问题,APP/Browser怎么去访问这些后端的服务? 如果...【详细内容】
2020-04-11   API网关  点击:(0)  评论:(0)  加入收藏
1背景京东作为电商平台,近几年用户、业务持续增长,访问量持续上升,随着这些业务的发展,API网关应运而生。API网关,就是为了解放客户端与服务端而存在的。对于客户端,使开放给客户...【详细内容】
2020-03-16   API网关  点击:(12)  评论:(0)  加入收藏
一、API网关的用处API网关我的分析中会用到以下三种场景。Open API企业需要将自身数据、能力等作为开发平台向外开放,通常会以rest的方式向外提供,最好的例子就是淘宝开放平台...【详细内容】
2020-02-16   API网关  点击:(27)  评论:(0)  加入收藏
一、API网关的用处API网关我的分析中会用到以下三种场景。Open API企业需要将自身数据、能力等作为开发平台向外开放,通常会以rest的方式向外提供,最好的例子就是淘宝开放平台...【详细内容】
2019-12-11   API网关  点击:(24)  评论:(0)  加入收藏
案例背景介绍:在实践微服务架构时,我们经常会面对以下需求:如何隔离外部和内部,如何保障后台服务安全性,如何降低运维成本,如何减少变更的流程和错误成本,如何减少客户端与服务的耦...【详细内容】
2019-09-17   API网关  点击:(52)  评论:(0)  加入收藏
随着业务的发展, 所对接的第三方越来越多, 各个业务系统面临着同样一个问题: 如何让第三方安全快速接入. 此时有一个集验签、鉴权、限流、降级等功能于一身的API网关服务变得尤为重要...【详细内容】
2019-09-03   API网关  点击:(54)  评论:(0)  加入收藏
在实践微服务架构时,我们经常会面对以下需求:如何隔离外部和内部,如何保障后台服务安全性,如何降低运维成本,如何减少变更的流程和错误成本,如何减少客户端与服务的耦合等,API网关是一个非常重要的集中管控点。...【详细内容】
2019-08-16   API网关  点击:(93)  评论:(0)  加入收藏
Chris Richardson曾经在他的博客上详细介绍过API网关,包括API网关的背景、解决方案以及案例。对于大多数基于微服务的应用程序而言,API网关都应该是系统的入口,它会负责服务请...【详细内容】
2019-06-05   API网关  点击:(177)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条