需求:
trade服务需要在下单后清空购物车
分析:
显然,清空购物车需要调用cart服务,也就是这个功能的实现涉及到了微服务之间的转发。
其次,清空购车还需要userId,所以需要使用RequestInterceptor来实现夹带信息。
完整流程:
1.前端收到点击事件“下单”,根据uri调用后端接口--->
2.springcloud网关拿到uri进行解析,从header中提取出token,Springcloud的Global拦截器进行鉴权,并且将其中根据token解析出的info存放在header中,进行后续的拦截过程。
网关查找到对应的服务,根据nacos提供的表单,采用负载均衡,选取对应端口携带header中的info进行转发--->
3.trade服务在收到网关请求前,经过公有api模块的springmvc拦截器,该拦截器将请求中的info读取并存放在threadLocal中(该拦截器作用仅用于将info存放仅threadLocal,所以是对所有页面放行的)--->
4.trade模块执行对应功能,执行中调用cart模块--->
6.调用cart模块使用openfeign进行请求发送,由于cart服务需要userId,所以需要经过openfeign拦截器进行增强。因为对cart模块发起的openfeign请求是由trade模块完成的,所以使用的线程仍然是执行trade模块功能的线程,该线程的threadLocal中存储着info,拦截器将info信息从threadLocal中取出并存放在请求连接的请求头中。--->
7.openfeign请求cart服务,openfeign请求仍然是一个http请求,既然是http请求,定然会被公有拦截器拦截。所以,拦截器取出请求头中的info,并将其存在对应新线程的threadLocal中,执行清空购物车功能。--->
8.结束
总结:
整个过程实际上是info信息的传递
最初后端初次鉴权——在springcloud的GlobalFilter中进行,鉴权后得到info开始传递:
公有拦截器:从header读取info,并存入trade线程的threadLocal
openfeign:将threadLocal的info取出,装进新http请求的header
共有拦截器:从header读取info,并存入cart线程的threadLocal