一种跨机房场景下的API网关路由实现方法与流程

文档序号:28600698发布日期:2022-01-22 11:13阅读:312来源:国知局
一种跨机房场景下的API网关路由实现方法与流程
一种跨机房场景下的api网关路由实现方法
技术领域
1.本发明隶属于互联网网关技术领域,具体涉及为一种跨机房场景下的api网关路由实现方法。


背景技术:

2.api是application programming interface缩写,翻译成中文就是应用程序接口。在实际微服务中可以理解为一个个功能方法。就比如一个用户服务的微服务,可以对外提供api接口为查找用户,创建用户等。如今,随着微服务架构的流行,api网关也越来越受欢迎。由于微服务是使用数据隔离的跨进程服务来组成单一系统,内部有多个服务,因此就必须要有一个api网关承担外部接口到子服务接口的路由。微服务的api网关就是把各个微服务对外提供的api接口汇聚起来,让外界看起来是一个统一的接口。尽管微服务提供了诸多好处,最显著是易于开发,部署和维护方便,但也给用户快速访问带来问题,尤以微服务跨机房调用最明显。由于存在跨地域的服务调用,受限于网络传输速度、服务器与服务器之间tcp连接建立、数据传输的网络开销,跨机房访问耗时将会明显增加。在服务数量众多、复杂度比较高、规模比较大的业务系统中,引入api网关尤为必要。api网关可以充当使用这些微服务的客户端的中央接口,这不仅因为api网关能通过路由分发客户的请求,还可以在api管理方面提供很多好处,并提供解决共性问题的能力,如:认证鉴权、流控熔断、日志、监控等功能。通过api网关的使用,客户端不必分多次请求访问数十个单独的服务,而只需向api网关发送单个服务访问请求,由api网关本身聚集微服务。
3.然而,api网关作为一个业务系统的后端总入口,承载着所有服务的组合路由转换等工作,那么在高并发的情况下,将会出现性能瓶颈,将会对io及内存等性能问题,如何保证在跨机房场景实施网关路由及管理是急需解决的问题。
4.在存在多个业务线的跨机房场景中,多数采用网关路由系统的单独部署,比如产品线a与产品线b有各自业务方向上的用户,此时需提供open api接口供用户调用,而两者的网关域名希望保留各自的一级域名不要与其它产品线的同名,这时网关部署是为产品线a与产品线b各自部署一套网关系统,各自维护,但需要投入大量的维护成本。此外,在相关技术中,当路由规则发生变化时,网关必须重启才能更新路由规则,但重启网关势必会影响线上业务。
5.专利“一种基于api网关的api高级流控及计量方法”(申请号:202110215723.3)通过增加kong的“流控”插件和“应用鉴权”插件,达到实时监控并准确计量api的调用信息,然而流控及计量的执行需依赖开源框架kong架构实现。专利“一种api分布式限流的实现方法”(申请号:201910498355.0)采用时长和限流次数灵活可配的限流规则,实现用户级和接口级限流的可变性及多样性需求,然而接口级及用户级访问限流规则配置在数据库中,在多并发访问api时需频繁访问数据库获取限流规则。
6.因此,需要一种综合性能更佳的跨机房场景下的api网关路由实现方法。


技术实现要素:

