ASP.NET Core整合Zipkin链路跟踪的实现方法_应用技巧

来源:脚本之家  责任编辑:小易  

http://ps.onegreen.org/photoshop/ShowSoftDown.asp?UrlID=1&SoftID=46绿色版的,我一直用~软件说明:“Adobe Photoshop CS3 Extended 绿色软件站增强版”是在Snear制作的“Adobe Photoshop CS3 Extended 免安装版(精简版)”的基础上,针对设计者和摄影爱好者的需求,增加了 6 组效果滤镜、1组去背滤镜、2 组数码后期处理滤镜和网上收集的 662个设计动作集合、 5 组“PAA数码照片后期处理动作合集”,加上Snear原来已经增加好的两组格式插件“Camera Raw 4.0 和 JPEG 2000 插件”和“解除打印钞票图像等的限制”,整合而成,嘿嘿...用它来进行摄影后期处理嘛,可谓得心应手、如虎添翼也。如果你对动作合集的使用不熟悉,可参考内附的“PAA使用说明.chm”文件。 下面对集成的插件作一说明:设计增强部分:1、AlienSkin Eye Candy 5 Nature 英文版:是一款包含10种Photoshop自然滤镜的套装。Eye Candy 4000的三个升级套装的第二版,模拟自然界中的火、烟、锈、雪、冰等效果。2、AlienSkin Eye Candy 5 Textures 汉化版:Alien Skin 公司最新的力作 Eye Candy 5 Textures 滤镜, 功能实在强大。无语言表。支持 PHOTOSHOP 6+、FIREWORKE MX、Paint Shop Pro 7+,其制作出来的纹理逼真效果令人叹为观止。本汉化版为“影子工作室”汉化,但原汉化版里的 Eye Candy 5 Textures Core.dll文件可能处理欠妥,导致最重要的预设文件无法使用,故将 Eye Candy 5 Textures Core.dll这个文件换回原版文件。在此,请“影子工作室”见谅。3、AlienSkin Eye Candy 4000 汉化版:这个就不用我多介绍了吧,内含反相、铬合金、闪耀、发光、阴影、HSB 噪点、水滴、水迹、挖剪、玻璃、斜面、烟幕、漩涡、~发、木纹、编织、星星、斜视、大理石、摇动、运动痕迹、溶化、火焰共23个特效滤镜。 本汉化版由“数码镜坛”的管理员fishs 汉化( http://www.digimirror.com)。4、AlienSkin Xenofex 2.0 汉化版:Alien公司最新的力作Xenofex滤镜套件中包含了14种功能强大的滤镜: Burnt Edges燃烧边缘(新)、Constellation星座、Cracks裂纹(新)、Crumple折皱、Electrify触电、Shatter粉碎、Flag旗帜、Lightning闪电、Little Fluffy Clouds絮云、Classic Mosaic经典马赛克(新)、Rip Open卷边(新)、Puzzle拼图、Stain污染、Television电视等,正好可以满足您对于特殊平面影像创作上的需求。可以支持PHOTOSHOP 6+、FIREWORKE MX、Paint Shop Pro 7+! 本汉化版为“影子工作室”汉化。5、AlienSkin Image Doctor 1.01 汉化版:fishs 汉化Image Doctor 是一款新型而强大的图片校正滤鏡。适用于Photoshop, Fireworks, Paint Shop Pro 和其他的图象编辑软件。Image Doctor 可以魔法般的移除污点和各种缺陷,快速修复过度压缩的JPEG文件, 和无缝替代不想要的细节和对象。ImageDoctor包含:Smart Fill((可以将大面积背景上的杂物去除) Scratch Remover(修复刮伤的图片) Spot Lifter(有去除皱纹等功能) JPEG Repair(修复因压缩而使图片质量下降的JPG文件)等几款滤镜。 6、KnockOut 2.0 汉化版:YC-周汉化Corel 公司出品的专业去背景软件,连极细的~发都能从复杂的背景中分离出来。专业一点的术语是制作「遮罩」,所谓的去背,指的是将特定的主体从背景中分离出来, 以便进行其它的后续设计。例如,将人物从风景照之中抽离出来,以便更换背景。 目前,其他的影像处理软件,例如 PhotoImpact、PhotoShop ...等,其实也都可以进行去背的作业,但却不及 Knockout 来得功能强大及便利。在 Corel Knockout 之中,若背景较为单纯时,我们只要定义 Inside 及 Outside 两个选取区域,再按一下处理( Process )钮,通常便能完成去背的作业。 其去背的准确、快速及方便、容易程度,可谓其它软件都难以望其项背!7、KPT 7.0 英文版这个宝贝就不用介绍了。效果滤镜中的极品,相信所有人都会知道它,但却只有少数人会用好它。8、662套增强动作:网上收集而来,可能是最全的动作集了,但可惜比较乱,没有归类整理,名称都是英文的(如果有那位好心人整理一下就好了),由于动作太多,我没有将它放到 \Presets\Actions 这个目录中(因为放到这个目录中的话,在选择时这些动作的名称会占据了整个屏幕还显示不完),而是另外放到“662套增强动作”这个目录中,需要的时候自己调用吧。 摄影增强部分:DCE Tools 1.0 (汉化:西风狂诗曲):DCE Tools for Photoshop Plugin是Mediachance公司出的一套photoshop的插件,包括CCD噪点修复、人像皮肤修缮(通常所说的人像磨皮)、智能色彩还原、曝光补偿、枕形失真修正、桶形失真修正,以及全局自动修缮7个插件 (s/n: 284195155541538 Unlock: 862991166572983)Kodak Eastman Digital 2.0 (汉化:drurain):Kodak Eastman Digital for Adobe Photoshop 是一套由柯达公司提供的 Photoshop 滤镜程序,分为四个组件: 1、DIGITAL GEM Professional 插件,给使用者们减轻8位或16位图像中讨厌的噪音和颗粒提供更多的控制和更佳的效果。 2、DIGITAL GEM Airbrush Professional 插件,给使用者一种迅捷和有力的方法来平滑肌肤的表面,而不用担心会破坏或影响到重要的脸部特征细节。 3、DIGITAL ROC Professional 插件,让使用者在纠正和恢复他们数码图像时候更多的控制并取得更好的效果。 4、DIGITAL SHO Professional 插件,给与用户提升他们的数码图像时候更多的控制并取得更好的效果。 与上述功能相近或相似的软件就有很多,更不用说是插件了,只不过是柯达公司的出品,所以还是值得看看的。汉化中非标注资源特别多,主要是一些提示信息,本人有选择的译了一些。这款插件还有一个怪脾气,图像尺寸太小,它就不工作;太大,它就叫你把显示器的分辨率调高一些。所以比较适合处理 800X600 到 1024X768 大小的大众尺寸图像。 PAA(制作整理者:阿明):是Photoshop Actions of Amin的简称,即由阿明(Amin)整理的数码照片后期处理PS动作合集。内含DC后期处理、DC整体处理、DC艺术效果、DC制作边框、DC反转片等五组动作合集。如果你不满足于这些滤镜,请到绿色软件站的 滤镜栏目(1000多兆的绿色滤镜插件目前正在整理上传中)中选择更多自己喜欢的滤镜,然后放到 Plug-ins 目录中即可。测试平台: Windows XP SP2, 不保证其它平台或其它系统下运行正常!使用方法:1. 解压缩到任意位置,先运行“!)绿化.bat”,然后运行 Photoshop.exe 即可。在绿化过程中要安装“Microsoft VC80 Support DLLs”,如果你的系统原来没有安装过,要安提示安装好,否则 Photoshop 无法正常运行。2. 要删除,运行“-)卸除.bat”,直接删除所有文件即可。3. 使用过程中有何问题,请到“绿色软件论坛(bbs.onegreen.net)”反馈,以便及时修正www.zgxue.com防采集请勿采集本网。

