ASP.NET Core微服务之基于Ocelot+Butterfly实现分布式追踪

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Tip: 此篇已加入.NET Core微服务基础系列文章索引一、什么是Tracing?  微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错误和异常,我们只要盯住一个点,就可以快速定位和处理问题,但是在微服务的架构下,大部分功能模块都...

Tip: 此篇已加入.NET Core微服务基础系列文章索引

一、什么是Tracing?

  微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错误和异常,我们只要盯住一个点,就可以快速定位和处理问题,但是在微服务的架构下,大部分功能模块都是单独部署运行的,彼此通过总线交互,都是无状态的服务,这种架构下,前后台的业务流会经过很多个微服务的处理和传递,我们会面临以下问题:

  • 分散在各个服务器上的日志怎么处理?
  • 如果业务流出现了错误和异常,如何定位是哪个点出的问题?
  • 如何快速定位问题?
  • 如何跟踪业务流的处理顺序和结果?

  以前在单应用下的日志监控很简单,在微服务架构下却成为了一个大问题,如果无法跟踪业务流,无法定位问题,我们将耗费大量的时间来查找和定位问题,在复杂的微服务交互关系中,我们就会非常被动。因此,我们需要对其进行追踪,而这个时候Google公司广泛使用了分布式集群,为了应对自身大规模的复杂集群环境,Google公司研发了Dapper分布式跟踪系统,并发表了论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,给行业内分布式跟踪的实现提供了非常有价值的参考,该论文也成为了当前分布式跟踪系统的理论基础。

对于基础理论,这里涉及到OpenTracing,推荐看看吴晟的翻译的《OpenTracing文档中文版》。

二、Butterfly的基本使用

2.1 Butterfly简介

Butterfly是一个使用Open Tracing规范来设计追踪数据的开源追踪组件,作者Lemon,也是AspectCore的作者。目前Ocelot已集成Butterfly,我们只需要做很少的配置即可对经过网关的所有API服务进行Tracing。不过,貌似Lemon已不打算继续维护Butterfly而是推荐使用Apache SkyWalking来做生产环境的分布式追踪,同时他也加入了SkyWalking团队共同进行SkyWalking在多语言生态的推动。不过,就学习而言,Butterfly是比较适合学习来了解分布式追踪是个神马玩意儿的,这里呢我暂时不再去学习ApacheSkyWalking了(因为我的目标是了解整个流程,做POC而不是能上生产环境的产品)。

  这里是SkyWalking-netcore的GitHub地址:https://github.com/OpenSkywalking/skywalking-netcore

2.2 Butterfly的安装与配置

  Step1.下载最新的release,目前是preview-0.0.8

  Step2.解压并通过命令启动:dotnet Butterfly.Web.dll --EnableHttpCollector=true

  Step3.通过默认地址和端口进行查看,如下图所示:(这里没有任何trace,因为还没有任何请求)

三、结合Ocelot的一个Tracing实例

