ASP.NET性能优化之反向代理缓存

ASP.NET基于IIS反向代理实现Web负载均衡实战演练 一、课程介绍 随着公司业务的发展,后台.NET Web应用程序业务就变的越来越多,然而服务器的故障,时不时的汹涌而至,单点故障让我们防不胜防。由于客户访问量逐渐增多,单一个WEB站点(MVC、WebApi)响应越来越慢,由于我们的业务都是采用.NET Web应用程序部署托管在IIS上,那么如何实现我们流量的削峰谷平,应用程序的横向扩展,从而来提高单台WEB站点的吞吐量,降低了单台Web站点的压... 阅读详情
核心提示:今天我们将要讲到的是大型站点的一种常用做法,将缓存部署在反向代理服务器上,这类缓存我们通常称之为反向代理缓存。

  到目前为止,我们讨论了把缓存存放在ASP.NET的输出缓存中(内存和硬盘),以及浏览器缓存中,而大型站点的另一种常用做法是将缓存部署在反向代理服务器上,这类缓存我们通常称之为反向代理缓存,比如Squid和Varnish。这两款软件通常都部署在非WINDOWS平台上,对于 Windows平台上的Asp.net来说,其实一样能使用,我们完全可以把反向代理软件部署在LINUX上,然后代理会路由到后台的WINDOWS WEB(IIS)服务器。总之,非WINDOWS的世界很精彩。

  当然,无论是squid还是varnish都有Windows的扩展版本。本文为了简便起见,基于varnish的Windows版本来描述的。

  varnish的官方站点:https://www.varnish-cache.org/,

  varnish的Windows版本:http://www.cygwin.com/,如果要编译过的直接可用的版本,在这里:http://www.software112.com/products/cygwin-varnish-cache.html。

  1:将varnish配置为IIS的代理

  首先需要为varnish准备配置文件,比如,可以为default.vcl,内容如下:

  1. backend default  
  2. {  
  3. .host = "192.168.0.77";  
  4. .port = "80";  
  5. }  
  6. sub vcl_fetch  
  7. {  
  8. remove beresp.http.Set-Cookie;  
  9. }  
  10. sub vcl_recv  
  11. {  
  12. remove req.http.Cookie;  
  13. } 

  在我们要示范的这个实例中,这3个配置都不能少,如下,

  backend default:指定我们的IIS站点的地址和端口;

  sub vcl_fetch:这是一个varnish函数,它varnish从后端服务器,也就是IIS中获得数据后被调用;

  sub vcl_recv:varnish函数,表示客户端请求杠杠到达反向代理服务器时被调用;

  由于varnish默认在碰到http头中含有Cookie相关标识时直接忽略缓存,所以我们需要上面的两个函数针对Cookie做特殊处理。当然,目前这两个函数只是简单而野蛮的删除标识,实际的应用中我们可能需要根据实际情况为它们加上一些判断条件。

  2:启动varnish

  下面的命令为我启动varnish:

  C:varnishin>varnishd -a :8011 -T :8088 -f c:/varnish/etc/default.vcl -s file,c:/varnish/var/cache,100M

  -a:8011表示,让varnish监听在8011端口。由于我测试环境下varnish和iis是在同一台机器上,所以IIS已经占用了80,我这里只有使用其它端口。

  -T是为varnish指定一个管理端口;

  -f指定所要使用的配置文件;

  后面的参数只是让varnish使用文件缓存,大小为100M,当然,应该根据实际情况指定大小;

  启动varnish后,如果我们请求http://地址:端口/,就可以等到200OK状态码,那表示varnish已经在正确滴接受请求。

  3:一个实例

  创建asp.net页面,内容如下:

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3. this.Response.AddHeader("Cache-Control", "max-age=60");  
  4. this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));  
  5. DateTime IfModifiedSince;  
  6. if (DateTime.TryParse(this.Request.Headers.Get("If-Modified-Since"), out IfModifiedSince))  
  7. {  
  8. if ((DateTime.Now - IfModifiedSince.AddHours(8)).Seconds <60)  
  9. {  
  10. Response.Status = "304 Not Modified";  
  11. Response.StatusCode = 304;  
  12. return;  
  13. }  
  14. }  
  15. string conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;";  
  16. using (DataSet ds = Common.SqlHelper.ExecuteDataset(conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))  
  17. {  
  18. var result = ds.Tables[0].Rows[0]["name"].ToString();  
  19. Response.Write(result);  
  20. }  
  21. } 

  对该页面进行压力测试,100个用户,1000个请求,得到的结果如下:

  如果没有缓存,则结果如下:

  可以看到吞吐率有非常大的提升。

