写点什么

WebApi 性能优化

作者:神秘码农
  • 2022 年 4 月 06 日
  • 本文字数:2311 字

    阅读完需:约 8 分钟

@[toc]

一、WebApi 调优

  • 什么是 WebApi 调优

  • 当浏览器端请求 WebApi 服务端读写数据需要耗费时间,将耗费的时间缩短,就称之为 WebApi 调优。

  • 如图:



  • 目的提升 WebApi 的性能。

二、WebApi 应用场景

  • 场景

  • 前后端分离的项目。

三、WebApi 性能瓶颈定位

  • 定位性能瓶颈

  • 请看 NetCore 性能排查文章:https://blog.csdn.net/Fu_Shi_rong/article/details/123733415?spm=1001.2014.3001.5501

四、WebApi 性能优化手段一-本地缓存

  • 单体项目

  • 如图:



  • 实现

  • 设计思路

  • 查询使用时先看本地缓存有无数据,有数据直接返回,无数据时到数据库查询,将查询到的数据添加到本地缓存中并将数据返回给浏览器端

  • 优点与缺点

  • 缺点

  • Memory 是服务器内存中的缓存,如果并发量大并查询的数据又不一致,会造成内存非常的大 ,同时会造成 GC 不断地回收这个内存,由于 Memory 内部使用的静态变量造成内存无法回收,GC 每回收一次,就会消耗一次 CPU 资源,如果 GC 回收的频率比较大,那消耗的 CPU 资源也会变大,例如:现在的 CPU 的使用率为 100%,GC 消耗了 70%CPU 资源,那我们的吞吐量只有 30%,那处理请求的性能大幅度的下降。

  • 解决方案

  • 用时间换空间的方法来解决,给缓存设置时间。

  • 设置缓存大小

  • 设置单个缓存大小,并设置自动失效时间

  • 优点

  • 数据读写速度时间缩短,性能得到提升。

  • 实现步骤

  • 安装缓存 Nuget 包


    Microsoft.Extensions.Caching.Memory  
复制代码


  • Startup 注册


    ConfigureServices方法中注册缓存服务    Service.AddMemoryCache(options=>{       options.SizeLimit = 1024*1024*100; //设置缓存大小    });
复制代码


  • 在使用的场景进行注入


    在构造方法中注入
private readonly IMemoryCache memoryCache;
构造函数 (IMemoryCache _memoryCache) { memoryCache =_memoryCache; } //测试对象 Person per = new Person(); //查询缓存方法 //memoryCache.Get<Person>(key); //为了放防止多线程并发 bool flag = memoryCache.TryGetValue<缓存对象>(key,out per); //true:有数据 false:无数据 //限制缓存大小 var cacheEntryOptions = new MemoryCacheEntryOptions(). //设置单个缓存大下 SetSize(1024). //设置过期时间 自动失效 SetSlidingExpiration(TimeSpan.FromSeconds(3)); //添加缓存 memoryCache.Set<Person>(key,value,cacheEntryOptions);
复制代码


  • 解决第一次请求耗时解决方案

  • 将项目启动的时候,将数据库中的数据添加到缓存中

  • 代码实现


    //类继承 IHostService      //并在Startup类中注册
复制代码

五、WebApi 性能优化手段二-分布式缓存

  • 方案

  • 请看这篇文章。https://blog.csdn.net/Fu_Shi_rong/article/details/123930343?spm=1001.2014.3001.5501

六、WebApi 性能优化手段三-Http 缓存(响应缓存)

  • 方案

  • 协商缓存

  • 安装 Nuget 包


      Marvin.Cache.Headers
复制代码


- 在Startup类中只注册
复制代码


      ConfigureServices方法中注册      Service.AddHttpCacheHeaders((options)=>{options.MaxAge = ....;//设置过期时间  默认60s                                              options.CacheLocation = ....;//public  公共的  private  私有的只能当前客户端使用                                              options.NoStore= ...;//  设置响应头信息   不走本地缓存                                              options.NoTransform= ....;//设置请求头信息                                               },                                  (options1)=>{});       Configure方法中启动并存储校验信息      app.UseHttpCacheHeaders();
复制代码


- 控制器方法中添加代码
复制代码


      HttpContext.Response.Headers.Add("cache-control","max-age=60,public"); //是否开启缓存储数据  设置缓存时间       HttpContext.Response.Headers.Add("etag",Value);//校验      HttpContext.Response.Headers.Add("last-modified","Mon,24 Dec 2022 09:49:49 GMT");
复制代码


- 原理
当客户端第一次请求服务器,服务器响应后,服务器会往响应头里写入两个参数 【1、是否开启缓存存储数据2、校验】并存储到客户端,客户端会将数据存储到缓存仓库中;当客户端第二次请求到服务器,会将etag传到服务器进行校验,如果两个etag是相等的,服务端会返给客户端304,客户端会从缓存仓库中获取数据。
- 场景
不可变的数据使用。
- 缺陷
会浪费大量客户端和服务器进行交互。
复制代码


  • 强制缓存 [不常用]

  • 步骤

  • 安装 Nuget 包


      Marvin.Cache.Headers
复制代码


- 在Startup类ConfigureServices方法中注册
复制代码


      ConfigureServices方法中注册      Service.AddHttpCacheHeaders((options)=>{        options.MustRevalidate = true;  //全局的方式  不建议使用      });       Configure方法中启动并存储校验信息      app.UseHttpCacheHeaders();
复制代码


- 控制器方法中添加代码
复制代码


      HttpContext.Response.Headers.Add("cache-control","max-age=60,public,must-revalidate");
复制代码


- 针对某个控制器使用
复制代码


      //在控制器方法上添加特性      [HttpCacheExpiration(CacheLocation = CacheLocation.Public,MaxAge=60)]  设置NoStore = true  不走缓存      [HttpCacheValidation(MustRevalidate = true)]
复制代码


  • 场景

  • 字典数据

  • 静态资源 图片等

  • js 或 css 文件​

七、WebApi 性能优化手段四-数据压缩(响应)

  • 步骤

  • 在 Startup 类 ConfigureServices 方法中注册


    //响应数据压缩    services.AddResponseCompression();
复制代码


  • 在 Startup 类 Configure 方法中开启服务


    //必须写在中间件的开头    app.UseResponseCompression();
复制代码


  • 数据压缩的目的

  • 数据传输的时候,减少传输的带宽,提升性能。

  • 场景

  • 只要涉及到数据传输都可以用数据压缩。

发布于: 刚刚阅读数: 2
用户头像

神秘码农

关注

还未添加个人签名 2022.03.14 加入

好好学习,天天向上!

评论

发布
暂无评论
WebApi性能优化_神秘码农_InfoQ写作平台