svc的api做扩容负载均衡后,登录会出现“请求未授权”

Blade 未结 2 612
myname
myname 剑童 2022-09-18 18:33

一、该问题的重现步骤是什么?

1. workbench-svc程序 运行相同的4个application,前后端用nginx做负载均衡,前端请求4个随机的后端运行的application程序

2. 前端登录账号,有几率出现“请求未授权”的提示,并且登录不进去,会返回到登录页

3.重复登录,退出,登录,有大几率出现请求未授权的情况。

image.png

二、你期待的结果是什么?实际看到的又是什么?

1、期待的结果:登录成功,实际看到的:“请求未授权”登录失败

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

bladex-boot版产品,在k8s集群上部署。

四、请提供详细的错误堆栈信息,这很重要。

1、容器打印的日志:

image.png

2、通过TokenInterceptor类跟踪到了 WebUtil.class,可能是

RequestContextHolder.getRequestAttributes()

为null,网上查了说跟子线程获取不到父线程的信息有关,但是并没有用到子线程,可能是RequestContextHolder源代码自动创建的?

3、后端api server运行相同的多个就会出现这种情况,运行一个不会出现。


五、若有更多详细信息,请在下面提供。

2条回答
  • 你负载均衡的策略是什么?

    作者追问:2022-09-19 10:04

    1、我们是在蓝鲸智云上部署的,我看了一下nginx的yml里没有配置负载均衡策略,应该用的k8s的负载均衡策略,随机访问的,目前遇到问题就是扩容后端svc的api server之后,就会出现“请求未授权”的情况。

    2、在k8s里查看容器的日志就是报的 TokenIntercepter类里的preHandle方法里的 AuthUtil.getUser()为空就会打印 "签名认证失败"。一直点进去的话就是有一个RequestContextHolder.getRequestAttributes(),网上看了一下这个为空 的解决方法,可能跟线程有关,加了这段代码:

    RequestContextListener (){
       RequestContextListener()}

    也没有解决。

    0 讨论(0)
  • 2022-09-19 10:05
    RequestContextListener (){
       RequestContextListener()}


    回答: 2022-09-19 10:07

    @Bean

    public RequestContextListener requestContextListener(){

    return new RequestContextListener();

    }

    不知道显示正确了没有,就是上面的这段代码


    0 讨论(0)
提交回复