前言

    在日常使用ASP.NET Core的开发或学习中,如果有需要使用链路跟踪系统,大多数情况下会优先选择SkyAPM。我们之前也说过SkyAPM设计确实比较优秀,巧妙的利用DiagnosticSource诊断跟踪日志,可以做到对项目无入侵方式的集成。其实还有一款比较优秀的链路跟踪系统,也可以支持ASP.NET Core,叫Zipkin。它相对于SkyWalking来说相对轻量级,使用相对来说比较偏原生的方式,而且支持Http的形式查询和提交链路数据。因为我们总是希望能拥有多一种的解决方案方便对比和参考,所以接下来我们就来学习一下关于Zipkin的使用方式。

并通过使用基于向量的图像图层技术,支持任何尺寸图像的无缝整合,对基于ASP .NET、 input from devices like keyboard, mouse, stylus etc. ·使用者介面核心(UI core)- manag

Zipkin简介

Spring 进行整合。 二、如何在JSP中使用JSF JSF只有通过和JSP相结合,才能充分发挥它的功效。JSF是通过标签库和JSP进行集成的。标签库就相当于ASP.NET的服务端组

    Zipkin是由Twitter开源的一款基于Java语言开发的分布式实时数据追踪系统(Distributed Tracking System),其主要功能是采集来自各个系统的实时监控数据。该系统让开发者可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。它大致可以分为三个核心概念 首先是上报端,它主要通过代码的形式集成到程序中,用于上报Trace数据到Collector端。 Collector负责接收客户端发送过来的数据,保存到内存或外部存储系统中,供UI展示。 存储端可以是基于zipkin内存完全不依赖外部存储的In-Memory形式或依赖外部存储系统的形式,一般采用外部存储系统存储链路数据,毕竟内存有限。它可支持的存储数据库有MySQL、Cassandra、Elasticsearch。 UI负责展示采集的链路数据,及系统之间的依赖关系。

