Welcome to YARP - 6.压缩、缓存

这篇具有很好参考价值的文章主要介绍了Welcome to YARP - 6.压缩、缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Welcome to YARP - 1.认识YARP并搭建反向代理服务

Welcome to YARP - 2.配置功能

  • 2.1 - 配置文件(Configuration Files)
  • 2.2 - 配置提供者(Configuration Providers)
  • 2.3 - 配置过滤器(Configuration Filters)

Welcome to YARP - 3.负载均衡

Welcome to YARP - 4.限流

Welcome to YARP - 5.身份验证和授权

Welcome to YARP - 6.压缩、缓存

Welcome to YARP - 7.目标健康检查

Welcome to YARP - 8.分布式跟踪

介绍

网关的 缓存压缩是常见的性能优化手段 ,用于提高系统的响应速度和降低网络传输的开销。

YARP 的 缓存压缩 其实也是 .NET 本身的功能。只需要配置 .NET 本身的缓存和压缩功能即可。

缓存

缓存的主要目的是优化性能、提高效率,减少对后端服务的负担。 我们可以对

频繁请求的静态数据或不经常更改的数据 进行 API 缓存,从而降低对后端服务的请求次数,提高响应速度,减轻后端服务的负载。

也可以对 静态资源 缓存 如:css、js、图像等,从而 加速页面加载速度,减轻服务器压力,提高用户体验。 等等。

基于 HTTP 的响应缓存

用于缓存的主 HTTP 标头是 Cache-Control,它用于指定缓存指令。 当请求从客户端到达服务器以及响应从服务器返回客户端时,这些指令控制缓存行为。 请求和响应在代理服务器之间移动,并且代理服务器还必须符合 HTTP 1.1 缓存规范。

Cache-Control 通用消息头字段,被用于在 http 请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。

要使用缓存,请求头中必须携带 Cache-Control 标头。同时响应头中也要做相应的设置。

下表中显示了常用 Cache-Control 指令

指令 操作
public 缓存可以存储响应。
private 响应不得由共享缓存存储。 专用缓存可以存储和重用响应。
max-age 客户端不接受期限大于指定秒数的响应。 示例:max-age=60(60 秒),max-age=2592000(1 个月)
no-cache 请求时:缓存不能使用存储的响应来满足请求。 源服务器重新生成客户端的响应,中间件更新其缓存中存储的响应。 响应时:响应不得用于未经源服务器验证的后续请求。
no-store 请求时:缓存不得存储请求。 响应时:缓存不得存储任何部分的响应。

相应的我们也要添加响应缓存中间件:

若要测试响应缓存,请使用 Fiddler、Postman 或其他可以显式设置请求标头的工具。显式设置上述的请求标头。

配置中间件

在 中 Program.cs ,将响应缓存中间件服务 AddResponseCaching 添加到服务集合中,并将应用配置为将中间件与 UseResponseCaching 扩展方法一起使用。 UseResponseCaching 将中间件添加到请求处理管道中:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddReverseProxy()//添加ReverseProxy相关服务到DI
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));//从配置文件中加载ReverseProxy的设置

builder.Services.AddResponseCaching(options =>
{
    options.UseCaseSensitivePaths = false; //确定是否将响应缓存在区分大小写的路径上。 
    options.SizeLimit = options.SizeLimit * 10; // 响应缓存中间件的大小限制(以字节为单位) 1G
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

// 使用 CORS 中间件时,必须在 UseResponseCaching 之前调用 UseCors。
// app.UseCors();
app.UseRouting();

// 拦截请求并判断 请求头中是否包含 CacheControl 标头,如果没有则加上缓存标头
app.Use(async (context, next) =>
{
    var header = context.Request.Headers;
    var cacheControl = header.CacheControl;
    if (!string.IsNullOrEmpty(header.CacheControl))
    {
        header.CacheControl = new Microsoft.Extensions.Primitives.StringValues("max-age");
    }

    await next(context);
});
app.UseResponseCaching();
app.Use(async (context, next) =>
{
    context.Response.GetTypedHeaders().CacheControl =
        new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
        {
            Public = true,
            MaxAge = TimeSpan.FromSeconds(10)
        };

    context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] = new string[] { "Accept-Encoding" };

    await next(context);
});
app.MapReverseProxy();

app.MapGet("/", () => DateTime.Now.ToLongTimeString());

app.Run();

以上示例中:

  • Cache-Control:缓存可缓存响应长达10秒。
  • Vary:将中间件配置为仅当后续请求的 Accept-Encoding 标头与原始请求头匹配时才提供缓存的响应。
app.Use(async (context, next) =>
{
    var header = context.Request.Headers;
    var cacheControl = header.CacheControl;
    if (!string.IsNullOrEmpty(header.CacheControl))
    {
        header.CacheControl = new Microsoft.Extensions.Primitives.StringValues("max-age");
    }

    await next(context);

});

可以看到我们先设置了 请求头的 缓存标头,如果 没有此 设置,几乎所有浏览器(标头值)都会发送 CacheControl:no-cache 或其他值,强制执行非缓存页面请求,这会导致 ResponseCachingMiddleware 实现忽略此请求(忽略缓存)并将其传递到服务器以检索数据。 如果你用 postman 或者 fiddle则可以主动这只CacheControl标头值为上述说的那几种。

上述示例中我们先 添加了 YARP 服务,然后添加了 AddResponseCaching 响应的缓存服务,然后拦截了请求并设置缓存标头,再开启了 UseResponseCaching() 响应缓存中间件。接下来设置了 [响应头的标头值]( ASP.NET Core 中的响应缓存中间件 | Microsoft Learn ),最后开启了 代理 中间件。源码已上传GitHub.

压缩

网络带宽是一种有限资源。 减小响应大小通常可显著提高应用的响应速度。 减小有效负载大小的一种方式是压缩应用的响应。 但是 YARP 默认是禁用解压缩的,因为它会增加 CPU 开销。

什么时候使用 响应压缩 中间件?

在 IIS、Apache 或 Nginx 中使用基于服务器的响应压缩技术。

  • IIS 动态压缩模块
  • Apache mod_deflate 模块
  • Nginx 压缩和解压缩

而 HTTP.sys 服务器和 Kestrel 服务器当前不提供内置压缩支持,这时候就需要使用响应压缩中间件了。

我们使用 YARP 的直接转发来 演示一下 压缩功能,当然压缩是 .NET 本身自带的功能,你也可以通过添加压缩中间件来开启响应压缩。

代码示例:

using System.Diagnostics;
using System.Net;
using Yarp.ReverseProxy.Forwarder;
using Yarp.ReverseProxy.Transforms;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpForwarder();

// Add services to the container.

var app = builder.Build();

// Configure our own HttpMessageInvoker for outbound calls for proxy operations
var httpClient = new HttpMessageInvoker(new SocketsHttpHandler()
{
    UseProxy = false,
    AllowAutoRedirect = false,
    AutomaticDecompression = DecompressionMethods.GZip, // 设置响应压缩方式
    UseCookies = false,
    ActivityHeadersPropagator = new ReverseProxyPropagator(DistributedContextPropagator.Current),
    ConnectTimeout = TimeSpan.FromSeconds(15),
});

// Setup our own request transform class
var transformer = new CustomTransformer(); // or HttpTransformer.Default;
var requestConfig = new ForwarderRequestConfig { ActivityTimeout = TimeSpan.FromSeconds(100) };

app.UseRouting();

// Configure the HTTP request pipeline.

app.MapForwarder("/{**catch-all}", "http://localhost:5047", requestConfig, transformer, httpClient);

app.Run();

/// <summary>
/// 自定义请求转换
/// </summary>
class CustomTransformer : HttpTransformer
{
    ///<summary>
    /// 该函数在发送被代理的请求之前被调用。在回调函数中,所有的 HttpRequestMessage 字段都已经被初始化,除了 RequestUri 字段,
    /// 在回调函数执行后,如果没有提供值,它将被初始化。这里的字符串参数表示在构建 RequestUri 时应该使用的目标 URI 前缀。
    /// 基础实现会复制头部(headers),但会排除一些协议头部,比如 HTTP/2 伪头部(":authority")。
    ///</summary>
    ///<param name="httpContext">传入请求</param>
    ///<param name="proxyRequest">传出的代理请求</param>
    ///<param name="destinationPrefix">所选目标服务器的uri前缀,可用于创建RequestUri</param>
    public override async ValueTask TransformRequestAsync(HttpContext httpContext, HttpRequestMessage proxyRequest, string destinationPrefix, CancellationToken cancellationToken)
    {
        // 转发所有头部信息
        await base.TransformRequestAsync(httpContext, proxyRequest, destinationPrefix, cancellationToken);
        // 自定义查询query 值
        var queryContext = new QueryTransformContext(httpContext.Request);
        queryContext.Collection.Remove("param1");
        queryContext.Collection["s"] = "xx2";
        // 分配自定义 URI。在此处连接时请注意额外的斜杠。RequestUtilities.MakeDestinationAddress 是一个安全的默认值。
        proxyRequest.RequestUri = RequestUtilities.MakeDestinationAddress("http://localhost:5047", httpContext.Request.Path, queryContext.QueryString);
        // 禁止原始请求标头,使用目标 Uri 中的标头
        proxyRequest.Headers.Host = null;
    }
}

上述示例中,我们使用了 YARP 的直接转发模式,不需要添加 YARP 服务和中间件,但是要添加 这个东西 AddHttpForwarder,然后配置 自定义请求转换 类。并开启 压缩模式为 GZip。

如果想看效果记得使用fiddle 抓取请求的返回值查看原始请求,因为postman和浏览器客户端 都会默认对常用的压缩格式的数据进行解压缩。

如果服务器本身支持压缩,请使用 基于服务器的压缩技术。而 HTTP.sys 服务器和 Kestrel 服务器 是不支持压缩技术的,所以这时候才考虑使用 压缩中间件。

总结

本章我们介绍了 YARP 的缓存和压缩功能,其实也都是 .NET 自身的功能,如果了解使用过 .NET的 缓存 和 压缩 中间件很容易就能理解。本章示例代码已上传GitHub,建议把代码down下来自己实验一下,再去配合理解。

有什么问题欢迎留言交流。

下篇文章我们继续介绍 YARP 的健康检查功能。文章来源地址https://www.toymoban.com/news/detail-746292.html

到了这里,关于Welcome to YARP - 6.压缩、缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux系统开机出现 “welcome to emergency mode!”已解决

    1.问题出现原因及描述 在我编写完 /etc/fstab文件之后   当我尝试为linux系统增加一个新的分区时,在永久挂载之后,重启系统发现,进入了如下界面, 出现 \\\"Authorization not available. Check if polkit service is running or see debug message for more informationd\\\" \\\"welcome to emergency mode!\\\" 发现就算输入

    2024年02月05日
    浏览(44)
  • nginx-反向代理缓存

    反向代理缓存相当于自动化动静分离。 将上游服务器的资源缓存到nginx本地,当下次再有相同的资源请求时,直接讲nginx缓存的资源返回给客户端。 本地缓存资源有一个过期时间,当超过过期时间,则重新向上游服务器重新请求获取资源。 这样减轻了上游服务器的资源请求负

    2024年02月09日
    浏览(34)
  • Squid 缓存代理--反向代理

    反向代理 :如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端:否则反向代理服务器将向后台的WEB服务器请求资源,然后将请求的应答返回给客户端,同时也将应答缓存在本地,供下一个请求者使用。 缓存网页对象,减少重复请求 将互联

    2024年02月12日
    浏览(37)
  • Spring-缓存初步认识

    缓存是一种介于数据永久存储介质和数据应用之间的数据临时存储介质 缓存有效提高读取速度,加速查询效率 添加依赖 添加使用缓存的注解 使用缓存,将当前操作结果写入缓存 这里的cacheSpace 表示缓存控件,然后可以从形参中读取id查询所需要的值 使用CachePut注解 每次生成

    2024年02月16日
    浏览(37)
  • 认识YOLOv5模型结构目录

    接上篇【文献解读】“MOBILEViT:轻量级、通用目的、移动友好的视觉变换器”。-CSDN博客 YOLOv5是一个流行的机器学习模型,用于目标检测任务。根据您希望提升或修改的内容,改进YOLOv5可以涉及多个方面: 模型架构(位于 /models ): 如果希望改变YOLOv5的架构,需要修改通常

    2024年01月21日
    浏览(35)
  • Varnish开源HTTP反向代理缓存服务器

    第三阶段基础 时  间:2023年6月13日 参加人:全班人员 内  容: Varnish 目录 Varnish 端口号:TCP/6081  TCP/6082 配置文件:/etc/varnish/default.vcl 安装部署: 测试功能: Varnish是一个高性能的 开源HTTP反向代理缓存服务器 ,它可以加速动态内容的交付并降低服务器的负载。 Varnish常被

    2024年02月10日
    浏览(530)
  • 【代理服务器】Squid 反向代理与Nginx缓存代理

    如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的 Web 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。 缓存网页对象,减少重复请求 将互联网请求

    2024年02月12日
    浏览(53)
  • React框架课时二认识项目的结构目录一

    ├── README.md 使用方法的文档 ├── node_modules 所有的依赖安装的目录 ├── package-lock.json 锁定安装时的包的版本号,保证团队的依赖能保证一致。 ├── package.json ├── public 静态公共目录 └── src 开发用的源代码目录 2 图片的演示如图所示 README.md 使用方法的文档

    2024年02月02日
    浏览(76)
  • 13. 从零用Rust编写正反向代理, HTTP中的压缩gzip,deflate,brotli算法

    wmproxy 是由 Rust 编写,已实现 http/https 代理, socks5 代理, 反向代理,静态文件服务器,内网穿透,配置热更新等, 后续将实现 websocket 代理等,同时会将实现过程分享出来, 感兴趣的可以一起造个轮子法 gite: https://gitee.com/tickbh/wmproxy github: https://github.com/tickbh/wmproxy HTTP中压

    2024年02月02日
    浏览(43)
  • nginx反向代理之缓存 客户端IP透传 负载均衡

    缓存功能可以加速访问,如果没有缓存关闭后端服务器后,图片将无法访问,缓存功能默认关闭,需要开启。 相关选项: 实验:为代理服务器开启缓存功能 ① 代理服务器主配置文件的http模块中添加配置 ② 子配置文件添加配置 ③是否有缓存 在另一台配置拖入图片 浏览器检

    2024年03月15日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包