/// <summary>
/// 依赖注入 new
/// </summary>
public
static
void
RegisterDependencyNew()
{
var
builder =
new
ContainerBuilder();
// 注册 MVC 容器的实现
builder.RegisterControllers(Assembly.GetExecutingAssembly());
// 注册服务和仓储
RegisterTypesBySuffix(builder,
\"Service\"
);
RegisterTypesBySuffix(builder,
\"Repository\"
);
// 注册缓存管理器和 Redis 缓存管理器
//builder.RegisterInstance(CacheSetting.CacheManager).SingleInstance();
//builder.Register(r =>
//{
// return CacheSetting.CacheManager;
//}).AsSelf().SingleInstance();
//builder.RegisterType<RedisCacheManager>().As<IRedisCacheManager>().SingleInstance();
// 注册 Cap 发布器
//builder.RegisterInstance(GetCapPublisher()).SingleInstance();
//builder.Register<ICapPublisher>(r =>
//{
// return CapConfig.Services.BuildServiceProvider().GetRequiredService<ICapPublisher>();
//}).AsSelf().SingleInstance();
var
container = builder.Build();
DependencyResolver.SetResolver(
new
AutofacDependencyResolver(container));
}
private
static
void
RegisterTypesBySuffix(ContainerBuilder builder,
string
suffix)
{
var
assemblys = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
builder.RegisterAssemblyTypes(assemblys.ToArray())
.Where(t => t.Name.EndsWith(suffix))
.AsImplementedInterfaces()
.SingleInstance();
}
2. 调整前的代码12345678910111213141516171819202122232425262728293031323334353637/// <summary>
/// 依赖注入-Old
/// </summary>
public
static
void
RegisterDependencyOld()
{
var
builder =
new
ContainerBuilder();
//注册mvc容器的实现
builder.RegisterControllers(Assembly.GetExecutingAssembly());
//如果有web类型,请使用如下获取Assenbly方法
var
assemblys = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList();
builder.RegisterAssemblyTypes(assemblys.ToArray()).Where(t => t.Name.EndsWith(
\"Service\"
)).AsImplementedInterfaces();
builder.RegisterAssemblyTypes(assemblys.ToArray()).Where(t => t.Name.EndsWith(
\"Repository\"
)).AsImplementedInterfaces();
/
//在Autofac中注册Redis的连接,并设置为Singleton (官方建議保留Connection,重複使用)
builder.Register(r =>
{
return ConnectionMultiplexer.Connect(DbSetting.Redis);
}).AsSelf().SingleInstance();
/
//在Autofac中注册CacheManager 缓存配置,并设置为Singleton[https://github.com/MichaCo/CacheManager/issues/27]
//builder.Register(r =>
//{
// return CacheSetting.CacheManager;
//}).AsSelf().SingleInstance();
//builder.Register(c => new RedisCacheManager()).As<IRedisCacheManager>().AsSelf().SingleInstance();
//builder.Register<ICapPublisher>(r =>
//{
// return CapConfig.Services.BuildServiceProvider().GetRequiredService<ICapPublisher>();
//}).AsSelf().SingleInstance();
var
container = builder.Build();
DependencyResolver.SetResolver(
new
AutofacDependencyResolver(container));
}
生产运行状态监控1. CPU 2. 内存 3. 接口响应时间 关于性能优化1. 框架版本 .NET Framework和.NET Core是微软的两个不同的开发平台1. .NET Framework:.NET Framework是微软最早发布的开发平台,它是一个完整的、统一的Windows应用程序开发框架它支持多种编程语言(如C#、VB.NET等)和多种应用类型(如Windows桌面应用、ASP.NET Web应用等).NET Framework依赖于Windows操作系统,并且只能在Windows上运行2. .NET Core:.NET Core是微软在.NET Framework基础上进行的重写和改进,它是一个跨平台的开发平台.NET Core具有更小、更快、更模块化的特点,可以在Windows、Linux和macOS等多个操作系统上运行.NET Core支持多种编程语言(如C#、F#、VB.NET等)和多种应用类型(如控制台应用、Web应用、移动应用等) 升级到.NET Core版本对性能有以下好处:1. 更高的性能:.NET Core在性能方面进行了优化,具有更快的启动时间和更高的吞吐量它采用了新的JIT编译器(RyuJIT)和优化的垃圾回收器(CoreCLR),可以提供更好的性能2. 更小的内存占用:.NET Core采用了更精简的运行时库,可以减少应用程序的内存占用这对于云计算和容器化部署非常有利3. 跨平台支持:.NET Core可以在多个操作系统上运行,包括Windows、Linux和macOS等这使得开发人员可以更灵活地选择运行环境,并且可以更好地适应不同的部署需求4. 更好的可扩展性:.NET Core提供了更多的开发工具和库,可以更方便地构建可扩展的应用程序它支持微服务架构和容器化部署,可以更好地应对大规模应用的需求 升级到.NET Core版本可以带来更高的性能、更小的内存占用、更好的跨平台支持和更好的可扩展性这些优势使得.NET Core成为现代应用程序开发具有性能优势2. 升级插件 (.NET Upgrade Assistant 插件, .NET Framework 升级至跨平台的 .NET Core)1. 在 VS 2022 中进行 .NET Upgrade Assistant 的安装2. 按照 提示下一步 等待片刻 即可: 3. 打开您需要升级的项目,在项目上点击右键就会出现 Upgrade 按钮:4. 升级后... 可能编辑器会提示N个错误...别慌.. 很多都是一个原因导致的,升级相关第三方组件支持 .net core, 静下心来 逐个解决,上线前做好 充足的测试(保守估计,在您不修改项目原有逻辑,整体性能会提升 30%+ ,什么你不信?^_^ 接着往下看 其他公司案例... ) 因 .NET Core 的底层全部重构了具有后发优势(重新开发,重新面向云原生设计 从 core 1.0 / 1.1 /2.0 / 2.1 “不完善比较坑” , 到现在的 3.1 ,5.0, 6.0 ,7.0, 以及即将发布的 8.0 经过不断完善改进 目前已经非常稳定可靠 ), 抛弃了原有的.NET Framework 底层和Window深度捆绑 使用 .NET 升级助手将 ASP.NET Framework 新式化为 ASP.NET Core - Training | Microsoft Learn从 ASP.NET 更新到 ASP.NET Core | Microsoft Learn 3. 其他 (升级后的收获分享)1. 同程旅行 .Net 微服务迁移至.Net 6.0的故事: https://mp.weixin.qq.com/s/I8BQERm0xXHKgF2OxMCVTA2. 迁移至.NET5.0后CPU占用降低:https://twitter.com/stebets/status/14424175344440647693. StackOverflow迁移至.NET5.0: https://twitter.com/juanrodriguezce/status/1428070925698805771 4. StackOverflow迁移至.NET6.0: https://wouterdekort.com/2022/05/25/the-stackoverflow-journey-to-dotnet6/5. 必应广告活动平台迁移至.NET6.0: https://devblogs.microsoft.com/dotnet/bing-ads-campaign-platform-journey-to-dotnet-6/6. Microsoft Commerce的.NET6.0迁移之旅: https://devblogs.microsoft.com/dotnet/microsoft-commerce-dotnet-6-migration-journey/7. Microsoft Teams服务到.NET6.0的旅程: https://devblogs.microsoft.com/dotnet/microsoft-teams-assignments-service-dotnet-6-journey/8.OneService 到 .NET 6.0的旅程 :https://devblogs.microsoft.com/dotnet/one-service-journey-to-dotnet-6/ 9. Exchange 在线版迁移至 .NET Core: https://devblogs.microsoft.com/dotnet/exchange-online-journey-to-net-core/10. Azure Cosmos DB 到 .NET 6.0的旅程: https://devblogs.microsoft.com/dotnet/the-azure-cosmos-db-journey-to-net-6/....欢迎补充 ,其他的案例分享 4 . 提升性能的写法和技巧1. 使用异步编程:使用异步方法可以提高应用程序的响应性能,特别是在处理I/O密集型操作时通过使用async和await关键字,可以将长时间运行的操作放在后台线程上,从而释放主线程并提高应用程序的吞吐量, Channel 通道,进程内队列 (Queue)2. 使用内存池:在.NET Core中,可以使用MemoryPool<T>类来管理内存分配和回收通过重用内存块,可以减少垃圾回收的频率,从而提高性能3. 避免频繁的装箱和拆箱:装箱和拆箱操作会引入额外的开销,可以通过使用泛型和值类型来避免这些操作4. 使用Span<T>和Memory<T>:Span<T>和Memory<T>是.NET Core中的新类型,用于高效地处理内存它们提供了一种零拷贝的方式来访问和操作内存,可以减少内存分配和复制的开销5. 使用并行编程:在处理大量数据或执行密集计算的情况下,可以使用并行编程来利用多核处理器的性能通过使用Parallel类或PLINQ,可以将工作分解成多个并行任务,并利用所有可用的处理器核心6. 使用缓存:在适当的情况下,可以使用缓存来存储计算结果或频繁访问的数据通过减少重复计算或数据库查询,可以显著提高性能7. 使用异步数据库访问:如果应用程序需要频繁地访问数据库,可以考虑使用异步数据库访问通过使用异步方法,可以在等待数据库响应时释放线程,并允许其他请求继续执行8. 使用缓存策略:在使用缓存时,可以使用不同的缓存策略来平衡性能和数据一致性例如,可以使用基于时间的过期策略或基于依赖项的过期策略来控制缓存的有效期9. 使用连接池:在使用数据库连接或其他资源时,可以使用连接池来管理连接的创建和回收连接池可以减少连接的创建和销毁开销,并提高应用程序的性能10. 使用批量操作:在执行数据库操作时,可以考虑使用批量操作来减少与数据库的通信次数通过将多个操作合并为一个批量操作,可以减少网络延迟和数据库开销11. 使用性能分析工具:使用性能分析工具,如.NET Core Profiler或dotTrace,可以帮助识别性能瓶颈和优化机会通过分析应用程序的性能特征,可以找到性能瓶颈并采取相应的优化措施除了性能分析工具,还有其他一些性能优化工具可以帮助识别和解决性能问题例如,可以使用性能监视器来监视应用程序的性能指标,并根据需要进行调整 性能 分析平台(火焰图):grafana/pyroscope: Continuous Profiling Platform. Debug performance issues down to a single line of code (github.com) 系统运行异常实时监控面版:exceptionless/Exceptionless: Exceptionless application (github.com).NET 诊断工具 : https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/tools-overview WinDebug 高级调试扛把子 : @一线码农 👍👍从 Benchmarks 的测试报告来看,.net core 的运行效率仅次于 C++ 和 Rust ,作为一款 JIT 编译的语言执行效率已经非常高了,当然 随着即将发布的. net 8 更加成熟的 AOT编译 可能还会更快(正式版 11月10号左右 ) ----既然从测试结果上效果是非常不错的,那么如果您的项目遇到 CPU高,内存高,执行效率低 是否会是本身写法 用法上有不足之处呢 ?带着这个疑问 可以反思反思 项目中是否有哪些不足之处,还可以改进的呢?(当然结合一些 APM ,性能分析工具 可能会更快更加精准的定位到问题) (图片来源网络,侵删)
0 评论