秒杀功能完整分析图
需求:
cookie应该写在网关中,网关中可以自定义filter过滤器,用来实现cookie的刷新和redis中key的刷新,延长用户的操作时间。
就是让用户每操作一次,就可以重新刷新延长操作时间。
代码流程
过滤器类
1、在zuul网关中建一个属性cookie时间的类,然后去继承zuulfilter网关拦截器类
工具类
2、在shop-common公共服务里面加上这个CookieUtil工具类
注意:在zuul-server服务想用到shop-common服务的类,需要引入该服务的依赖
过滤判断
3、然后写代码,获取请求request中的值,然后再CookieUtil类里面判断请求的cookie是否和登录的时候设置的cookie的name一样,一样的话就给cookie延长登录时间
注意:这个userToken就是我们之前登录方法doLogin里面设置cookie的name的名称
4、CookieUtil里面的判断方法,获取cookie的value值
远程调用feign接口
5、需求:获取到cookie之后,就需要远程调用服务(会员服务)进行redis过期时间的刷新,这个刷新的操作要在会员服务里面操作
zuul网关远程调用会员服务
feign远程调用接口
这个@FeignClient(name = “member-server”)表示调用这个接口的时候,走的服务就是这个叫member-server的会员服务
熔断降级类
远程调用的时候,这个降级是默认关闭的,所以我们要去给他设置为打开状态
gitee 配置
在gitee的zuul-server.yml这个服务配置里面设置
6、然后就需要去实现这个feign的api接口了,要在会员服务里面实现
feign接口写在服务 member-api 那里,接口实现写在member-server服务那里
feign远程调用接口
接口实现
zuul网关要远程调用会员服务,那么在启动类要贴@EnableFeignClients注解
过滤器run方法
延长redis过期时间和cookie的过期时间
测试:
查看redis的过期时间
每次操作页面,看过期时间有没有被刷新
查看cookie的过期时间
问题:
1、发现刷新页面并不会走这个过滤器的代码,没有刷新redis和cookie的过期时间
解决:原来是忘记给这个过滤器类加上这个@Component注解,实现bean注入
刷新页面后,也会刷新redis的过期时间了
cookie的时间也刷新了
2、为什么刷新页面,就会走这个CookieRefreshFilter类里面的代码。
解答:
因为这个CookieRefreshFilter类继承了ZuulFilter类,所以在服务请求zuul网关进行路由的时候,就会走这个过滤器类。
实现过滤器很简单,只需要继承 ZuulFilter 类,并实现 ZuulFilter 中的抽象方法