3.1 Ocelot的配置

  刚刚说到Ocelot已内集成了Butterfly,所以我们只需要做以下两个配置:

  (1)配置文件配置UseTracing

    "ReRoutes": [
    // API01:CAS.ClientService
    // --> service part
    {
      ......  
      "HttpHandlerOptions": {
        "UseTracing": true // use butterfly to tracing request chain
      },
      ......
    },
    // API02:CAS.ProductService
    // --> service part
    {
      ......
      "HttpHandlerOptions": {
        "UseTracing": true // use butterfly to tracing request chain
      },
      ......
    }

  (2)StartUp类中启用OpenTracing

    public void ConfigureServices(IServiceCollection services)
    {
        // Ocelot
        services.AddOcelot(Configuration)
            .AddOpenTracing(option =>
            {
                option.CollectorUrl = Configuration["TracingCenter:Uri"];
                option.Service = Configuration["TracingCenter:Name"];
            });
        ......
    }

  json配置文件了配置了Butterfly的Url地址及其显示名:

  "TracingCenter": {
    "Uri": "http://192.168.80.1:9618", // Tracing Center Address
    "Name": "API Gateway" // Display Name
  }

3.2 案例结构与配置

  这里我们模拟一个ASP.NET Core MVC Web应用程序中要请求一个ClientService的某个接口,而这个接口又依赖于ProductService的一个接口的返回结果,因此这个请求的请求顺序就如上图所示(标有序号),流程很简单,下面我们就来一一为MVC WebApp、ClientService和ProductService进行Butterfly的配置。

  这里我们通过介绍MvcApp的配置(事先创建一个ASP.NET Core MVC应用程序)来说明如何安装和配置Buttefly,至于ClientService和ProductService和MvcApp的安装配置步骤一样,就不再赘述。

  (1)NuGet安装Butterfly Client

NuGet>Install-Package Butterfly.Client.AspNetCore

  *.这里建议安装0.0.7版本,0.0.8版本测试时始终无法获取请求。

  (2)注册Butterfly

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // Tracing - Butterfly
        services.AddButterfly(option =>
        {
            option.CollectorUrl = Configuration["TracingCenter:Uri"];
            option.Service = Configuration["TracingCenter:Name"];
        });
        services.AddSingleton<HttpClient>(p => new HttpClient(p.GetService<HttpTracingHandler>()));
    }

  这里一起注入了加入了HttpTracingHandler的HttpClient,用来在Controller中调用其他服务接口。

  (3)修改Controller中的Action,使其调用ClientService的一个接口:

    public class HomeController : Controller
    {
        private string gatewayUri;

        public HomeController(IConfiguration configuration)
        {
            gatewayUri = $"http://{configuration["Gateway:IP"]}:{configuration["Gateway:Port"]}";
        }

        ......

        public IActionResult About([FromServices]HttpClient httpClient)
        {
            var requestResult = httpClient.GetStreamAsync($"{gatewayUri}/api/clientservice/trace").GetAwaiter().GetResult();

            ViewData["Message"] = $"Your request data result : {requestResult}";

            return View();
        }

        ......
    }

  (4)在ClientService中,调用ProductService的一个接口:

    [Route("api/Trace")]
    public class TraceController : Controller
    {
        private string gatewayUri;

        public TraceController(IConfiguration configuration)
        {
            gatewayUri = $"http://{configuration["Gateway:IP"]}:{configuration["Gateway:Port"]}";
        }

        [HttpGet]
        public string Get([FromServices]HttpClient httpClient)
        {
            var result = httpClient.GetStringAsync($"{gatewayUri}/api/productservice/values").GetAwaiter().GetResult();

            return $"ProductService AccessTime: {DateTime.Now.ToString()}, Result: {result}";
        }
    }

  (5)在ProductService中,提供这样的一个接口,返回一些测试字符串

    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        // GET api/values
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "ProductService-value1", "ProductService-value2" };
        }

        ......
    }

3.3 简单测试

  (1)浏览器中访问MvcWebApp的About页面

  (2)在Butterfly Web页面查看Trace

  上图我们可以看到总花费时间,经历了哪些节点等信息。

  上图我们可以看出调用的顺序,依次经历哪些节点,花费时间,占比等等。

  (3)在Butterfly Web页面查看Dependencies

  上图我们可以直观地看出这个请求的处理流程(MvcApp->API Gateway->ClientService->API Gateway->ProductService),经过了哪些节点,像API Gateway和ClientService就有一个双向连接,代表各自请求对方。

四、小结

  本篇首先介绍了一下追踪(Tracing)的背景以及基本概念,然后介绍了一下一个开源的分布式追踪组件Butterfly,由于Ocelot已经集成了Butterfly,所以我们可以很方便地在Ocelot中使用Butterfly进行追踪。最后,通过一个具体的小实例,介绍了如何在ASP.NET Core微服务环境中如何使用Ocelot+Butterfly进行请求的追踪。不过,Butterfly的作者Lemon已不打算继续维护Butterfly而是推荐使用Apache SkyWalking来做生产环境的分布式追踪,同时他也加入了SkyWalking团队共同进行SkyWalking在多语言生态的推动。所以,学习环境下,可以拿Butterfly了解一下分布式追踪的意义,但是要上实际环境,可以考虑用以下SkyWalking。后续,有机会的话,我也会用SkyWalking来替代Butterfly做追踪,到时有机会也分享一下。

示例代码

  Click Here => 点我下载

参考资料

作者不详,《微服务架构下,如何实现分布式跟踪?

吴晟,《OpenTracing文档中文版

桂素伟,《Ocelot中使用Butterfly实践

张善友,《Ocelot集成Butterfly实现分布式追踪

Butterfly Github:https://github.com/liuhaoyang/butterfly => 作者Lemon,也是AspectCore的作者

目录
相关文章
|
1月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
51 5
|
17天前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
40 1
|
2月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
56 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
1月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
37 3
|
23天前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
46 0
|
1月前
|
存储 运维 数据可视化
如何为微服务实现分布式日志记录
如何为微服务实现分布式日志记录
89 1
|
3月前
|
消息中间件 存储 负载均衡
微服务与分布式系统设计看这篇就够了!
【10月更文挑战第12天】 在现代软件架构中,微服务和分布式系统设计已经成为构建可扩展、灵活和可靠应用程序的主流方法。本文将深入探讨微服务架构的核心概念、设计原则和挑战,并提供一些关于如何在分布式系统中实现微服务的实用指导。
128 2
|
3月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
2月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
166 6
|
2月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
64 1