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

Welcome to YARP - 2.配置功能

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 的学习就先告一段落了。还有很多省略的章节(比如:中间件、HTTPS和TLS、GRPC等等)。想要了解更多的小伙伴可以自己去官网的文档了解。

介绍

在介绍 YARP 的分布式跟踪之前,我们先来了解一下什么是分布式跟踪。

当我们构建大型的应用程序或系统时,通常会将其拆分成多个部分,这些部分可能运行在不同的计算机或进程中。这种分布式架构有助于提高系统的可伸缩性和性能,但也增加了故障诊断的难度。分布式跟踪就像是应用程序的侦探工具,可以帮助工程师找出应用程序中的问题,特别是那些可能横跨多个计算机或进程的问题。

举个例子,假设我们有一个典型的网页服务,用户发送请求后,这个请求可能经过负载均衡器,然后传递给后端的Web服务器进程,最后可能会涉及数据库的多次查询。使用分布式跟踪,就像我们在调查一桩案件一样,工程师可以追踪整个请求的过程。他们能够分辨每个步骤是否成功,每个步骤花费了多少时间,甚至可以记录每个步骤产生的详细信息。

作为 ASP.NET Core 的组件,YARP 可以像任何其他 Web 应用程序一样轻松集成到不同的跟踪系统中。可以使用以下程序配置分布式跟踪,详情参考:

.NET 具有对分布式跟踪的内置可配置支持,YARP 利用这些支持来启用此类现成方案。

使用自定义跟踪标头

在使用 .NET 不原生支持的传播机制时,需要创建一个专门的传播器(DistributedContextPropagator)来处理该机制的上下文信息传递。

YARP 会移除 DistributedContextPropagator.Fields( 这是DistributedContextPropagator中的一个属性或字段,用于存储与上下文传播相关的信息 ) 中的任何标头,以便在 Inject 调用期间,传播器可以重新添加它们到请求中。 这个步骤是为了在整个传播过程中有效地管理标头信息,以确保它们被适当地处理和传递。

透传代理

如果不希望代理主动参与跟踪,并希望保留所有跟踪标头,您可以通过将SocketsHttpHandler.ActivityHeadersPropagator 设置为null来实现。这表示代理将保持对跟踪标头的透明传递,而不会主动干预。

services.AddReverseProxy()
.ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);

示例

1.创建项目

dotnet new web -n YARP.Metrics -f net6.0

2.添加项目引用

<ItemGroup>
<PackageReference Include="Yarp.Telemetry.Consumption" Version="2.1.0" />
</ItemGroup>

这个是 YARP 提供的库,用来监听代理操作的各个阶段,从而收集有关请求处理的详细信息和性能指标。

在内部,YARP 使用 EventSource 来收集来自许多用于处理请求的子系统的遥测事件和指标。

要监听这些指标,需要在 DI(依赖注入)中注册实现每个功能接口的类。以下是该类库提供的功能:

功能概述:

  1. Proxy(代理):代表整个代理操作,包括成功或失败。

    • 事件包括:

      • 代理请求的启动和停止时
      • 请求/响应主体处理时
    • 指标包括:
      • 启动的请求数量
      • 进行中的请求数量
      • 失败的请求数量
  2. Kestrel:处理传入请求的 Web 服务器。
    • 事件包括:

      • 请求的启动/停止或失败时
    • 指标包括:
      • 连接速率 - 每秒打开的连接数
      • 总连接数
      • TLS 握手次数
      • 入站队列长度
  3. Http:用于向目标服务器发出出站请求的 HttpClient。
    • 事件包括:

      • 连接创建时
      • 请求的启动/停止或失败时
      • 标头/内容发送/接收时
      • 请求在连接可用时出队列时
    • 指标包括:
      • 启动的出站请求数量
      • 失败的请求数量
      • 活动请求数量
      • 出站连接数量
  4. Sockets:涉及连接尝试的事件和有关发送和接收的数据量的指标。
  5. NameResolution:涉及名称解析尝试的事件和有关目标的 DNS 查询的指标。
  6. NetSecurity:涉及 SslStream 握手的事件和有关每个协议的握手数量和延迟的指标。

