乐趣区

关于webapi:WebApi-性能优化

[toc]

一、WebApi 调优

  • 什么是 WebApi 调优

    当浏览器端申请 WebApi 服务端读写数据须要消耗工夫,将消耗的工夫缩短,就称之为 WebApi 调优。

    如图:

  • 目标
    晋升 WebApi 的性能。

二、WebApi 利用场景

  • 场景

    前后端拆散的我的项目。

三、WebApi 性能瓶颈定位

  • 定位性能瓶颈

    请看 NetCore 性能排查文章:https://blog.csdn.net/Fu_Shi_…

四、WebApi 性能优化伎俩一 - 本地缓存

  • 单体我的项目

    如图:

  • 实现

    • 设计思路

      查问应用时先看本地缓存有无数据,有数据间接返回,无数据时到数据库查问,将查问到的数据增加到本地缓存中并将数据返回给浏览器端

    • 长处与毛病

      • 毛病

        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<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_…

六、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();
  • 数据压缩的目标

    数据传输的时候,缩小传输的带宽,晋升性能。

  • 场景

    只有波及到数据传输都能够用数据压缩。

退出移动版