WebApi 性能优化

[toc]

一、WebApi调优

  • 什么是WebApi调优

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

    如图:

    WebApi 性能优化_第1张图片

  • 目的
    提升WebApi的性能。

二、WebApi 应用场景

  • 场景

    前后端分离的项目。

三、WebApi 性能瓶颈定位

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

  • 单体项目

    如图:

    WebApi 性能优化_第2张图片

  • 实现

    • 设计思路

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

    • 优点与缺点

      • 缺点

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

        • 解决方案

          1. 用时间换空间的方法来解决,给缓存设置时间。
          2. 设置缓存大小
          3. 设置单个缓存大小,并设置自动失效时间
      • 优点

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

  • 实现步骤

    • 安装缓存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(key); 
      //为了放防止多线程并发
      bool flag = memoryCache.TryGetValue<缓存对象>(key,out per);
      //true:有数据  false:无数据
      //限制缓存大小
      var  cacheEntryOptions = new MemoryCacheEntryOptions().
      //设置单个缓存大下
      SetSize(1024).
      //设置过期时间  自动失效
      SetSlidingExpiration(TimeSpan.FromSeconds(3));
      //添加缓存
      memoryCache.Set(key,value,cacheEntryOptions);
  • 解决第一次请求耗时解决方案

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

    • 代码实现

      //类继承 IHostService  
      //并在Startup类中注册

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

六、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)]
  • 场景

    1. 字典数据
    2. 静态资源 图片等
    3. js或css文件​

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

  • 步骤

    • 在Startup类ConfigureServices方法中注册

      //响应数据压缩
      services.AddResponseCompression();
    • 在Startup类Configure方法中开启服务

      //必须写在中间件的开头
      app.UseResponseCompression();
  • 数据压缩的目的

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

  • 场景

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

你可能感兴趣的:(WebApi 性能优化)