3.关键文件

  • ForwarderTelemetryConsumer(监听来自代理遥测的事件,记录与代理请求处理的高级别过程相关的时序和信息。)
  • HttpClientTelemetryConsumer(监听来自 HttpClient 遥测的事件,记录与目标服务器的出站请求和响应相关的时序和信息。)
  • PerRequestMetrics(存储按每个请求计算的指标的类。实例在请求的整个生命周期内存储在 AsyncLocal 存储中。)
  • PerRequestYarpMetricCollectionMiddleware(处理请求的第一步和最后一步。它初始化每个请求的指标,并在请求结束时记录结果。)

4.在DI中注册

using YARP.Metrics;

var builder = WebApplication.CreateBuilder(args);

var services = builder.Services;

services.AddControllers();

services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); services.AddHttpContextAccessor(); // 用于收集有关代理转发的常规指标的接口
services.AddMetricsConsumer<ForwarderMetricsConsumer>(); // 将使用者注册到代理转发器遥测的事件
services.AddTelemetryConsumer<ForwarderTelemetryConsumer>(); // 将使用者注册到HttpClient遥测事件
services.AddTelemetryConsumer<HttpClientTelemetryConsumer>(); services.AddTelemetryConsumer<WebSocketsTelemetryConsumer>(); var app = builder.Build(); // 收集和报告代理度量的自定义中间件
// 放置在开头,因此它是每个请求运行的第一件也是最后一件事
app.UsePerRequestMetricCollection(); // 用于拦截WebSocket连接并收集暴露给WebSocketsTemetryConsumer的遥测的中间件
app.UseWebSocketsTelemetry(); app.MapReverseProxy(); app.Run();

5.Appsettings.json配置

{
"Logging": {
"LogLevel": {
"Default": "Information",
// "Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"route1": {
"ClusterId": "cluster1",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"cluster1/destination1": {
"Address": "https://www.baidu.com/"
}
}
}
}
}
}

5.运行项目

接下来我们运行项目,就可以看到代理请求的一些指标数据:

总结

到这里分布式跟踪篇章也已经结束了,它在分布式系统中尤为重要,可以分析性能瓶颈,定位错误和异常。而且收集的这些遥测数据(指标)可以导出到多种不同的后端存储或可视化工具中。比如:ZipkinJaegerPrometheus,这都是后话了。有兴趣的小伙伴自己研究吧。相关代码已上传Github,关键文件也都有注释。至此 YARP 的学习就先告一段落了。还有很多省略的章节(比如:中间件、HTTPS和TLS、GRPC等等)。想要了解更多的小伙伴可以自己去官网的文档了解。