4:监控varnish

  可以使用varnishstat命令,对varnish进行监控,在上面的压力测试中,如果我们使用监控,得到的结果如下:

  在本例中,我们可以看到共请求了1000次,其中999次命中缓存,那是因为第一次显然肯定是要从IIS中拿输出滴。

  5:管理varnish

  可以通过多种途径来进行varnish的管理,包括更改配置、停止服务、启动服务、清理缓存等。可以通过varnishadm命令进行管理,如果你是在远程的话,可以使用telnet来进行管理:

  telnet 192.168.0.77 8088

  其中8088就是我们刚在启动varnish的时候指定的管理端口。连接上之后,stop停止服务、start启动服务,可以敲入help查看所有命令。下面的命令,清除所有缓存:

  purge.url *$

  6:谨慎引入varnish后带来的缓存变化

  引入varnish后,可以发现使用强制刷新(ctrl+R5)后,动态行为发生了改变,即客户端浏览器会去VARNISH上请求数据,但是此时的缓存中已经存在静态的缓存内容,varnish会首先根据请求的HTTP头去和这个缓存内容判断得出需要是否更新,即由于缓存内容的存在,请求不会去 IIS上进行缓存协商。这个时候,缓存中的静态内容会直接返回给客户端浏览器,这样一来的话,我们在Page_Load中的代码就根本不会执行,因为它是在IIS中的。

  要避免这种情况的发生,我们必须更改VARNISH配置文件,让VARNISH碰到强制更新的时候,忽略缓存,直接去IIS上请求,为配置文件增加如下函数:

  1. sub vcl_hit {  
  2. if(req.http.Cache-Control~"no-cache"||req.http.Cache-Control~"max-age=0"||req.http.Pragma~"no-cache"){  
  3. set obj.ttl=0s;  
  4. return (restart);  
  5. }  
  6. return (deliver);  
  7. } 

  经过上面的修改后,再次使用强制更新varnish将会忽略缓存,到IIS上去拿正文。


