分布式应用程序很复杂,给开发人员调试和修复生产问题带来了一系列挑战。尽管微服务架构可帮助维持一支规模较小,可以自主工作并专注于独立业务团队,但由于其分布式性质,它带来了新的挑战。例如,在业务交易过程中出现问题的情况下,需要端到端跟踪请求,该请求可能跨越多个服务和基础架构。 解决问题时可能遇到的挑战有:

  • 管理已知和未知故障
  • 故障也是分布式的
  • 传统监控系统不适用

这是可监测性和可观察性出现的地方。可监测性记录应用程序的总体运行状况,而可观察性则可以帮助您更深入地了解上下文数据。在.NET大会上,我和Cecil 已经深入讨论了云原生应用程序中的可监测性和可观察性。

观看视频

以上视频中,我们着眼于可观察性和可监测性的关键点,例如日志(Logging),衡量指标(Metrics),链路追踪(Tracing),并深入分析了运行状况检查(Health checks)。

以下是视频中讨论的一些基本概念:

运行状况检查(Health checks)

微服务实现了运行状况检查,最理想的情况是使用HTTP endpoints,以便各种实时监控系统可以查询状态。 运行状况检查端点至少应做出以下响应:

  • 系统正在运行吗?
  • 它可以执行任务吗?

在Kubernetes世界中,这些分别直接转换为liveness和readiness。 它们定义在Kubernetes的YAML部署配置文件中。

  • liveness路径是Kubernetes定期查询以检查故障的端点。 Kubernetes提供了liveness探针来监测失败的应用程序,并在它们不返回成功代码时重新启动它们。
  • readiness路径是Kubernetes查询以了解服务何时就绪,可以开始接受流量的终端。 当所有注册的检查都成功时,它将返回HTTP状态代码200。

ASP.NET Core提供用于向可监测性系统报告运行状况的中间件和库,来提供运行状况检查。 相关文档请查阅ASP.NET Core中的运行状况检查

日志

无论您使用什么工具调查生产环境中的问题,最终都会是以日志的形式反应问题的根本原因。 在分布式环境中,您需要确保日志记录包含有助于调试的深入信息。 可以从一个集中的地方查询它们。 每个日志记录都需要有一个关联ID,以便进行跟踪以了解全局。

结构化日志

使用结构化日志,您可以将序列化的对象添加到日志中,日志监视系统可以高效地查询这些对象。 例如,您可以根据customerID或trasnsactionID查询整个事务日志。 在ASP.NET Core应用程序中,可以使用提供结构化日志记录的Serilog。请查阅.NET Core和ASP.NET Core中的日志入门,以及Serilog了解结构化日志。

集中式日志和关联ID

在传统应用程序中,日志文件存储在本地计算机上。在分布式环境中,把日志记录在某一台计算机中的纯文本文件中是没有帮助的。生成日志的应用程序可能无法访问本地磁盘,或者当容器在虚拟机中移动时,本地磁盘可能是高度瞬态的。由于在Cloud-native应用程序中使用基于文件的日志会遇到一些问题,因此首选集中式日志。日志由应用程序收集并传送到一个集中的日志应用程序,该应用程序对日志进行索引和存储。这类系统每天可以接收数十GB的日志。Serilog提供了向集中式系统(如Azure Application Insights,Azure Monitor的一项功能)写入日志事件的接收器。在构建跨多个服务的日志记录时,遵循一些标准做法也很有帮助。例如,在事务开始时生成一个关联ID,然后将其记录到与该事务相关的每条消息中,这样可以更容易地从集中式日志系统中搜索所有相关消息。

分布式跟踪

分布式跟踪等效于现代云和微服务体系结构的调用堆栈,并添加了性能分析器。分布式跟踪或分布式请求跟踪有助于端到端查看请求,并使您能够从整体上识别问题。跟踪可以为您提供有关问题的详细答案,例如事件发生在什么时候?它花了多少时间?为什么要花这么长时间?哪些微服务处理了它?等等,像openzipkin / zipkin之类的开源分布式跟踪系统,在该领域非常流行。

为您的应用程序启用分布式跟踪就跟将相应的分布式跟踪提供商的SDK添加到每个微服务中一样简单。例如,在您的应用中安装并配置了Application Insights SDK后,SDK依赖关系自动收集器会自动收集流行框架,库和技术的跟踪信息。

在几个不同的系统和工具之间,需要有一套标准以便于观察。OpenTelemetry标准化了不同的应用程序和框架如何收集和发出可观测性遥测。OpenTelemetry提供了一个与供应商无关的规范、一组api、sdk和工具以及用于可观测性遥测(分布式跟踪、度量等)的集成。查看博客文章OpenTelemetry .net reachs v1.0以获取详细信息。

动手模块

我们已经构建了一系列模块来帮助您学习构建.NET微服务和云原生技术。 查看以下模块,这些模块将帮助您了解可监测性和可观察性相关技术。

最新文章

  1. qt 标准对话框
  2. CSS3系列二(媒体支持、文字与字体相关样式、盒相关样式)
  3. Spring Transaction属性之Propagation
  4. ACM HDU 2674 N! Again(数论)
  5. 标量类型(scalar)
  6. Android源码之Gallery专题研究(1)
  7. 实时Android语音对讲系统架构
  8. 【前端】Vue2全家桶案例《看漫画》之番外篇、express上传漫画(可选)
  9. Uva 437 巴比伦塔 && UVA10003
  10. LOJ #2116 Luogu P3241「HNOI2015」开店
  11. js限制字符串长度,超出的部分补...
  12. 【转】傅盛:一家公司最大瓶颈就是CEO
  13. Nginx 安装后 相关错误解决
  14. 51Nod1675 序列变换 数论 莫比乌斯反演
  15. CSS| 學習心得
  16. 在Android源码树中添加userspace I2C读写工具(i2c-util)
  17. 【pycharm】在pycharm上,使用python的pip安装tensorflow过程
  18. KCP 传输协议
  19. 剑指offer面试题3二维数组中的查找
  20. selenium测试(Java)-- 验证信息(八)

热门文章

  1. (十七)VMware Harbor 垃圾清理
  2. 2. IntelliJ Idea 常用快捷键列表
  3. Andy‘s First Dictionary UVA - 10815
  4. Unity 协程(Coroutine)原理与用法详解
  5. 753. Cracking the Safe
  6. Rsync多模块复制、排除指定文件及目录以及数据无差异复制的应用实例
  7. Redis 面试必备知识点
  8. 十步解决php utf-8编码
  9. OPPO R11S识别不到ADB Device
  10. hdu4560 不错的建图,二分最大流