相对来说还是比较清晰的,如果用一张图表示整体架构的话,大致如下图所示(图片来源于网络)

在学习链路跟踪的过程中会设计到相关概念,我们接下来介绍链路跟踪几个相关的概念 TranceId,一般一次全局的请求会有一个唯一的TraceId,用于代表一次唯一的请求。比如我请求了订单管理系统,而订单管理系统内部还调用了商品管理系统,而商品管理系统还调用了缓存系统或数据库系统。但是对全局或外部来说这是一次请求,所以会有唯一的一个TraceId。 SpanId,虽然全局的来说是一次大的请求,但是在这个链路中内部间还会发起别的请求,这种内部间的每次请求会生成一个SpanId。 如果将整条链路串联起来的话,我们需要记录全局的TraceId,代表当前节点的SpanId和发起对当前节点调用的的父级ParentId。 然后基于链路跟踪的核心概念,然后介绍一下Zipkin衍生出来了几个相关概念 cs:Clent Sent 客户端发起请求的时间,比如 dubbo 调用端开始执行远程调用之前。 cr:Client Receive 客户端收到处理完请求的时间。 ss:Server Receive 服务端处理完逻辑的时间。

sr - cs = 请求在网络上的耗时ss - sr = 服务端处理请求的耗时cr - ss = 回应在网络上的耗时cr - cs = 一次调用的整体耗时

关于zipkin概念相关的就介绍这么多,接下来我们介绍如何部署Zipkin。

部署ZipKin

    关于Zipkin常用的部署方式大概有两种,一种是通过下载安装JDK,然后运行zipkin.jar的方式,另一种是基于Docker的方式。为了方便我采用的是基于Docker的方式部署,因为采用原生的方式去部署还需要安装JDK,而且操作相对比较麻烦。咱们上面说过,虽然Zipkin可以将链路数据存放到内存中,但是这种操作方式并不实用,实际使用过程中多采用ElasticSearch存储链路数据。所以部署的时候需要依赖Zipkin和ElasticSearch,对于这种部署形式采用docker-compose的方式就再合适不过了,大家可以在Zipkin官方Github中找到docker的部署方式,地址是https://github.com/openzipkin/zipkin/tree/master/docker,官方使用的方式相对比较复杂,下载下来docker-compose相关文件之后我简化了它的使用方式,最终修改如下

version: "3.6"services: elasticsearch: # 我使用的是7.5.0版本 image: elasticsearch:7.5.0 container_name: elasticsearch restart: always #暴露es端口 ports: - 9200:9200 environment: - discovery.type=single-node - bootstrap.memory_lock=true #es有内存要求 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 networks: default: aliases: - elasticsearch zipkin: image: openzipkin/zipkin container_name: zipkin restart: always networks: default: aliases: - zipkin environment: #存储类型为es - STORAGE_TYPE=elasticsearch #es地址 - ES_HOSTS=elasticsearch:9200 ports: - 9411:9411 #依赖es所以在es启动完成后在启动zipkin depends_on: - elasticsearch

