K8s 船还没修好,.net core 车又出了问题,开着 k8s 豪华邮轮、飚着 .net core 极品飞车的好事真是多磨。

自从我们用上 .net core ,就一直被 .net core 的一个慢性病所折磨,这个病叫 Data Protection Key 新陈代谢综合症,通常3-6个月发作一次。发作时的症状是新登录用户在登录后依然是未登录状态。病因是 Data Protection Key 默认3个月刷新一次,在这个刷新的新陈代谢阶段,新旧 key 并存,新的登录 cookie 用新的 key 进行加密/解密,旧的登录 cookie 用旧的 key 解密,但有时某种未知情况会造成新陈代谢时出现功能性紊乱,新 key 加密的 cookie 却用旧 key 解密失败,造成解密失败,登录 cookie 失效。

昨天下班的时候这个新陈代谢综合症又发作了,幸好我们及时发现,立即采取急救措施,重启所有应用恢复了正常。在急救时,我们犯了一个错,忘了重启了文件上传应用,结果造成一段时间无法上传图片。

Keys have a 90-day lifetime by default. When a key expires, the app automatically generates a new key and sets the new key as the active key. As long as retired keys remain on the system, your app can decrypt any data protected with them. (From docs.microsoft.com

新陈代谢综合症急救好之后,开车没多久,昨天晚上又出现了新的病情,用户登录站点突发急性消化不良症,访问登录页面响应速度很慢。排查后发现大量 http get 请求涌向登录页面,对应容器的 CPU 占用一直 150% 左右(平时不到 20%)。虽然源于大量请求,但是让人想不通的是这个登录页面只是显示一下 mvc 视图,没有耗资源的操作,没有任何数据库访问操作,即使这么大请求也应该能撑住。尝试给登录页面加上 ResponseCache ,问题依旧。尝试启动更多容器处理请求,问题依旧。

进一步排查中发现这个突发急性症状起源于一篇博文被设置为登录后才能访问,大量访问这篇博文的请求都跳转到了登录页面(这些请求本身也比较异常,可能是机器请求),于是在登录页面的 mvc action 中屏蔽这些请求,但病情没有丝毫改善,这时可以确认性能瓶颈不在 mvc action 。

知道药用错地方后,立即跳出当前 mvc action ,放眼整个请求处理管线上的那些 middeware 。望着日志中不断出现的大量错误,一个 middlware 立马映入眼帘,它就是用于给 serilog 日志提供更多上下文信息的 LogEnrichmentMiddleware ,在这个 middleware 中加上屏蔽异常请求的代码后立马药到病除,急性消化不良症就这样完成了急救。

public class LogEnrichmentMiddleware
{
private static readonly ILogger Logger = Log.ForContext<LogEnrichmentMiddleware>();
private readonly RequestDelegate _next; public LogEnrichmentMiddleware(RequestDelegate next)
{
_next = next;
} public async Task Invoke(HttpContext httpContext)
{
// 屏蔽异常请求
if (httpContext.Request.Query.TryGetValue("returnUrl", out var returnUrl) &&
WebUtility.UrlDecode(returnUrl) == "***")
{
httpContext.Response.StatusCode = StatusCodes.Status404NotFound;
return;
} var properties = new ILogEventEnricher[]
{
new PropertyEnricher("RequestUrl", httpContext.Request.GetDisplayUrl()),
new PropertyEnricher("RequestMethod", httpContext.Request.Method),
new PropertyEnricher("UserAgent", httpContext.Request.Headers[HeaderNames.UserAgent].ToString()),
new PropertyEnricher("Ip", httpContext.Connection.RemoteIpAddress.ToString())
}; using (LogContext.Push(properties))
{
await _next(httpContext); var statusCode = httpContext.Response.StatusCode;
if (statusCode >= 400 && statusCode != 404)
Logger.Warning("Unsuccessful response {StatusCode}", httpContext.Response.StatusCode);
}
}
}

抱歉,这2个问题给您带来麻烦了,请您谅解。我们会进一步分析病因,争取根治这2个病症,让 .net core 这辆车飚得更稳。

.net core 开车记:Data Protection Key 过期问题与登录页面访问慢的更多相关文章

  1. ASP.NET Core 数据保护(Data Protection)【上】

    前言 上一篇博客记录了如何在 Kestrel 中使用 HTTPS(SSL), 也是我们目前项目中实际使用到的. 数据安全往往是开发人员很容易忽略的一个部分,包括我自己.近两年业内也出现了很多因为安全问 ...

  2. ASP.NET Core 数据保护(Data Protection 集群场景)【下】

    前言 接[中篇],在有一些场景下,我们需要对 ASP.NET Core 的加密方法进行扩展,来适应我们的需求,这个时候就需要使用到了一些 Core 提供的高级的功能. 本文还列举了在集群场景下,有时候 ...

  3. ASP.NET Core 数据保护(Data Protection)【中】

    前言 上篇主要是对 ASP.NET Core 的 Data Protection 做了一个简单的介绍,本篇主要是介绍一下API及使用方法. API 接口 ASP.NET Core Data Prote ...

  4. Asp.net core 学习笔记 ( Data protection )

    参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...

  5. 集群环境下,你不得不注意的ASP.NET Core Data Protection 机制

    引言 最近线上环境遇到一个问题,就是ASP.NET Core Web应用在单个容器使用正常,扩展多个容器无法访问的问题.查看容器日志,发现以下异常: System.Security.Cryptogra ...

  6. Data Protection - how to manage expired key?(转载)

    问 According to ASP.NET Key Management: Deleting a key is truly destructive behavior, and consequentl ...

  7. ajax前置处理实现异步请求session过期时跳转登录页面

    第一篇博文,mark一下zhq[0]. 问题描述:用户页面,当session过期或都session注销后,普通页面后端都会有过滤器,session过期Redirect到登录页面,但是ajax请求后端只 ...

  8. 如果后台用framset框架布局,session过期,整个跳出回 登录页面的方法

    如果session过期了,登录页面会在framset框架的右边显示,只能用 js 来做,让整个框架跳出去: 然而,这里 js 必须要用“top”才可以,作用是让整个framset都跳转,直接用 win ...

  9. 基于ASP.NET Core Data Protection生成验证token

    ASP.NET Core Data Protection 不仅提供了非对称加密能力,而且提供了灵活的秘钥存储方式以及一致的加解密接口(Protect与Unprotect).Session中用到了它,C ...

随机推荐

  1. Laravel5使用ElasticSearch

    https://blog.csdn.net/qq_16829085/article/details/80725125 安装elasticsearch和ik插件 (elasticsearch的使用需要配 ...

  2. 理解和实现分布式TensorFlow集群完整教程

    手把手教你搭建分布式集群,进入生产环境的TensorFlow 分布式TensorFlow简介 前一篇<分布式TensorFlow集群local server使用详解>我们介绍了分布式Ten ...

  3. Fragment学习(二): 管理Fragment和Fragment通讯

    一. 管理Fragment 首先,如果你想在Android3.0及以下版本使用Fragment,你必须引用android-support-v4.jar这个包 然后你写的activity不能再继承自Ac ...

  4. Windows Community Toolkit 3.0 新功能 在WinForms 和 WPF 使用 UWP 控件

    本文告诉大家一个令人震惊的消息,Windows Community Toolkit 有一个大更新,现在的版本是 3.0 .最大的提升就是 WinForm 和 WPF 程序可以使用部分 UWP 控件. ...

  5. Ralasafe配置手册

    Ralasafe访问控制(权限管理)中间件的配置工作非常少.因为项目发起人非常讨厌配置.因此,"己所不欲,勿施于人",Ralasafe的配置也非常少. Ralasafe配置工作只有 ...

  6. spring json 返回中文乱码

    如前台显示的json数据中的中文为???,则可尝试以下方法. 方法一(推荐):在@RequestMapping中添加  produces={"text/html;charset=UTF-8; ...

  7. npm install 报错(npm ERR! errno -4048,Error: EPERM: operation not permitted)

    问题现象 原因 1.初次看报错日志内容,定义权限为问题,后来查资料才知道是缓存问题. 解决方法 1.简单直接 直接删除 npmrc文件 tips: 不是nodejs安装目录npm模块下的那个npmrc ...

  8. linux seq_file 接口

    如我们上面提到的, 在 /proc 下的大文件的实现有点麻烦. 一直以来, /proc 方法因为 当输出数量变大时的错误实现变得声名狼藉. 作为一种清理 /proc 代码以及使内核开发 者活得轻松些的 ...

  9. Struts 2三种方式实现Ajax

    Ajax本质上和普通的HTTP请求是一样的,只不过普通的HTTP请求是给人看的,而Ajax请求是给JS代码去用的. 所以Ajax请求的页面一般比普通的HTTP请求的响应内容还要简单,可能是一个页面的一 ...

  10. <mvc:annotation-driven /><context:annotation-config/><context:component-scan/>

    <context:annotation-config/> 隐式地向 Spring容器注册AutowiredAnnotationBeanPostProcessor. RequiredAnno ...