当前位置: 首页 > news >正文

(七)RestAPI 毛子(Http 缓存/乐观锁/Polly/Rate limiting)


文章目录

  • 项目地址
  • 一、Http Cache
    • 1.1 服务注册
    • 1.2 Validation with ETag
      • 1. 添加ETagMiddleware中间件
      • 2. 创建内存ETag存储器
      • 3. 服务注册
      • 4. 测试
  • 二、使用ETag实现乐观锁
    • 2.1 添加乐观锁方法
    • 2.2 修改Controller
    • 2.3 测试乐观锁
  • 三、Rate Limiting
    • 3.1 添加速率控制服务
      • 1. 在Program里添加服务
      • 2. 添加AddRateLimiting方法
      • 3. 使用
      • 4. 弊端
  • 四、Idempotent Request
    • 4.1 创建IdempotentRequestAttribute特性
    • 4.2 使用
    • 4.3 测试


项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
dbt 
airflow

一、Http Cache

缓存的类型:
1. Client cache
2. Gateway cache(reverse poxy)
3. Proxy cache(CDN)

1.1 服务注册

  1. 注册cache服务
    在这里插入图片描述
  2. 注册中间件

在这里插入图片描述

1.2 Validation with ETag

  • 使用Rest api 返回ETag头部进行缓存
    在这里插入图片描述
    流程:
    1. 第一次请求,没有缓存,数据库查询后,返回并且添加ETag响应头
    2. 响应头存储在浏览器缓存,如果还是相同的请求或者没有更改,则返回304not modified,并从内存缓存里拿数据
    3. 如果更改或者没有缓存数据,则返回新的ETag

1. 添加ETagMiddleware中间件

  • 用于生成Etag头部和判断响应
namespace DevHabit.Api.Middleware;//定义一个中间件,表示请求管道中的下一个中间件
public sealed class ETagMiddleware(RequestDelegate next)
{public async Task InvokeAsync(HttpContext context, InMemoryETagStore eTagStore){//1.如果当前请求方法是 POST、PUT、PATCH 或 DELETE,就跳过 ETag 逻辑if (CanSkipETag(context)){await next(context);return;}//2.获取当前请求的 URI,用作标识资源的 key,稍后要用来生成和比对 ETag。string resourceUri = context.Request.Path.Value!;//3.从请求头中读取客户端带来的 If-None-Match ETag,用于判断资源是否修改过。去掉引号是为了统一格式。string? ifNoneMatch = context.Request.Headers.IfNoneMatch.FirstOrDefault()?.Replace("\"", "");//4.如果请求方法是 GET 或 HEAD,就从 ETag 存储中获取当前资源的 ETagStream originalStream = context.Response.Body; //获取原始响应流using var memoryStream = new MemoryStream(); //创建一个内存流,用于缓存响应内容context.Response.Body = memoryStream; //将响应流写入内存流,以便后续读取响应内容//5.执行请求管道中的下一个中间件(或控制器),并把响应写入 memoryStream 中gawait next(context); //6. 如果响应状态码是 200 OK,并且响应内容类型是 JSON,就计算 ETagif (IsETaggableResponse(context)){memoryStream.Position = 0; //将内存流位置重置到开头byte[] responseBody = await GetResponseBody(memoryStream); //读取内存流中的响应内容string eTag = GenerateETag(responseBody); //计算 ETageTagStore.SetETag(resourceUri, eTag); //将 ETag 存储到 ETag 存储中context.Response.Headers.ETag = $"\"{eTag}\""; //将 ETag 添加到响应头中context.Response.Body = originalStream; //将响应流恢复为原始响应流//9. 如果 ETag 存储中已经有当前资源的 ETag,并且和计算出来的 ETag 一致,就返回 304 Not Modifiedif (context.Request.Method == HttpMethods.Get && ifNoneMatch == eTag) {context.Response.StatusCode = StatusCodes.Status304NotModified;context.Response.ContentLength = 0;return;}}//如果内容有更新,复制缓冲的响应内容到原始响应流中,让客户端收到响应。memoryStream.Position = 0;await memoryStream.CopyToAsync(originalStream);}//判断当前响应是否适合使用 ETag 进行缓存处理private static bool IsETaggableResponse(HttpContext context
http://www.xdnf.cn/news/176761.html

相关文章:

  • 【学习笔记1】一站式大语言模型微调框架LLaMA-Factory
  • Vue2 与 Vue3 深度对比与技术解析
  • 黑马点评redis改 part 6
  • 一周学会Pandas2 Python数据处理与分析-Pandas2数据信息查看操作
  • 语音识别质量的跟踪
  • 力扣HOT100之链表:23. 合并 K 个升序链表
  • 树状数组单点操作+前缀K差分->区间K操作 -#131-#132
  • SpringBoot + SSE 实时异步流式推送
  • Linux内核中的编译时安全防护:以网络协议栈控制块校验为例
  • mAh 与 Wh:电量单位的深度解析
  • 【Pandas】pandas DataFrame rtruediv
  • 全网直播推介会,九识智能与申通快递达成全面战略合作
  • 20.压敏电阻的特性与使用注意事项
  • RuoYi-Vue项目Docker镜像构建、推送与部署完整流程
  • 云平台+MQTT+C#上位机+单片机通信
  • 在 UniApp 中实现 App 与 H5 页面的跳转及通信
  • lightrag : from lightrag.utils import EmbeddingFunc 报错
  • 04.通过OpenAPI-Swagger规范让Dify玩转Agent
  • 【Redis】set类型
  • JavaEE-多线程实战02
  • AI如何重塑CC防护行业?五大变革与实战策略解析
  • 【创新实训个人博客】multi-agent调研(2)
  • promis(resolve,reject)入门级别
  • 互联网大厂Java面试:从Spring Boot到微服务架构的实践与挑战
  • 智诚科技苏州SOLIDWORKS授权代理商的卓越之选
  • vite.config.ts 的详细配置项说明、完整代码示例及表格总结
  • 代码随想录算法训练营day12(二叉树)
  • javaScript--数据结构和算法
  • 轮转数组(中等)
  • 如何优雅地解决AI生成内容粘贴到Word排版混乱的问题?