通过docker-compose运行编辑后的yaml文件,一条指令就可以运行起来

<PackageReference Include="zipkin4net" Version="1.5.0" /><PackageReference Include="zipkin4net.middleware.aspnetcore" Version="1.5.0" />

其中-f是指定文件名称,如果是docker-compose.yml则可以直接忽略文件名称,当shell中出现如下界面

并且在浏览器中输入http://localhost:9411/zipkin/出现如图所示,则说明Zikpin启动成功

整合ASP.NET Core

ZipKin启动成功之后,我们就可以将程序中的数据采集到Zipkin中去了,我新建了两个ASP.NET Core的程序,一个是OrderApi,另一个是ProductApi方便能体现出调用链路,其中OrderApi调用ProductApi接口,在两个项目中分别引入Zipkin依赖包

<PackageReference Include="zipkin4net" Version="1.5.0" /><PackageReference Include="zipkin4net.middleware.aspnetcore" Version="1.5.0" />

其中zipkin4net为核心包,zipkin4net.middleware.aspnetcore是集成ASP.NET Core的程序包。然后我们在Startup文件中添加如下方法

public void RegisterZipkinTrace(IApplicationBuilder app, ILoggerFactory loggerFactory, IHostApplicationLifetime lifetime){ lifetime.ApplicationStarted.Register(() => { //记录数据密度,1.0代表全部记录 TraceManager.SamplingRate = 1.0f; //链路日志 var logger = new TracingLogger(loggerFactory, "zipkin4net"); //zipkin服务地址和内容类型 var httpSender = new HttpZipkinSender("http://localhost:9411/", "application/json"); var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer(), new Statistics()); var consoleTracer = new zipkin4net.Tracers.ConsoleTracer(); TraceManager.RegisterTracer(tracer); TraceManager.RegisterTracer(consoleTracer); TraceManager.Start(logger); }); //程序停止时停止链路跟踪 lifetime.ApplicationStopped.Register(() => TraceManager.Stop()); //引入zipkin中间件,用于跟踪服务请求,这边的名字可自定义代表当前服务名称 app.UseTracing(Configuration["nacos:ServiceName"]);}

然后我们在Configure方法中调用RegisterZipkinTrace方法即可。由于我们要在OrderApi项目中采用HttpClient的方式调用ProductAPI,默认zipkin4net是支持采集HttpClient发出请求的链路数据(由于在ProductApi中我们并不发送Http请求,所以可以不用集成一下操作),具体集成形式如下,如果使用的是HttpClientFactory的方式,在ConfigureServices中配置如下

public void ConfigureServices(IServiceCollection services){ //由于我使用了Nacos作为服务注册中心 services.AddNacosAspNetCore(Configuration); services.AddScoped<NacosDiscoveryDelegatingHandler>(); services.AddHttpClient(ServiceName.ProductService,client=> { client.BaseAddress = new Uri($"http://{ServiceName.ProductService}"); }) .AddHttpMessageHandler<NacosDiscoveryDelegatingHandler>() //引入zipkin trace跟踪httpclient请求,名称配置当前服务名称即可 .AddHttpMessageHandler(provider =>TracingHandler.WithoutInnerHandler(Configuration["nacos:ServiceName"])); services.AddControllers();}

如果是直接是使用HttpClient的形式调用则可以采用以下方式

using (HttpClient client = new HttpClient(new TracingHandler("OrderApi"))){}

然后我们在OrderApi中写一段调用ProductApi的代码

[Route("orderapi/[controller]")]public class OrderController : ControllerBase{ private List<OrderDto> orderDtos = new List<OrderDto>(); private readonly IHttpClientFactory _clientFactory; public OrderController(IHttpClientFactory clientFactory) { orderDtos.Add(new OrderDto { Id = 1, TotalMoney=222,Address="北京市",Addressee="me",From="淘宝",SendAddress="武汉" }); _clientFactory = clientFactory; } /// <summary> /// 获取订单详情接口 /// </summary> /// <param name="id">订单id</param> /// <returns></returns> [HttpGet("getdetails/{id}")] public async Task<OrderDto> GetOrderDetailsAsync(long id) { OrderDto orderDto = orderDtos.FirstOrDefault(i => i.Id == id); if (orderDto != null) { OrderDetailDto orderDetailDto = new OrderDetailDto { Id = orderDto.Id, TotalMoney = orderDto.TotalMoney, Address = orderDto.Address, Addressee = orderDto.Addressee, From = orderDto.From, SendAddress = orderDto.SendAddress }; //调用ProductApi服务接口 var client = _clientFactory.CreateClient(ServiceName.ProductService); var response = await client.GetAsync($"/productapi/product/getall"); var result = await response.Content.ReadAsStringAsync(); orderDetailDto.Products = JsonConvert.DeserializeObject<List<OrderProductDto>>(result); return orderDetailDto; } return orderDto; }}

在ProductApi中我们只需要编写调用RegisterZipkinTrace方法即可,和OrderApi一样,我们就不重复粘贴了。因为ProductApi不需要调用别的服务,所以可以不必使用集成HttpClient,只需要提供简单的接口即可

[Route("productapi/[controller]")]public class ProductController : ControllerBase{ private List<ProductDto> productDtos = new List<ProductDto>(); public ProductController() { productDtos.Add(new ProductDto { Id = 1,Name="酒精",Price=22.5m }); productDtos.Add(new ProductDto { Id = 2, Name = "84消毒液", Price = 19.9m }); } /// <summary> /// 获取所有商品信息 /// </summary> /// <returns></returns> [HttpGet("getall")] public IEnumerable<ProductDto> GetAll() { return productDtos; }}

启动这两个项目,调用OrderApi的getdetails接口,完成后打开zipkin界面点击进去可查看链路详情

总结起来核心操作其实就两个,一个是在发送请求的地方,使用TracingHandler记录发起端的链路情况,然后在接收请求的服务端使用UseTracing记录来自于客户端请求的链路情况。

改进集成方式

    其实在上面的演示中,我们可以明显的看到明显的不足,就是很多时候其实我们没办法去设置HttpClient相关的参数的,很多框架虽然也是使用的HttpClient或HttpClientFactory相关,但是在外部我们没办法通过自定义的方式去设置他们的相关操作,比如Ocelot其实也是使用HttpClient相关发起的转发请求,但是对外我们没办法通过我们的程序去设置HttpClient的参数。还有就是在.Net Core中WebRequest其实也是对HttpClient的封装,但是我们同样没办法在我们的程序中给他们传递类似TracingHandler的操作。现在我们从TracingHandler源码开始解读看看它的内部到底是如何工作的,zipkin官方提供的.net core插件zipkin4net的源码位于

https://github.com/openzipkin/zipkin4net,我们找到TracingHandler类所在的位置[点击查看源码👈],由于TracingHandler本身就是DelegatingHandler的子类,所以我们主要看SendAsync方法,大致抽离出来如下

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken){ Func<HttpRequestMessage, string> _getClientTraceRpc = _getClientTraceRpc = getClientTraceRpc ?? (request => request.Method.ToString()); IInjector<HttpHeaders> _injector = Propagations.B3String.Injector<HttpHeaders>((carrier, key, value) => carrier.Add(key, value)); //记录发起请求客户端链路信息的类是ClientTrace using (var clientTrace = new ClientTrace(_serviceName, _getClientTraceRpc(request))) { if (clientTrace.Trace != null) { _injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers); } var result = await clientTrace.TracedActionAsync(base.SendAsync(request, cancellationToken)); //AddAnnotation是记录标签信息,我们可以在zipkin链路详情中看到这些标签 if (clientTrace.Trace != null) { //记录请求路径 clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_PATH, result.RequestMessage.RequestUri.LocalPath)); //记录请求的http方法 clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_METHOD, result.RequestMessage.Method.Method)); if (_logHttpHost) { //记录主机 clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_HOST, result.RequestMessage.RequestUri.Host)); } if (!result.IsSuccessStatusCode) { clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_STATUS_CODE, ((int)result.StatusCode).ToString())); } } return result; }}

实现方式比较简单,就是借助ClientTrace记录一些标签,其他的相关操作都是由zipkin4net提供的。我们在之前的文章.Net Core中的诊断日志DiagnosticSource讲解中层说道HttpClient底层会有发出诊断日志,我们可以借助这个思路,来对HttpClient进行链路跟踪埋点。

我们结合Microsoft.Extensions.DiagnosticAdapter扩展包定义如下类

public class HttpDiagnosticListener: ITraceDiagnosticListener{ public string DiagnosticName => "HttpHandlerDiagnosticListener"; private ClientTrace clientTrace; private readonly IInjector<HttpHeaders> _injector = Propagations.B3String.Injector<HttpHeaders>((carrier, key, value) => carrier.Add(key, value)); [DiagnosticName("System.Net.Http.Request")] public void HttpRequest(HttpRequestMessage request) { clientTrace = new ClientTrace("apigateway", request.Method.Method); if (clientTrace.Trace != null) { _injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers); } } [DiagnosticName("System.Net.Http.Response")] public void HttpResponse(HttpResponseMessage response) { if (clientTrace.Trace != null) { clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_PATH, response.RequestMessage.RequestUri.LocalPath)); clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_METHOD, response.RequestMessage.Method.Method)); clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_HOST, response.RequestMessage.RequestUri.Host)); if (!response.IsSuccessStatusCode) { clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_STATUS_CODE, ((int)response.StatusCode).ToString())); } } } [DiagnosticName("System.Net.Http.Exception")] public void HttpException(HttpRequestMessage request,Exception exception) { }}