7.为解决现有技术问题,本发明提出一种跨机房场景下的api网关路由实现方法,通过构建网关控制台系统管理多个产品应用的路由规则,并利用消息中间件集群实现路由信息的跨机房推送,保证各机房的网关路由系统能根据路由信息的更新,实时地执行路由规则动态加载,进一步地支持多个网关域名的同时访问,避免了在单独的网关部署中的人力研制成本及维护成本大量投入。同时通过建立路由规则与过滤规则的匹配关系,实现针对不同路由规则,灵活地执行过滤处理,也可根据业务需求调整参数,扩展性强。
8.本发明的技术方案是提供一种跨机房场景下的api网关路由实现方法,包括以下步骤:
9.步骤1:路由信息的跨机房推送及在数据库中的同步;各机房内的网关路由系统获取跨机房推送的路由信息后,网关路由系统内的路由规则按照新的路由信息进行动态更新;所述路由信息包含网关域名信息、api路由信息、流控管理信息;所述网关域名信息包含网关域名及域名名称;所述api路由信息包含路由规则、对应路由规则的过滤规则和路由id标识;所述路由规则包含网关域名、api路径、应用域名及接口路径;所述过滤规则包含超时时间、认证类型、流控开关;所述过滤规则的配置都包括在客户端发出api请求时触发过滤器用以执行对api请求的过滤处理;所述流控管理信息对应路由规则,包含网关域名、api路径、应用域名、接口路径、流控粒度、流控统计间隔及最大处理请求数;
10.步骤2:待步骤1中所述路由规则动态更新完成后,由任一机房的网关路由系统获取客户端发出的api请求,所述api请求包含http请求域名及请求参数,在api路由信息中获取与http请求域名对应的路由规则;执行身份校验,所述身份校验包含用户身份验签、api授权校验及白名单校验;所述请求参数包含appkey、时间戳、加密算法、加密字符串、用户ip地址;所述appkey是用户身份标识符,用户创建时自动生成appkey;所述时间戳记录调用api的请求时间;所述加密字符串由私钥经加密算法加密后形成;所述加密算法为rsa算法;所述appkey、私钥均提前配置在用户身份信息中;
11.步骤3:网关路由系统从api路由信息中获取对应路由规则的过滤规则;在所述过滤规则中,若认证开关的值及流控开关的值均为开启,网关路由系统依次启动预设的过滤处理,所述过滤处理包括api调用验证的过滤处理、超时熔断的过滤处理、及流控的过滤处理;通过过滤处理的api请求根据路由规则中的api路径转至对应的服务端;
12.步骤4:对api请求的实时监控;包括利用javaagent技术部署skywalking javaaagent,网关路由系统启动时,在vm options中增加jvm启动参数
[0013]-javaagent:/${aentpath}/skywalking-agent.jar,以每一次调用api的请求为单位,采集api请求过程的数据传输到skywalking后端服务器,所述api请求过程的数据包含网关域名、api路径、api请求开始时间及api请求结束时间,根据所述api请求过程的数据统计定制化数据,所述定制化数据包括api调用次数和api耗时,将定制化数据存入mysql数据库用以完成前端界面的可视化展示;所述前端界面的可视化展示基于skywalking-ui的web可视化平台实现。
[0014]
所述步骤1中,所述路由信息的跨机房推送还包括:通过部署在各机房内的消息中间件集群来传递;通过主从数据库集群复制路由信息的数据以完成数据库内的路由信息同步;所述数据库为mysql数据库;
[0015]
所述网关路由系统获取跨机房推送的路由信息还包括:将机房分类为本地机房和远程机房;所述本地机房内配置网关控制台系统,所述网关控制台系统实时获取路由信息、用户身份信息及应用信息后,将其以topic消息形式传送至本地机房的消息中间件集群和mysql数据库;;本地机房内的网关路由系统监听消息中间件集群中的路由消息、用户身份信息及应用信息,并从消息中间件中获取新的路由信息、用户身份信息及应用信息,执行路由信息的动态更新及路由规则的动态加载;所述应用信息包含微服务应用域名、应用名称;所述用户身份信息包含appkey、公钥、私钥、接入方的白名单ip、白名单校验开关;所述appkey在用户新增后由系统自动生成,所述公钥和私钥通过rsa算法自动分配给用户;
[0016]
任一个机房的网关路由系统关闭后再重启时,从其所在机房内的mysql数据库中获取路由信息、用户身份信息、应用信息;
[0017]
所述流控粒度是指api访问请求数的统计粒度;所述流控统计间隔是指统计api访问请求数的时间间隔。
[0018]
所述步骤2具体为:
[0019]
步骤2-1:获取与http请求域名对应的路由规则:提取http请求域名中的应用域名和接口路径,在api路由信息中检索是否存在与应用域名和接口路径匹配的路由规则;若不存在,则拒绝api请求;若存在,则继续步骤2-2;
[0020]
步骤2-2:用户身份验签:从请求参数中获取appkey的值,与用户身份信息中预配的appkey进行比对,若比对一致,则获取与appkey对应的api授权列表及白名单校验开关;若比对不一致,则拒绝请求;所述api授权列表记录着授权给用户请求api时使用的路由规则,包含appkey及路由规则;
[0021]
步骤2-3:api授权校验:遍历步骤2-2的api授权列表中是否存在步骤2-1中的路由规则,若存在,作为api授权校验通过;否则拒绝请求;
[0022]
步骤2-4:白名单校验:获取步骤2-2的白名单校验开关的值为开启,从用户身份信息中获取appkey对应的白名单ip,以请求参数中的用户ip与所述白名单ip比对,若比对一致,则白名单校验通过;否则拒绝请求;若获取步骤2-2的白名单校验开关的值为关闭,则不执行步骤2-3的白名单校验。
[0023]
在所述步骤2中还包括:各机房的网关路由系统从路由信息提取应用域名,以断言的形式编制为域名断言;获取接口路径,以断言的形式编制为接口断言;所述网关域名断言和所述api接口断言组成路由断言集合;若断言集合内的域名断言和接口断言的校验结果为真,获取应用域名与接口路径对应的路由规则信息。
[0024]
所述步骤3中的依次启动预设的过滤处理具体为:
[0025]
步骤3-1:api调用验证的过滤处理,具体为:从预设的用户身份信息中获取与appkey匹配的公钥;利用rsa算法,以公钥验证请求参数中的加密字符串,若验证结果为是,则验证通过;若验证结果为否,则验证不通过;所述公钥预配在用户身份信息中;
[0026]
步骤3-2:超时熔断的过滤处理,具体为:从时间戳中获取用户发出调用api的请求时间;在等待api请求反馈的过程中,实时计算等待请求反馈的时间;所述等待请求反馈的时间取当前时间与请求时间的时间差;若等待请求反馈的时间大于等于超时时间值,则api请求被拒,后台同步统计请求被拒次数;若在一定时间内,被拒次数达到预设阈值,熔断开启,拒绝所有api请求直至熔断关闭;
[0027]
步骤3-3:流控的过滤处理,具体为:获取路由规则对应的流控管理信息,其中;所述流控粒度包含ip和api两个值,若流控粒度的值为ip,以用户为单位记录处理请求数,在流控统计间隔内一个用户访问指定api的请求数超过所述最大请求处理数,拒绝当前用户访问指定api的请求;若流控粒度的值为api,以接口为单位记录处理请求数,在流控统计间隔内访问指定api的请求数超过于所述最大请求处理数,拒绝当前访问指定api的所有请求;
[0028]
在所述步骤3的过滤处理中,根据预设的黑名单ip列表,检查用户ip是否存在所述黑名单ip列表中,若存在,则拒绝api请求。
[0029]
所述步骤3-3中,流控的过滤处理利用令牌桶算法实现,1个api请求获得1个令牌后,api请求通过流控;在利用令牌桶算法实现流控时,获取流控管理信息中的最大处理请求数、流控统计间隔、流控粒度;以所述最大处理请求数作为令牌桶容量;以最大处理请求数与流控统计间隔相除获得的值,作为令牌桶的令牌产生速率;
[0030]
利用redis数据库存储当前令牌桶的令牌数,初始值为令牌桶容量;在所述redis数据库中,所述key值是根据路由id、时间精度及流控粒度生成的流控标识符;所述value值是当前令牌桶的令牌数;其中,所述时间精度的值的单位包含秒、分钟、小时及天,取流控统计间隔的时间单位为所述时间精度的值;
[0031]
在每次流控结束后和流控开始执行时,更新redis数据库中的value值,所述每次流控结束后,redis中的value值更新为令牌分发后的令牌数;待下一次流控开始执行时,redis中的value值更新为待分发的令牌数,所述待分发的令牌数=min(令牌桶容量,剩余令牌数+令牌产生速率*(当前时间-上一次分发令牌的时间));所述剩余令牌数为未更新的value值,所述未更新的value值是从redis数据库中获取匹配key值的value值;
[0032]
根据流控粒度执行令牌的分发,具体为:若流控粒度的值为ip,以用户为单位分发令牌,具体为:以路由规则id、时间精度、用户ip拼接形成的字符串为一个用户访问api的唯一流控标识符,在在redis数据库中寻找与流控标识符一致的key值,并获取key值对应的value值,若value值大于1,为当前所述用户的api请求分发令牌,则流控通过,value值减1后更新;若value值等于0,则流控不通过;若没有与流控标识符一致的key值,新增redis数据记录,以所述流控标识符为key值,令牌桶容量为value值,为当前所述用户的api请求分发令牌,流控通过;
[0033]
若流控粒度的值为api,以接口为单位分发令牌,具体为:以路由规则id、时间精度拼接形成的字符串为任一用户访问api的唯一流控标识符,在redis数据库中检索与流控标识符一致的key值,并获取key值对应的value值,若value值大于当前api请求的总数,则为当前任一用户的api请求分发令牌,当前所有的api请求流控通过,取value值与当前api请求的总数的差值用以更新;若value值小于当前调用api的请求数,流控不通过;若没有与流控标识符一致的key值,新增redis数据记录,以所述流控标识符为key值,令牌桶容量为value值,为当前任一用户的api请求分发令牌,流控通过。
[0034]
所述步骤3-3中,令牌桶算法以lua脚本执行;在lua脚本中,arg参数包含令牌桶容量、令牌产生速率、流控统计间隔;所述arg参数中的流控统计间隔的换算单位为秒;key参数包含上次流控结束的时间、剩余令牌数;所述剩余令牌数是根据key值从redis数据库中获取的value值。
[0035]
本发明所达到的有益效果:
[0036]
(1)本发明通过网关路由系统内路由信息的跨机房实时推送,实现对路由信息变化的实时捕获,有利于及时根据最新的路由信息执行路由规则动态加载。
[0037]
(2)本发明通过构建网关控制台系统,集成了对api路由信息、应用信息、网关域名信息及用户身份信息的多样化路由管理相关信息的管理,网关管理人员仅需通过网关控制台系统,便能同时管理多个产品应用的路由规则,并支持多个域名同时访问,避免了在单独的网关部署中的人力研制成本及维护成本大量投入。
[0038]
(3)本发明通过在各机房内配置消息中间件集群,通过消息中间件集群将的路由信息下发到各机房的网关路由系统,对跨机房集群场景下的动态路由进行了支持。
[0039]
(4)本发明通过建立路由规则与过滤规则的匹配关系,实现以流控粒度实施精细化流控,并辅以根据业务需求的参数调整,扩展性强。
附图说明
[0040]
图1为本发明实施例中跨机房环境中网关路由实现方法的流程示意图;
[0041]
图2为本发明实施例中跨机房环境中的api网关路由的网络拓扑示意图;
[0042]
图3为本发明实施例中利用令牌桶算法实现api请求流控的流程示意图;
[0043]
图4为本发明实施例中跨机房场景下的api网关路由系统结构示意图;
[0044]
图5为本发明实施例中跨机房环境中网关路由统一部署示意图。
具体实施方式
[0045]
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。
[0046]
图1为本发明实施例中跨机房环境中网关路由实现方法流程图,图2为本发明实施例中跨机房环境中的api网关路由的网络拓扑图,参阅图1和图2,本发明实施例中跨机房环境中网关路由方法的具体流程包括:
[0047]
步骤s1:网关路由系统内的路由信息跨机房推送及数据库内的路由信息同步,所述路由信息包含网关域名信息、api路由信息、流控管理信息;所述网关域名信息用于配置网关域名,包含网关域名及域名名称;所述api路由信息用于配置路由规则及过滤规则,并配有唯一的路由id标识,所述路由规则配有对应的过滤规则,其中,所述路由规则包含网关域名、api路径、应用域名及接口路径;所述过滤规则包含超时时间、认证类型、流控开关;任一个过滤规则的配置都将在调用api时启动后台过滤器,执行对api请求的过滤处理;所述流控管理信息包含网关域名、api路径、应用域名、接口路径、流控粒度、流控统计间隔及最大处理请求数;所述认证类型的值包含验签及无;所述流控粒度是指api访问请求数的统计粒度;所述流控统计间隔是指统计api访问请求数的时间间隔;
[0048]
通过网关路由系统内路由信息的跨机房实时推送,实现对路由信息变化的实时捕获,有利于及时根据最新的路由信息执行路由规则动态加载,减少了路由信息变化对业务服务正常提供的影响。
[0049]
所述步骤s1具体包含:
[0050]
步骤s1-1:信息获取:将机房分为本地机房和海外机房;本地机房内配置网关控制
台系统,所述网关控制台系统实时获取路由信息、用户身份信息及应用信息后,以topic信息形式传送至本地机房的消息中间件集群a和mysql数据库;所述应用信息包含微服务应用域名、应用名称;所述用户身份信息包含appkey、公钥、私钥、接入方的白名单ip、白名单校验开关;所述appkey在用户新增由系统自动生成,所述公钥和私钥通过rsa算法自动分配给用户;
[0051]
步骤s1-2:信息传递及同步:将topic消息由本地机房内的消息中间件集群a传递至海外机房内的消息中间件集群b;通过mysol主从数据库集群复制topic信息中的数据,完成mysql数据库内的信息同步;通过在各机房内配置消息中间件集群,通过消息中间件集群将的路由信息下发到各机房的网关路由系统,对跨机房集群场景下的动态路由进行了支持。
[0052]
步骤s1-3:信息更新:本机机房及海外机房内的网关路由系统监听消息中间件集群中的topic信息,并从消息中间件中获取新的路由信息、用户身份信息及应用信息,执行信息的动态更新及路由动态加载;任一个机房内网关路由系统关闭后再重启时,从网关路由系统所在机房内的mysql数据库中获取路由信息、用户身份信息、应用信息;通过网关路由系统的路由信息同步,实时捕获到路由信息的变化,获取最新的路由信息,执行路由规则动态加载;
[0053]
s2:待接收到api请求时,执行权限验证:待步骤s1中路由规则按照新的路由信息动态加载更新后,由任一机房的网关路由系统获取api调用的http请求及携带的请求参数,在api路由信息中获取与http请求对应的路由规则;依次执行用户验签、api授权校验及白名单校验;所述请求参数包含appkey、时间戳、加密算法、加密字符串、用户ip地址;所述appkey是用户身份标识符,用户创建时自动生成appkey;所述时间戳记录调用api的请求时间;所述加密字符串是私钥经加密算法加密后形成的字符串;所述加密算法为rsa算法;所述appkey、私钥均提前配置在用户身份信息中;所述步骤s2具体为:
[0054]
步骤s2-1:提取http请求中的应用域名和路径,在api路由信息中寻找是否存在与应用域名和接口路径匹配的路由规则;若没有,拒绝请求;若有,代表路由规则存在,继续步骤步骤s2-2;
[0055]
步骤s2-2:执行基于appkey的用户身份验签,具体为:从请求参数中获取appkey值,与用户身份信息中预配的appkey比对,比对一致,获取与appkey对应的api授权列表及白名单校验开关;比对不一致,拒绝请求;所述api授权列表记录着授权给用户请求api时使用的路由规则,包含appkey及路由规则;
[0056]
步骤s2-3:执行基于appkey的api授权校验,遍历api授权列表中是否存在与步骤s2-1匹配的路由规则存在api授权校验通过;否则拒绝请求;
[0057]
步骤s2-4:;执行白名单校验,在确认白名单校验开关状态为开启后,从请求参数中获取用户ip,从用户身份信息中获取appkey对应的白名单ip进行比对,比对一致,白名单校验通过;比对不一致,拒绝请求;若白名单校验开关关闭,则不执行白名单校验;
[0058]
在所述步骤s2-1中采用断言机制执行路由匹配,具体为:各机房的网关路由系统从路由信息提取应用域名,以断言的形式编制为域名断言;获取接口路径,以断言的形式编制为接口断言;所述网关域名断言和所述api接口断言组成路由断言集合;若断言集合内的域名断言和接口断言的校验结果为真,获取应用域名与接口路径对应的路由规则信息;
[0059]
步骤s3:api请求的动态过滤,包含api调用验证、超时熔断及流控;网关路由系统获取步骤2中的路由规则,在所述过滤规则中,若认证开关的值及流控开关的值均为开启,网关路由系统依次启动api调用验证、超时熔断及流控的过滤处理;具体包含:
[0060]
步骤s3-1:api调用验证;从用户身份信息中获取与appkey匹配的公钥;利用rsa算法,以公钥验证请求参数中的加密字符串,若验证结果为是,验证通过;若验证结果为否,验证不通过;所述公钥预配在用户身份信息中;
[0061]
步骤s3-2:超时熔断;从时间戳中获取用户发出调用api的请求时间;在等待api请求反馈的过程中,实时计算等待请求反馈的时间;所述等待请求反馈的时间取当前时间与请求时间的时间差;若等待请求反馈的时间大于等于超时时间,api请求被拒,后台同步统计请求被拒次数;若在一定时间内,被拒次数达到预设阈值,熔断开启,拒绝所有api请求直至熔断关闭。
[0062]
步骤s3-3:流控;获取路由规则对应的流控管理信息,包含流控粒度、流控统计间隔、最大请求处理数,即qps阈值;所述流控粒度包含ip和api两个值,若流控粒度的值为ip,以用户为单位记录处理请求数,在流控统计间隔内一个用户访问指定api的请求数超过所述最大请求处理数,拒绝当前用户访问指定api的请求;若流控粒度的值为api,以接口为单位记录处理请求数,在流控统计间隔内访问指定api的请求数超过于所述最大请求处理数,拒绝当前访问指定api的所有请求;
[0063]
所述步骤s3-3流控过程利用令牌桶算法实现,并通过编写lua脚本实现1个api请求获得1个令牌后,api请求通过流控,如图3所示,具体流程有:
[0064]
步骤s3-3-1:基于令牌桶算法的流控参数定义及获取:在所述令牌桶算法中,以所述最大请求处理数作为令牌桶容量;所述令牌桶容量为令牌桶中令牌个数的最大值;以最大请求处理数与流控统计间隔相除获得的值,作为令牌桶的令牌产生速率;
[0065]
利用redis数据库存储当前令牌桶的令牌数,初始值为令牌桶容量;在所述redis数据库中,所述key值根据路由id、时间精度及流控粒度生成的流控标识符;所述value值是当前令牌桶的令牌数;其中,所述时间精度的值包含s、m、h、d,依次代表秒、分钟、小时及天,取流控统计间隔的时间单位为所述时间精度的值;
[0066]
在每次流控结束后和流控开始执行时,更新redis数据库中的value值,所述每次流控结束后,redis中的value值更新为令牌分发后的令牌数;待下一次流控开始执行时,redis中的value值更新为待分发的令牌数,所述待分发的令牌数=min(令牌桶容量,剩余令牌数+令牌产生速率*(当前时间-上一次分发令牌的时间));所述剩余令牌数为未更新的value值,所述未更新的value值是从redis数据库中获取匹配key值的value值;
[0067]
步骤s3-3-2:基于流控粒度的令牌分发;
[0068]
若流控粒度的值为ip,以路由规则id、时间精度、用户ip拼接形成的字符串为用户访问api的唯一流控标识符,以形成的流控标识符匹配redis数据库的key值,并获取key对应的value值,若value大于1,为用户本次调用api的请求分发令牌,流控通过;若value等于0,流控不通过;若没有找到匹配的key值,新增redis记录,以所述形成的流控标识符为key值,令牌桶容量为value,为用户本次调用api的请求分发令牌,流控通过;
[0069]
若流控粒度的值为api,以路由规则id、时间精度拼接形成的字符串为任一用户访问api的唯一流控标识符,以形成的流控标识符匹配redis数据库的key值,并获取key对应
的value值,若value值大于当前调用api的请求数,为每一个调用api的请求分发令牌,所有调用api的请求流控通过;若value值小于当前调用api的请求数,流控不通过;
[0070]
步骤s3-3-3:以lua脚本执行基于令牌桶算法的流控;在lua脚本执行过程中,包含参数key和参数argkey是多选,即lua脚本中可以操作多个key;arg是多选,供lua基本执行时提供参数;本发明的lua脚本中,arg参数包含令牌桶容量、令牌产生速率、流控统计间隔;所述arg参数中的流控统计间隔换算成为秒;key参数包含令牌数更新时间、剩余令牌数;所述令牌数更新时间为上次分发令牌的时间,所述剩余令牌数是根据key值从redis数据库中获取未更新的value值。具体为:
[0071]
首先,生成redis的key值和value值:所述value值初始化为令牌桶容量;所述key值为:key=${routeid}+${timeunit}+${keyid},其中keyid=用户ip,routeid=路由id,timeunit=时间精度值;若流控粒度为api,key=${routeid}+${timeunit};
[0072]
组装lua脚本中的key与arg参数:
[0073]
所述剩余令牌数为:tokens_key=${key}.tokens,其中所述${key}为redis数据库中的key值;若是第一次执行流控,tokens_key的值为令牌桶容量;
[0074]
所述令牌数更新时间为:timestamp_key=${key}.timestamp,其中所述${key}为redis数据库中的key值;
[0075]
所述令牌产生速率为:rate=令牌桶容量/流控统计间隔;
[0076]
所述令牌桶容量为:capacity=令牌桶容量;
[0077]
所述当前时间为:now=当前时间,所述当前时间精确至秒;
[0078]
其次,执行lua脚本,脚本逻辑如下:
[0079]
一次流控开始时,从redis数据库获取未更新的value值传入tokens_key,以tokens_key的值作为上次流控结束的令牌数last_tokens,若tokens_key的值不存在,即为第一次获取时,以令牌桶容量capacity作为tokens_key的值;
[0080]
获取timestamp_key的值为上次流控结束的时间,若timestamp_key的值不存在,即为第一次获取,以0作为timestamp_key的值;计算获取当前时间now和timestamp_key的差值,将所述差值与rate相乘获得新产生的令牌数,按照如下公式计算获得待分发的令牌数;
[0081]
待分发的令牌数=min(令牌桶容量,剩余令牌数+新产生的令牌数);(公式1)
[0082]
若所述待分发的令牌数大于1,则取出1个令牌,所述待分发的令牌数减1后记为tokens_key值,相应地,更新数据库中value值为更新后的tokens_key值,流控通过;若当前令牌数等于0,则认为令牌桶内没有令牌,流控拒绝。记录本次流控的结束时间更新timestamp_key的值;
[0083]
本发明实施例中的流控方法,可以通过简单的流控参数调整,完成对流控扩展;本发明实施例中的流控规则是通过建立路由规则与过滤规则的匹配关系实现,并配置在网关路由系统中,以更简单便捷的方式实现实施精细化流控,减少对数据库的频繁访问,也无需依赖任一开源软件。
[0084]
步骤s4:待api请求通过步骤3的请求的过滤处理,将根据api请求匹配的路由规则,将api请求路由至后台服务对应的api路径,获取服务;
[0085]
步骤s5:基于skywalking的api请求过程的实时监控:jdk1.5之后引入了
javaagent技术,javaagent是运行方法之前的拦截器。利用javaagent技术部署skywalking javaaagent,通过在网关路由系统启动时,在vm options中增加jvm启动参数
[0086]-javaagent:/${aentpath}/skywalking-agent.jar,以每一次调用api的请求为单位,采集相关api请求过程的数据传输到skywalking的后端服务器,所述相关api请求过程的数据包含请求的网关域名与api路径、及api请求开始时间、api请求结束时间,并以此统计api调用次数、api耗时的定制化数据,存入mysql数据库及完成前端界面的可视化展示;所述前端界面的可视化展示基于skywalking-ui的web可视化平台实现;
[0087]
图4为本发明实施例中跨机房场景下的api网关路由系统结构示意图,包括网关控制台系统、消息中间件、网关路由系统;在本发明实施例中,区分本地机房和远程机房,所述网关控制台系统部署在本地机房,所述网关路由系统在本地机房和远程机房均由部署,所述网关控制台系统中配置的信息会在持久化到mysql,所述信息包含应用信息、网关域名信息、api路由信息、用户身份信息;任一个机房内网关路由系统关闭后再重启时,从网关路由系统所在机房内的mysql数据库中获取信息;所述网关控制台系统用于管理信息下发至本地机房的网关路由系统;所述服务器中配置至少1个微服务应用,且每个机房的服务器内配置的微服务应用是相同的;每个机房配有一个网关路由系统;各机房的网关路由系统通过消息中间件集群执行路由信息的跨机房推送;各个机房的网关路由系统组成了一个了名义上的“网关路由”。
[0088]
图5为本发明实施例中跨机房环境中网关路由统一部署示意图,包括客户端、网关控制台系统及部署在各个机房的网关路由系统、多个消息中间件组成的消息中间件集群、mysql数据库、提供微服务的服务器;所述客户端为调用api的请求方,本发明实施例中的客户端包含客户端a和客户端b,所述客户端a和所述客户端b通过不同的产品应用请求访问相同的api路径,比如/order/detail。
[0089]
在路由网关系统接收客户端请求获取api路径之前,需先通过网关控制台系统将产品应用信息、网关信息、api路由信息、用户身份信息跨机房推送至机房a、机房b和机房c的网关路由系统;其次将上述信息通过主从数据库集群复制技术,完成在机房a、机房b和机房c的同步;其中api路由信息中配置了通过应用1的应用域名1和接口路径1获取后台提供订单服务的api路径/order/detail的路由规则1;通过应用2的应用域名2和接口路径2获取后台提供订单服务的api路径/order/detail的路由规则2;
[0090]
客户端a通过应用1请求订单服务时,任一机房内的网关路由系统接收到请求时,获取应用域名www.111.com和请求路径,在api路由信息中匹配对应于应用域名和请求路径的路由规则1,待通过调用权限校验和请求过滤后,按照路由规则1的api路径,将本次api请求发送至后台提供订单服务的服务器;
[0091]
客户端b通过应用2请求订单服务时,获取请求域名和请求路径,在api路由信息匹配是否存在匹配应用域名www.222.com和请求路径的路由规则1;在api路由信息中匹配对应于应用域名和请求路径的路由规则2,按照路由规则2的api路径,将本次api请求发送至后台提供订单服务的服务器。
[0092]
本发明实施例搭建了网关控制台系统,并在网关控制台系统中集成包含网关域名信息、api路由信息及流控管理信息的多样化路由管理的相关信息,网关管理人员仅需通过网关控制台系统能管理多个产品应用访的路由规则,并支持多个域名同时访问,避免了在
单独网关部署中,需为每个网关域名配置单独网关路由系统带来的人力研制成本及维护成本大量投入。
[0093]
本发明所达到的有益效果:
[0094]
(1)本发明通过网关路由系统内路由信息的跨机房实时推送,实现对路由信息变化的实时捕获,有利于及时根据最新的路由信息执行路由规则动态加载。
[0095]
(2)本发明通过构建网关控制台系统,集成了对api路由信息、应用信息、网关域名信息及用户身份信息的多样化路由管理相关信息的管理,网关管理人员仅需通过网关控制台系统,便能同时管理多个产品应用的路由规则,并支持多个域名同时访问,避免了在单独的网关部署中的人力研制成本及维护成本大量投入。
[0096]
(3)本发明通过在各机房内配置消息中间件集群,通过消息中间件集群将的路由信息下发到各机房的网关路由系统,对跨机房集群场景下的动态路由进行了支持。
[0097]
(4)本发明通过建立路由规则与过滤规则的匹配关系,实现以流控粒度实施精细化流控,并辅以根据业务需求的参数调整,扩展性强。
[0098]
以上实施例不以任何方式限定本发明,凡是对以上实施例以等效变换方式做出的其它改进与应用,都属于本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1