ASP.NET Core Web API 开发实战:从核心架构到生产部署 在现代Web开发中,构建高性能、可维护的后端服务是核心技术需求。其原理基于请求处理管道和模块化设计,通过中间件有序处理HTTP请求,实现灵活的功能扩展。依赖注入作为核心设计模式,通过管理服务的生命周期(如瞬时、作用域、单例),有效解耦组件并提升可测试性。这些技术的价值在于为开发者提供了稳定、高效的框架基础,广泛应用于构建企业级Web API、微服务及实时应用。本文以ASP.NET Core为例,通过一个完整的待办事项API项目,系统性地演示了从项目初始化、依赖注入配置、控制器开发到集成结构化日志(如Seri 阅读详情

相关推荐

详解ASP.NET Core 反向代理部署知多少

引言 最近在折腾统一认证中心,看到开源项目IdentityServer4.Admin集成了IdentityServer4和管理面板,就直接拿过来用了。在尝试Nginx部署时遇到了诸如虚拟目录映射,请求头超长、基础路径映射有误等问题,简单记录,以供后人参考。 Nginx 配置路由转发 首先来看下IdentityServer4.Admin的项目结构: IdentityServer4.Admin / ├── Id4.Admin.Api # 用于提供访问Id4资源的WebApi项目 ├── Id4.Admin # 用于提供管理Id4资源的Web管理面板 ├── I

.NET 反向代理-YARP 根据域名转发

编者: fastgithub 就是基于YARP使用域名做转发逻辑的。 前段时间发布过一个关于 YARP 的简单介绍,感兴趣的小伙伴恭请移步看看.NET 反向代理-YARP  作为反向代理,必不可少的当然是根据域名代理转发啦,毫无疑问,YARP 是支持通过域名代理转发的,本文将介绍如何在配置文件中进行域名的配置  首先,你得有一个域名,本地测试的话可以修改 host 文件,达到...

dotNET跨平台 618

AD56XXR系列DAC驱动设计:SPI接口、寄存器配置与嵌入式工程实践

数模转换器(DAC)是嵌入式系统实现高精度模拟控制的核心器件,其性能取决于通信协议可靠性、寄存器配置准确性及硬件协同设计能力。基于SPI总线的电压输出型DAC广泛应用于工业控制、光模块偏置、传感器校准等场景,需兼顾静态精度、动态响应与低功耗特性。AD56XXR系列作为典型集成内部基准与多通道同步更新能力的12/14/16位DAC,支持轨到轨输出与灵活掉电模式,为资源受限MCU提供可移植固件范式。本文围绕SPI时序约束、16位指令字解析、LDAC同步机制及精度补偿策略展开,覆盖从硬件连接、初始化流程到量产级可

weixin_33481022的博客 610

Asp.net core IIS作为反向代理

为了使用IIS作为反向代理服务器,我们使用IWebHostBuilder的UseIISIntegration扩展方法,这会使应用程序能够在IIS或IIS Express中运行。

qq_33998475的博客 548

强化学习-马尔可夫模型

前文提到了强化学习源自马尔可夫决策过程,本文从马尔可夫概念入手,讲解和马尔可夫有关的模型和概念。在马尔科夫决策过程中,我们有一个智能体,它在一个马尔科夫过程中进行决策,每次决策都会导致状态的转移和获得即时奖励。智能体的目标是通过选择动作来最大化未来奖励的期望值。通常马尔科夫决策过程是个五元组:SAPRγSAPRγS 表示状态集合,代表智能体可能处于的所有状态。A 表示动作集合,代表智能体可以采取的所有动作。

君子之学必日新,日新者日进也。不日新者必日退,未有不进而不退者 8062

中科蓝讯(第一次使用指南)

中科蓝讯 新手指南

qq_48579018的博客 1万+

ASP.NET Web API基础(06)--- 使用C# 请求Web API及多版本控制

6.1 C# 请求Web API的方式 前端调用有Form表单提交,ajax提交,ajax一般是用Jquery的简化写法,在这里不再过多介绍; 后端调用大约有这些:WebCient、WebRequest、Httpclient、WebapiClient,重点探讨Get和Post请求,Put和Delete请求用较少。 下面先介绍Get和Post的基本写法,最后再封装一下,便于调用。 先编写几...

高原秃鹫的博客 783

Unity坦克物理系统:履带驱动与力场建模实战指南

在游戏物理仿真中,履带车辆的运动建模远超传统轮式控制器的范畴。其核心在于摒弃WheelCollider的滚动幻觉,转向基于牛顿力学的力与力矩协同求解——通过主推进力场、转向力矩场和地面反作用力场三重叠加,实现对质量、摩擦、惯性及坡度阻力的真实响应。这种建模方式不仅支撑坦克爬坡、陷泥、侧倾等复杂行为,更保障了多人同步与高帧率下的物理稳定性。Physics Tank Maker 正是这一思路的工业级落地,它将PhysX底层机制与坦克动力学深度耦合,提供可调参数、事件驱动视觉反馈及标准扩展接口,成为面向严肃模拟类

weixin_29535577的博客 562

一起谈.NET技术,实战ASP.NET大规模网站架构:Web加速器

  大规模网站瓶颈之一就是性能问题,如何让你的网站飞速运转起来,一直是架构师和开发人员苦于思考的问题。文章将针对基于ASP.NET开发的网站交互性非实时部分进行讨论。   一、WEB加速通常有如下方案:   1、基于ASP.NET技术的页面缓存   基于ASP.NET技术的页面缓存,通常有如下两种应用方式:   一、基于数据库触发(设置缓存依赖策略,当数据库中数据发生变化时,触发缓存失效;但微软提...

weixin_34126557的博客 108

实验二 离散控制系统的性能分析(时域/频域)

1.掌握离散闭环系统的动态性能时域参数的分析与计算方法; 2.掌握离散系统稳定性的频域典型参数分析与计算方法。 MATLAB 软件( 2022a); 1.在 Matlab 语言平台上,通过给定的闭环离散系统,深刻理解时域参数的物理意义与计算方法,内容包括如下: 阻尼比参数分析:Z 平面与 S 平面的极点相互转换编程实现;分析 S/Z 两个平面域特殊特性(水平线、垂直线、斜线、圆周等)的极点轨迹相互映射方法;系统阶跃响应参数:上升时间和超调量等。 2. 采用频域分析方法,通过编程计算,进一步理解离散系统的稳定

m0_51738372的博客 2479

SAP ABAP CDS View 里的日期函数

摘要:本文系统介绍了ABAP CDS日期函数在企业级应用中的关键作用,包括账龄计算、合同续期等业务场景。重点解析了DATS_IS_VALID、DATS_DAYS_BETWEEN等核心函数的语义和使用边界,特别强调on_error四种异常处理策略的选择逻辑。针对系统日期获取,对比了经典CDS的参数注入和View Entity会话变量两种方式。文章还提供了完整可运行的示例代码(包含CDS视图和ABAP程序),帮助开发者快速验证不同版本下的函数行为差异,确保在实际项目中正确应用这些日期处理函数。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 379

实战ASP.NET大规模网站架构:Web加速器

摘要:大规模网站瓶颈之一就是性能问题,如何让你的网站飞速运转起来,一直是架构师和开发人员苦于思考的问题,文章仅针对基于ASP.NET开发的网站交互性非实时部分进行讨论,实时交互部分解决方案将在后续部分予以阐述。  大规模网站瓶颈之一就是性能问题,如何让你的网站飞速运转起来,一直是

首席技术执行官CTO(Chief Technology Officer)|技术总监--邓斌博客 1150

智能合约监控告警:提示工程架构师用AI Prompt实现精准预警

当AI大模型(尤其是代码理解模型如CodeLlama、GPT-4 Code)与区块链数据结合,智能合约监控迎来范式革新。AI模型如何精准理解智能合约的业务特殊性?如何避免"AI幻觉"导致的误报?如何让模型学会区分"正常异常"与"攻击前兆"?答案藏在"提示工程"(Prompt Engineering)中。理解特定智能合约的业务逻辑(如DeFi协议的清算机制、NFT的铸造规则)识别复杂的攻击模式(如重入攻击的调用链特征、闪电贷的套利路径)结合链上链下数据进行多维度推理(如关联价格波动与异常交易)

AI架构全栈开发实战笔记 1011

实战ASP.NET大规模网站架构:Web加速器(1)【转】

实战ASP.NET大规模网站架构:Web加速器(1) 原文地址:http://developer.51cto.com/art/201003/189265.htm 大规模网站瓶颈之一就是性能问题,如何让你的网站飞速运转起来,一直是架构师和开发人员苦于思考的问题,文章仅针对基于ASP.NET开发的网站交互性非实时部分进行讨论,实时交互部分解决方案将在后续部分予以阐述。 大规模...

weixin_30716141的博客 107

真随机数与伪随机数

前面我们学习了LFSR,这个玩意落地到具体的应用是什么呢?没错是寄存器,这里在网络找到了几个回答,这里做个记录,下面一起来学习一下吧。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1062

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

.NET Core后端集成:为LiuJuan模型构建企业级API网关

本文介绍了如何利用星图GPU平台,自动化部署LiuJuan20260223Zimage国风美学生成模型v1.0,并为其构建企业级API网关。通过该网关,企业可以统一、安全地管理模型调用,典型应用场景包括为客服系统、内容平台等后端服务提供高效的国风风格图片生成能力。

weixin_36487018的博客 165

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【ZT】实战.NET大规模网站架构:Web加速器

  【IT168评论】大规模网站瓶颈之一就是性能问题,如何让你的网站飞速运转起来,一直是架构师和开发人员苦于思考的问题,随着CMS的成熟,大多数门户及网站都通过静态化来提升网站的性能和安全,但随之而来CMS管理发布也变得越复杂,如何能使发布的信息快速被用户访问,如何方便灵活定义一种策略,使缓存随着应用的变化变化,成了我亟待解决的问题。   本文仅针对基于asp.net开发的网站交互性非实时部分进...

weixin_34006965的博客 113

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

细说Cache

什么是缓存? Web 应用程序通常都是被多个用户访问。一个Web站点可能存在一个“重量级”的加载,它能够使得站点在访问的时候,拖慢整个服务器。当站点被大量用户同时访问的时候,访问速度缓慢是大部分网站共同存在的问题。为了解决这个问题,我们可以使用一个更高级别的硬件配置,负载均衡器,高带宽,但是加载并不是拖慢站点唯一的“罪魁祸首”,所以我们需要提供一种方案,它也同样能够加速数据访问以及提升性能。而采

Jason 804
上一篇: ASP.NET CS文件中输出JavaScript脚本的3种方法以及区别
下一篇: ASP.NET性能优化之局部缓存
vrwind
博客等级 码龄15年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值