ITraceDiagnosticListener是我们方便操作DiagnosticListener定义的接口,接口仅包含DiagnosticName用来表示DiagnosticListener监听的名称,有了这个接口接下来的操作我们会方便许多,接下来我们来看订阅操作的实现。

public class TraceObserver :IObserver<DiagnosticListener>{ private IEnumerable<ITraceDiagnosticListener> _traceDiagnostics; public TraceObserver(IEnumerable<ITraceDiagnosticListener> traceDiagnostics) { _traceDiagnostics = traceDiagnostics; } public void OnCompleted() { } public void OnError(Exception error) { } public void OnNext(DiagnosticListener listener) { //这样的话我们可以更轻松的扩展其他DiagnosticListener的操作 var traceDiagnostic = _traceDiagnostics.FirstOrDefault(i=>i.DiagnosticName==listener.Name); if (traceDiagnostic!=null) { //适配订阅 listener.SubscribeWithAdapter(traceDiagnostic); } }}

通过这种操作我们就无需关心如何将自定义的DiagnosticListener订阅类适配到DiagnosticAdapter中去,方便我们自定义其他DiagnosticListener的订阅类,这样的话我们只需注册自定义的订阅类即可。

services.AddSingleton<TraceObserver>();services.AddSingleton<ITraceDiagnosticListener, HttpDiagnosticListener>();

通过这种改进方式,我们可以解决类似HttpClient封装到框架中,并且我们我们无法通过外部程序去修改设置的时候。比如我们在架构中引入了Ocelot网关,我们就可以采用类似这种方式,在网关层集成zipkin4net。

自定义埋点

