var configBuilder = new ConfigurationBuilder() .AddInMemoryCollection(); if (!options.SuppressEnvironmentConfiguration) { //添加情况变量 configBuilder.AddEnvironmentVariables(prefix: "ASPNETCORE_"); } //构建了_config实例 private readonly IConfiguration _config = configBuilder.Build();
也就可以表明为何我们可以通过情况变量去设置HostingStartup,然后我们再来看UseSetting要领的逻辑
public IWebHostBuilder UseSetting(string key, string value) { _config[key] = value; return this; }
本来UseSetting也是给_config实例配置值,所以无论通过UseSetting或情况情况变量的方法去设置,本质都是在操纵_config这个设置实例,到此为止所有谜团均以解开。
在SkyAPM中的利用
我们上面说了HostingStartup可以加强启动时候的操纵,可以通过对现有代码无入侵的方法加强措施成果。而SkyAPM-dotnet也正是利用了这个成果,实现了无入侵启动APM监控。我们往返首一下SkyAPM-dotnet的利用方法
首先是利用Nuget添加SkyAPM.Agent.AspNetCore措施集引用。
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using SkyApm.Agent.AspNetCore; using SkyApm.AspNetCore.Diagnostics; [assembly: HostingStartup(typeof(SkyApmHostingStartup))] namespace SkyApm.Agent.AspNetCore { internal class SkyApmHostingStartup : IHostingStartup { public void Configure(IWebHostBuilder builder) { builder.ConfigureServices(services => services.AddSkyAPM(ext => ext.AddAspNetCoreHosting())); } } }
通过这个我们可以看出确实如此,虽然也是等同于我们通过UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "SkyApm.Agent.AspNetCore")去设置,我们甚至可利用如下的方法去利用SkyAPM-dotnet
public void ConfigureServices(IServiceCollection services) { services.AddSkyAPM(ext => ext.AddAspNetCoreHosting()) }
这些写法其实是完全等价的,可是通过情况变量的方法设置HostingStartup启动措施集的方法无疑是最优雅的。所以我们在日常的进修开拓中,最好照旧通过这种方法去操纵。
改革Zipkin利用
我们在之前的文章ASP.NET Core整合Zipkin链路跟踪中曾演示过基于诊断日志DiagnosticSource改造Zipkin的集成方法,通过本篇文章报告的HostingStartup我们可以进步一改造Zipkin的集成方法,可以让它利用起来和SkyAPM-dotnet雷同的方法,我们基于之前的示例中的ZipkinExtensions措施会合添加一个ZipkinHostingStartup类,用于承载集成Zipkin的操纵,代码如下
using System; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection; namespace ZipkinExtensions { public class ZipkinHostingStartup: IHostingStartup { public void Configure(IWebHostBuilder builder) { builder.ConfigureServices(services=> { services.AddZipkin(); services.AddSingleton<ITraceDiagnosticListener, HttpDiagnosticListener>(); }); builder.Configure(app=> { IHostApplicationLifetime lifetime = app.ApplicationServices.GetService<IHostApplicationLifetime>(); ILoggerFactory loggerFactory = app.ApplicationServices.GetService<ILoggerFactory>(); IConfiguration configuration = app.ApplicationServices.GetService<IConfiguration>(); string serivceName = configuration.GetValue<string>("ServiceName"); string zipKinUrl = configuration.GetValue<string>("ASPNETCORE_ZIPKINADDRESS"); app.UseZipkin(lifetime, loggerFactory, serivceName, zipKinUrl); }); } } }
然后在每个项目标launchSettings.json文件中添加如下所示的设置即可,这样的话就可以做到对现有业务代码无任何入侵。
"environmentVariables": { "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "ZipkinExtensions", "ASPNETCORE_ZIPKINADDRESS": "http://localhost:9411/" }
总结
本文先容了HostingStartup的根基观念,基本利用以及对其源码的阐明和在SkyAPM-dotnet中的应用,最后我们改革了Zipkin的集成方法。HostingStartup在一些集成APM可能链路跟踪的雷同场景还长短常实用的,可能假如我们有集成一些基本组件可能三方的组件,可是我们的代码中并不需要直接的利用这些组件中的类可能直接的代码干系,均可以利用HostingStartup的方法去集成,为我们实现对现有代码提供无入侵加强提供了强大的支持。关于HostingStartup我也是在看源码中无意发明的,厥后发明微软ASP.NET Core官方文档
一文中有讲授,然后遐想到本身利用过的SkyAPM-dotnet正是利用了HostingStartup+诊断日志DiagnosticSource的方法实现了对代码无入侵的方法举办监控和链路跟踪。于是抉择深入研究一下,可谓收获满满,便写下这篇文章但愿更多的人可以或许相识利用这个成果。