前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

你真的会用ocelot吗?记一次排查系统串账号之旅

qiguaw 2024-10-27 12:32:15 资源文章 19 ℃ 0 评论

开发语言:.netcore2.2,前端layui

网关:ocelot

架构:前后端分离

现象描述:不同账号登录系统登录成功后偶尔成了同一个账号,包括系统的权限,用户名都成了同一个账户。多人多账户同时登录测试,发生频率更高,而且最终不固定成为同一个账户登录系统。

网关配置如下:

"ReRoutes": [ //业务服务
    {
      "DownstreamPathTemplate": "/{url}", //是下游服务配置 => 即我们刚刚创建的提供API服务的配置,我们会指定PathTemplate,Host和Port等信息(具体调哪一台服务器是由我说了算)
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": "5011"
        }
      ],
       "LoadBalancerOptions": { //配置负载均衡规则
         "Type": "LeastConnection" //最小连接数
       },
       "FileCacheOptions": { //http 请求缓存
         "TtlSeconds": 10,
         "Region": "web"
      },
      "QoSOptions": {
         "ExceptionsAllowedBeforeBreaking": 5, // 允许多少个异常请求
         "DurationOfBreak": 10000, // 熔断的时间,单位为毫秒
         "TimeoutValue": 30000 // 如果下游请求的处理时间超过多少则视如该请求超时
       },
      "UpstreamPathTemplate": "/{url}", //是上游服务配置 => 即服务消费方(eg.MVC Server, SPA App)的调用配置(你要怎么按照什么URL格式和什么HTTP类型调用我才能理解)
      "UpstreamHttpMethod": [ "Get", "Post", "OPTIONS" ]

    }, 
    {
      "DownstreamPathTemplate": "/{url}", //文件服务
      "DownstreamScheme": "https",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": "5041"
        }
      ],
      "UpstreamPathTemplate": "/file/{url}",
      "UpstreamHttpMethod": [ "Get", "Post", "OPTIONS" ]
    }  
  ]

遇到问题后首先想到的是代码排查,于是在网关中,服务接口中加断点,发现有时候进入不到接口的断点,但是系统菜单,用户信息都能加载到页面。

经过一番折腾,定位到了网关配置,于是看到有这样一个配置。 才发现本来注释的代码被同事取消注释并发布到了服务器上。

字面意思是,文档缓存设置,意思是,请求过来的url会被缓存10秒,10秒后ttl强制过期。

它的使用场景是什么呢?

对于公共的文件可以在服务中加上这个配置,这样,设置的时间内请求这些文件直接从缓存取,减少服务器压力。

问题复盘:

由此可以理解,因为在主服务中添加了这个设置,因为登录成功后系统会调获取菜单接口,调用用户信息接口,这些数据都被缓存下来,如果10秒内由其他账号登录系统,直接从缓存中取数据,这样就验证了在获取菜单接口中加断点,进不到断点但是页面有菜单数据这个现象。


经过这次事件,我们在使用任何服务,类库时,一定要搞清楚原理和使用场景,不然就会发生上边这样的事情。

我们下篇见!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表