    通过上面我们查看TracingHandler的源码我们得知埋点主要是通过ClientTrace进行的,它是在发起请求的客户端进行埋点。在服务端埋点的方式我们可以通过TracingMiddleware中间件中的源码查看到[点击查看源码👈]叫ServerTrace。有了ClientTrace和ServerTrace我们可以非常轻松的实现一次完整的客户端和服务端埋点,只需要通过它们打上一些标签即可。其实它们都是对Trace类的封装,我们找到它们的源码进行查看

public class ClientTrace : BaseStandardTrace, IDisposable{ public ClientTrace(string serviceName, string rpc) { if (Trace.Current != null) { Trace = Trace.Current.Child(); } Trace.Record(Annotations.ClientSend()); Trace.Record(Annotations.ServiceName(serviceName)); Trace.Record(Annotations.Rpc(rpc)); } public void Dispose() { Trace.Record(Annotations.ClientRecv()); }}public class ServerTrace : BaseStandardTrace, IDisposable{ public override Trace Trace { get { return Trace.Current; } } public ServerTrace(string serviceName, string rpc) { Trace.Record(Annotations.ServerRecv()); Trace.Record(Annotations.ServiceName(serviceName)); Trace.Record(Annotations.Rpc(rpc)); } public void Dispose() { Trace.Record(Annotations.ServerSend()); }}

因此,如果你想通过更原始的方式去记录跟踪日志可以采用如下方式

var trace = Trace.Create();trace.Record(Annotations.ServerRecv());trace.Record(Annotations.ServiceName(serviceName));trace.Record(Annotations.Rpc("GET"));trace.Record(Annotations.ServerSend());trace.Record(Annotations.Tag("http.url", "<url>"));

示例Demo

由于上面说的比较多,而且有一部分关于源码的解读,为了防止由本人文笔有限,给大家带来理解误区,另一方面也为了更清晰的展示Zipkin的集成方式,我自己做了一套Demo,目录结构如下

ApiGateway为网关项目可以转发针对OrderApi的请求,OrderApi和ProductApi用于模拟业务系统,这三个项目都集成了zipkin4net链路跟踪,他们之间是通过Nacos实现服务的注册和发现。这个演示Demo我本地是可以直接运行成功的,如果有下载下来运行不成功的,可以评论区给我留言。由于博客园有文件上传大小的限制,所以我将Demo上传到了百度网盘中

下载链接:链接: https://pan.baidu.com/s/1LDyoRQehaE0FzedFTC4_Og 提取码: i45x 

总结

