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的作者

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

.NET Core微服务之基于Ocelot+Butterfly实现分布式追踪的更多相关文章

  1. .NET Core微服务之基于Ocelot实现API网关服务

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...

  2. .NET Core微服务之基于Ocelot实现API网关服务(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...

  3. .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.案例结构总览 这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要通过API网关(这里API网关始终作为 ...

  4. .NET Core微服务二:Ocelot API网关

    .NET Core微服务一:Consul服务中心 .NET Core微服务二:Ocelot API网关 .NET Core微服务三:polly熔断与降级 本文的项目代码,在文章结尾处可以下载. 本文使 ...

  5. .NET Core 微服务—API网关(Ocelot) 教程 [二]

    上篇文章(.NET Core 微服务—API网关(Ocelot) 教程 [一])介绍了Ocelot 的相关介绍. 接下来就一起来看如何使用,让它运行起来. 环境准备 为了验证Ocelot 网关效果,我 ...

  6. .NET Core 微服务—API网关(Ocelot) 教程 [三]

    前言: 前一篇文章<.NET Core 微服务—API网关(Ocelot) 教程 [二]>已经让Ocelot和目录api(Api.Catalog).订单api(Api.Ordering)通 ...

  7. .NET Core微服务之基于Exceptionless实现分布式日志记录

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Exceptionless极简介绍 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,AS ...

  8. .NET Core微服务之基于Consul实现服务治理

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...

  9. .NET Core微服务之基于Consul实现服务治理(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...

随机推荐

  1. Linux ftp访问控制配置,包括访问ftp权限和访问ftp目录权限

    在Linux 上建立用户为website1 home目录是/data/home/website1 但是用ftp登录以后,路径可以随便切换,并且可以进入别的站点下 进行增.删.改 本篇的目的是:在lin ...

  2. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  3. 基于MAC OS 操作系统安装、配置mysql

    $ sudo mv mysql-5.1.45-osx10.6-x86_64 /usr/local/mysql$ cd /usr/local$ sudo chown -R mysql:mysql mys ...

  4. 动态追加js

    判断是否已引用js,如果没有会引发异常,在异常时添加引用 try { if (layui) {} } catch (ex) { var s = document.createElement('scri ...

  5. Qt 中的事件处理(二)

    1. 回顾事件传递的过程 ①源头:操作系统   操作系统检测到用户的动作时,就会产生一个系统消息,系统消息就会被发送到正在运行的Qt应用程序中, ②应用程序收到系统消息后, 他会将系统消息翻译成对应的 ...

  6. SIGCHLD信号

    SIGCHLD的产生条件 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 也就是说:子进程的运行状态发生变化就会发送SIGCHILD信号:这里的意思 ...

  7. 第三百二十六节,web爬虫,scrapy模块,解决重复ur——自动递归url

    第三百二十六节,web爬虫,scrapy模块,解决重复url——自动递归url 一般抓取过的url不重复抓取,那么就需要记录url,判断当前URL如果在记录里说明已经抓取过了,如果不存在说明没抓取过 ...

  8. kafka系列 -- 多线程消费者实现

    看了一下kafka,然后写了消费Kafka数据的代码.感觉自己功力还是不够. 不能随心所欲地操作数据,数据结构没学好,spark的RDD操作没学好. 不能很好地组织代码结构,设计模式没学好,面向对象思 ...

  9. JavaScript的深拷贝与浅拷贝

    深拷贝和浅拷贝是在面试中经常遇到的问题.今天在这里总结一下. 深拷贝与浅拷贝的问题,涉及到JavaScript的变量类型,先来说说变量的类型,变量类型包括基本类型和引用类型. 基本类型:Undefin ...

  10. vue.js使用之计算属性与方法返回的差别

    <!DOCTYPE html> <html> <head> <script src="https://unpkg.com/vue@2.4.2&quo ...