Welcome to YARP - 8.分布式跟踪的更多相关文章

  1. Ocelot 集成Butterfly 实现分布式跟踪

    微服务,通常都是用复杂的.大规模分布式集群来实现的.微服务构建在不同的软件模块上,这些软件模块,有可能是由不同的团队开发.可能使用不同的编程语言来实现.有可能布在了几千台服务器,横跨多个不同的数据中心 ...

  2. Zipkin分布式跟踪系统介绍

    Zipkin是什么Zipkin分布式跟踪系统:它可以帮助收集时间数据,解决在microservice架构下的延迟问题:它管理这些数据的收集和查找:Zipkin的设计是基于谷歌的Google Dappe ...

  3. Centos下分布式跟踪工具Pinpoint的完整部署记录

    一.Pinpoint简单介绍Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统.分布式跟踪系统.一般来说,前端向后台发起一个查询请求,后台服务可能 ...

  4. 微服务之分布式跟踪系统(springboot+zipkin+mysql)

    通过上一节<微服务之分布式跟踪系统(springboot+zipkin)>我们简单熟悉了zipkin的使用,但是收集的数据都保存在内存中重启后数据丢失,不过zipkin的Storage除了 ...

  5. 基于SkyWalking的分布式跟踪系统 - 环境搭建

    前面的几篇文章我们聊了基于Metrics的监控Prometheus,利用Prometheus和Grafana可以全方位监控你的服务器及应用的性能指标,在出现异常时利用Alertmanager告警及时通 ...

  6. 基于SkyWalking的分布式跟踪系统 - 微服务监控

    上一篇文章我们搭建了基于SkyWalking分布式跟踪环境,今天聊聊使用SkyWalking监控我们的微服务(DUBBO) 服务案例 假设你有个订单微服务,包含以下组件 MySQL数据库分表分库(2台 ...

  7. 基于SkyWalking的分布式跟踪系统 - 异常告警

    通过前面2篇文章我们搭建了SW的基础环境,监控了微服务,能了解所有服务的运行情况.但是当出现服务响应慢,接口耗时严重时我们需要立即定位到问题,这就需要我们今天的主角--监控告警,同时此篇也是SW系列的 ...

  8. springCloud学习6(Spring Cloud Sleuth 分布式跟踪)

    springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 前言   在第四篇和第五篇中提到一个叫关联 id的东西,用这个东西来 ...

  9. 云原生 - Istio可观察性之分布式跟踪(三)

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...

  10. 分布式跟踪的一个流行标准是OpenTracing API,该标准的一个流行实现是Jaeger项目。

    https://github.com/jaegertracing/jaeger https://mp.weixin.qq.com/s/-Tn2AgyHoq8pwMun8JHcGQ Jaeger的深入分 ...

随机推荐

  1. 【pandas小技巧】--按类型选择列

    本篇介绍的是pandas选择列数据的一个小技巧.之前已经介绍了很多选择列数据的方式,比如loc,iloc函数,按列名称选择,按条件选择等等. 这次介绍的是按照列的数据类型来选择列,按类型选择列可以帮助 ...

  2. 「Go笔记-02」变量、数据类型、数据类型间转换、进制转换...看这一篇就Go了

    前言 一个程序就是一个世界,不论是使用哪种高级程序语言编写程序, 变量都是其程序的基本组成单位, 变量 在 go 中 变量是用于存储数据的命名空间(内存位置),它可以表示一个值,这个值在程序执行过程中 ...

  3. 【io_uring】liburing 用户库源码分析

    文章目录 整体流程 `io_uring_queue_init` `io_uring_get_sqe` `io_uring_prep_#OP` `io_uring_sqe_set_data` `io_u ...

  4. Pandas 使用教程 Series、DataFrame

    目录 Series (一维数据) 指定索引值 使用 key/value 对象,创建对象 设置 Series 名称参数 DataFrame(二维数据) 使用字典(key/value)创建 loc 属性返 ...

  5. 2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中连续的一段全变成0,你希望数组整体的累加和尽可能大。 你有两个魔法卷轴,

    2023-08-30:用go语言编写.两个魔法卷轴问题. 给定一个数组arr,其中可能有正.负.0, 一个魔法卷轴可以把arr中连续的一段全变成0,你希望数组整体的累加和尽可能大. 你有两个魔法卷轴, ...

  6. 细数2019-2023年CWE TOP 25 数据,看软件缺陷的防护

    本文分享自华为云社区<从过去5年CWE TOP 25的数据看软件缺陷的防护>,作者:Uncle_Tom. "以史为鉴,可以知兴替".CWE 已经连续5年发布了 CWE ...

  7. Pycharm包推荐|自动检查shell脚本问题的包

    如图,这个包自动会检测出哪块代码编写有问题,自动提示,这里可以根据提示进行修改,快速高效!!! 包的名字如图:Shell script formatter 太香了

  8. Python 搭建 FastAPI 项目

    一般网上的文章都是以脚本的方式写Demor的,没找到自己想要的那种项目结构型的示例(类似Java SpringBoot 创建 Model,通过 pom 进行关联配置的那种) 看了一些源码,再结合自己的 ...

  9. 在.NET 8 RC1 版本中 MAUI、ASP.NET Core 和 EF8 的新特性

    从年初2 月份发布第一个预览版,经历7个预览版后,Microsoft 西雅图时间9月13日发布了 .NET 8  RC 1: https://devblogs.microsoft.com/dotnet ...

  10. xftp 7必须更新最新版本怎么解决

    下载可以查看16进制的软件: Sublime Text 运行XFTP7 双击打开是:这样的 解决方案 用Sublime Text进行打开nslicense.dll, 打开之后查找"0f88 ...