    以上就是关于Zipkin以及ASP.NET Core整合Zipkin的全部内容,希望能给大家带来一定的帮助。如果你有实际需要也可以继续自行研究。Zipkin相对于我们常用的Skywalking而且,它的使用方式比较原生,许多操作都需要自行通过代码操作,而SkyAPM可以做到对代码无入侵的方式集成。Skywalking是一款APM(应用性能管理),链路跟踪只是它功能的一部分。而Zipkin是一款专注于链路跟踪的系统,个人感觉就链路跟踪这一块而言,Zipkin更轻量级(如果使用ES作为存储数据库的话,Skywalking默认会生成一堆索引,而Zipkin默认是每天创建一个索引),而且链路信息检索、详情展示、链路数据上报形式等相对于Skywalking形式也更丰富一些。但是整体而言Skywalking更强大,比如应用监控、调用分析、集成方式等。技术并无好坏之分,适合自己的才是更好的,多一个解决方案,就多一个解决问题的思路,我觉得这是对于我们程序开发人员来说都应该具备的认知。

到此这篇关于ASP.NET Core整合Zipkin链路跟踪的实现方法的文章就介绍到这了,更多相关ASP.NET Core整合Zipkin链路跟踪内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网! 您可能感兴趣的文章:ASP.NET Core奇淫技巧之动态WebApi的实现ASP.NET Core Authentication认证实现方法ASP.NET Core 奇技淫巧之接口代理转发的实现

CKFinder的使用方法和注意事项CKFinder 也是 CK 系列的产品之一,它有两个功能:上传文件、浏览文件。一般来说,它是集成在 CKEditor 或 FCKEditor 中,以便在编辑器中插入超链接或图像时可以直接上传,也可通过浏览直接插入编辑器中。并且 CKFinder 提供了权限接口,以避免没有权限的人去上传文件。CKFinder 是收费的;如果不购买 license,那么就是处于演示模式下使用,禁止用于商业用途。CKFinder 提供 ASP、ASP.NET、ColdFusion、PHP 四种环境的程序。CKFinder 官方网站:http://ckfinder.com/CKFinder 官方文档:http://docs.cksource.com/CKFinder安装 CKFinder(以 ASP 为例)到 http://ckfinder.com/ 下载 CKFinder 最新版本;将整个文件夹放到服务器上;如果需要缩略图功能,服务器必须支持:ASP.NET 1.1/2.0 或 AspJpet 或 ASPImage 2 或 ASPThumb;(对于 Windows 服务器,一般都支持 ASP.NET。那干嘛不直接用 ASP.NET 版本的,嘿嘿)创建一个文件夹(默认是 ckfinder 下的 userfiles)用于 CKFinder 上传文件,并且设置好 NFTS 权限;打开 config.asp,在 CheckAuthentication() 中配置认证代码(若要测试,您可直接把其返回值改为 true,使其始终有权限),配置 License(如果有的话)、baseUrl、baseDir。这些都有备注说明,比较好配。集成到 CKEditor/FCKEditor假设服务器文件结构是:/index.html/ckeditor//ckfinder/那么 /index.html 的代码是:<script type="text/javascript" src="/ckeditor/ckeditor.js"></script><script type="text/javascript" src="/ckfinder/ckfinder.js"></script><script type="text/javascript"><!--var editor = CKEDITOR.replace("content");CKFinder.SetupCKEditor(editor) ;//--></script>至此,编辑器集成了 CKFinder。注意:CKEditor 最好是从官方下载原版,不要用精简版。当您要查看更多配置细节,除了上面说的 CKFinder 官方文档外,也可参照 /ckfinder/_samples/js/ 下的 ckeditor.html、fckeditor.html。相关问题因为安全原因,文件不可浏览. 请联系系统管理员并检查CKFinder配置文件.config.asp 中 CheckAuthentication 函数返回了 false,测试情况下,您可直接把 CheckAuthentication 改为返回 true。Unable to find an image manipulation component没有操作图像的控件。若不使用缩略图功能:直接把 config.asp 中的 Thumbnails.Add "enabled", true 的第二个参数改为 false。若要使用缩略图功能:可安装 ASP.NET 1.1/2.0 或 AspJpet 或 ASPImage 2 或 ASPThumb。对于 ASP.NET: 如果有错误,根据说明改 web.config 和 config.asp 中的 CKFinderTempPath 路径(注意以“\”结尾,并且在 web.config 中,要用“\\”代替“\”);如果还有错误,那么您就在浏览器中直接访问 http://.../ckfinder/core/connector/asp/loopback.aspx 看看能不能运行 ASP.NET,我遇到过一个错误就是 .NET 版本原因造成的,请参见 .NET Framework 4.0 无法运行 2.0 的 ASP.NET 程序解决。说明,若显示“403 - Forbidden”,说明 ASP.NET 已经运行起来了内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • asp 信息提示函数并作返回或者转向
  • 使用fso把文本信息导入数据库
  • 64位win7的iis7下asp与access的连接问题
  • asp程序给上传的图片增添水印效果!
  • ado存取数据库时如何分页显示
  • tsys okhtm.com修改版数据采集方法
  • asp保存远程图片到本地 同时取得第一张图片并创建缩略图的代码
  • asp强制刷新网页和判断文件地址实例代码
  • asp常用函数:getpy()
  • asp 判断是否为搜索引擎蜘蛛的代码
  • 谁发一下fckeditor 3.6.2 的配置方法,要中文asp的,谢了
  • PHOTO SHOP9.0免费下载
  • Microsoft Silverlight是什么程序?
  • 谁能介绍一些关于web service的书籍
  • 有人能解释Microsoft Sliverlight是干什么的?
  • JSP和JSF合并打造完美Web应用
  • 急,我下载photoshop8.0下载了几次了都下载成功了,可是安装老...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全asp基础应用技巧数据库相关asp class类存储过程小偷/采集木马相关fso专题首页asp编程asp.net core奇淫技巧之动态webapi的实现asp.net core authentication认证实现方法asp.net core 奇技淫巧之接口代理转发的实现asp 信息提示函数并作返回或者转向使用fso把文本信息导入数据库64位win7的iis7下asp与access的连接问题asp程序给上传的图片增添水印效果!ado存取数据库时如何分页显示tsys okhtm.com修改版数据采集方法asp保存远程图片到本地 同时取得第一张图片并创建缩略图的代码asp强制刷新网页和判断文件地址实例代码asp常用函数:getpy()asp 判断是否为搜索引擎蜘蛛的代码推荐4款傻瓜型的asp服务器软件(关于“未指定的错误”的问题 的比错误类型:provider (0x80004005c#入门教程之listbox控件使用方法utf-8 网页不显示+utf-8网页乱码asp 日期格式化问题microsoft jet database engine(asp中设置session过期时间方法总sql查询语句通配符与access模糊查asp获取url参数的几种方法分析总一小偷类!!有兴趣的可以看看asp数据库连接rs("user.id")飞云写的防cc攻击的asp程序插件 打包下载用getstring提高asp的速度asp google pr查询代码asp中应用事务处理技巧asp下返回以千分位显示数字格式化的数值asp下通过http_user_agent判断用户是从手asp提速五大技巧asp 生成任意英文+数字位数长度的随机码函
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved