Nginx高性能秒杀和限流
从性能上来说,内部网关Zuul限流理论上比外部网关Nginx限流的性能会差一些。和Zuul一样,外部网关Nginx也可以通过Lua脚本的形式执行缓存在Redis内部的令牌桶限流脚本来实现分布式限流。
Nginx秒杀限流有两种架构,分别说明如下:
1.Nginx限流+Zuul认证和路由+seckill-provider微服务秒杀
这种架构属于非常典型的Nginx+Spring Cloud微服务架构,限流的逻辑处于外部网关Nginx,用户的权限认证处于内部网关Zuul,而获取秒杀令牌的逻辑处于seckill-provider微服务中。
这种典型的Nginx+Spring Cloud微服务架构的秒杀流程如图10-14所示。
图10-14 Nginx+Spring Cloud微服务架构的秒杀流程
2.Nginx限流+Lua脚本秒杀
这种架构属于高性能的秒杀架构,不只是限流的逻辑处于外部网关Nginx,就连获取秒杀令牌逻辑也处于外部网关Nginx。和上一种秒杀架构相比,这种纯Nginx+Lua架构绝对能提高性能。为什么呢?因为除了Nginx本身的高性能之外,纯Nginx+Lua架构还能减少两次网络传输,而网络传输都是耗时较高的操作。
Nginx+Lua架构的秒杀流程如图10-15所示。
图10-15 Nginx+Lua架构的秒杀流程
由于学会了第二种纯Nginx+Lua架构的实现,第一种架构的实现也就迎刃而解了,因此这里为大家展开介绍第二种架构的具体实现。纯Nginx+Lua架构的实现涉及以下两个Lua脚本:
(1)getToken.lua:此脚本完成秒杀令牌的设置和获取。
(2)getToken_access_limit.lua:此脚本完成分布式限流。
以上两个脚本中,getToken.lua执行在Nginx请求处理的content阶段,getToken_access_limit.lua执行在Nginx请求处理的access阶段,
两个脚本在nginx-seckill.conf文件中的具体配置如下:
#Nginx+lua秒杀:获取秒杀token
location = /seckill-provider/api/seckill/redis/token/v2 {
default_t