自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 模型微调-基于LLaMA-Factory进行微调的一个简单案例

接下来就可以通过 LLaMa-Factory 进行微调了,这里先做一个简单的演示,为了不让这篇文章篇幅过长,先不具体讲解各种微调参数的含义和作用,数据集也只使用 LLaMa-Factory 自带的示例数据集,演示一下对模型认知设定的微调。需要注意的是,加载本地模型的时候,需要修改填写模型本地路径,这里的路径是模型快照的唯一哈希值,而不是模型文件夹的路径。之后就可通过和模型进行对话,测试下载下来的模型是否正常了,也可以看下对话中模型输出的风格,和我们微调之后的做下对比。

2025-03-08 12:30:18 1172 1

原创 ABP - 事件总线之分布式事件总线内置特性

是实体 T 创建后发布.是实体 T 更新后发布.是实体 T 删除后发布.除了这些预定的实体事件之外,我们如果需要在聚合根中发布事件,可以通过 AddDistributedEvent 方法添加事件,或者实现 IGeneratesDomainEvents 接口,这些都会在事务提交,数据持久化的时候被发布。原理上一篇文章中已经讲过了。对于分布式事件总线预定义事件的订阅,我们可以实现接口,这里的 T 就是上面三种预定义事件中的一种,例如 EntityUpdatedEto。/} }

2025-02-15 15:16:41 858

原创 ABP - 事件总线之分布式事件总线

事件总线可以实现代码逻辑的解耦,使代码模块之间功能职责更清晰。而分布式事件总线的功能不止这些,它允许我们通过消息队列进行中转,发布和订阅跨应用/服务边界传输的事件,经常被用作微服务或不同应用程序之间异步发送和接收消息的手段,属于分布式应用通讯的方式之一。

2025-02-15 10:44:23 900

原创 ABP - 事件总线之本地事件总线

实体的增、删、改是非常常见的操作,有些时候一些实体的增、删、改之后需要关联一些其他的业务逻辑,这时候我们可以通过事件总线来解决。ABP框架会为所有的实体自动发布这些事件,我们只需要订阅相关的事件。//...上面的例子是ABP官方的示例,订阅了接口的事件处理程序会在相应的实体创建之后触发。用于过去时态事件当相关工作单元完成且实体更改成功保存到数据库时,将发布带有过去时态的事件.如果在这些事件处理程序上抛出异常,则无法回滚事务,因为事务已经提交.事件类型;

2025-01-18 16:28:10 1236

原创 ABP - 缓存模块(2)

个人觉得ABP分布式缓存模块有三个值得关注的核心点。首先是AbpRedisCache类继承了微软原生的RedisCache,并通过反射的方式获取RedisCache的私有方法对RedisCache进行扩展,实现了ABP分布式缓存中的批量操作方法。为什么要这么做呢?因为基于Redis缓存的批量操作需要使用到StackExchange.Redis原生的SDK,而且在进行操作前总需要先进行Redis连接,而相应的方法和属性原生的RedisCache中都有,但是都是私有(pr

2025-01-18 16:00:32 1298

原创 ABP - 缓存模块(1)

分布式缓存服务提供了一个有趣的功能.假设你已经更新了数据库中某本书的价格,然后将新价格设置到缓存中,以便以后使用缓存的值.如果设置缓存后出现异常,并且更新图书价格的事务被回滚了,该怎么办?在这种情况下,缓存值是错误的.如果每个使用分布式缓存的地方都这么做将会有很多的重复冗余的代码,这是需要抽取封装的。这就可能会有问题,我们要特别注意缓存键的设置,如果开发人员不注意,很可能将一些缓存相互覆盖了,特别是共用缓存的应用比较多,或者多租户的情况下,这造成的问题可能很严重,而且很难排查。

2025-01-18 15:45:12 1512

原创 ASP.NET Core - 选项系统之源码介绍

所有选项均为命名选项,默认名称为Options.DefaultName,即string.Empty。通过ConfigurationBinder.Get或ConfigurationBinder.Bind手动获取选项实例。通过Configure方法进行选项配置:.Configure:通过包含DI服务的委托来进行选项配置:通过简单委托来进行选项配置:直接将IConfiguration实例绑定到选项上通过方法针对某个选项类型的所有实例(不同名称)统一进行配置。

2025-01-16 22:54:25 1250

原创 ASP.NET Core - 选项系统之选项验证

预定义的数据注解毕竟有限,在某些验证逻辑比较复杂的情况下,数据注解可能并不能完全满足我们的需求,我们可以通过类中的 Validate 方法传入一个委托来实现自己的验证逻辑。// 标题中不能包含特殊字符 if(options . Title . Contains("eval")) {// 验证失败 return false;} // 验证通过 return true;});()// 标题中不能包含特殊字符// 验证失败// 验证通过});

2025-01-16 22:19:43 369

原创 ASP.NET Core - 选项系统之选项使用

启动应用,调用一次 Get 接口,在 Api 控制器构造函数中注册了配置加载触发事件,之后修改 appsettings.json 配置文件中选项类对于的配置节点内容,可以看到事件触发,控制台中输出了改变之后的选项类内容。三个接口,通过这三个接口都可以从依赖注入容器中解析出已经配置的选项类,在我们通过 Configure 方法配置选项时,这三个接口会被同时注册,但三个接口是有区别的,适用场景也有所不同。可以看到控制台的输出中,第二次读取配置的时候,接口获取到的选项类对象是一直不变的。

2025-01-16 22:12:05 569

原创 ASP.NET Core - 配置系统之自定义配置提供程序

在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现,这两个接口在上一章ASP.NET Core - 配置系统之配置提供程序中也有提到了。

2025-01-15 22:56:00 1270

原创 ASP.NET Core - 配置系统之配置提供程序

软件应用根据不同的环境会有不同的行为逻辑,例如上面讲到的 appsettings.{environment}.json 根据环境而不同的配置文件,例如之前的 入口文件 文章中讲到的 Startup 文件根据不同环境的分离配置方式,而我们在代码中有时也会根据环境处理不同的逻辑,这时候我们可以注入 IHostEnvironment 服务,通过它获取当前应用的运行环境,入口文件中无论是 WebApplicationBuilder 对象还是 WebApplication 对象都包含该类型的属性。

2025-01-15 22:39:54 1114

原创 ASP.NET Core - 配置系统之配置添加

NET Core 配置系统对各种来源的配置信息进行了抽象,不同来源只要提供相应的配置提供程序即可,也就是我们上面在 IConfigurationRoot 接口中看到的 IConfigurationProvider 接口的实现类。配置提供程序内部对不同来源不同格式的配置信息进行加载、刷新,并提供统一的访问方式,也就是键值对,实际上所有的配置信息最终会以键值对的方式被读取到内存中的 Dictionary 对象中。配置系统可以读取到配置文件中的信息,那必然有某个地方可以将配置文件添加到配置系统中。

2025-01-15 21:59:42 1109

原创 ASP.NET Core - 依赖注入(四)

NET Core 框架下默认提供250个以上的的服务,包括 ASP.NET Core MVC、EF Core 等等,当然这些服务很多不会默认就注入到容器中,我们在新建一个项目的时候,不同项目框架的模板会帮我们默认配置好一些最基本的必须的服务,其他的服务我们可以根据自己的需要进行使用。这也是我们在日常开发中可以学习的方式,随着业务增长,需要依赖注入的服务也越来越多,我们可以根据业务模块,通过扩展方法将相应模块的服务注入注册进行封装,命名为 Add{Services},更加清晰明了地对我们的业务进行封装。

2025-01-14 22:30:02 982

原创 ASP.NET Core - 依赖注入(三)

一定要注意服务解析范围,不要在 Singleton 中解析 Transient 或 Scoped 服务,这可能导致服务状态错误(如导致服务实例生命周期提升为单例,因为单例生命周期的服务对象只会在应用停止的时候释放,而单例对象都没释放,它的依赖项肯定不会释放)。通过输出,我们可以单例生命周期服务在第一次使用的时候创建,之后一直是一个实例,作用域生命周期服务在一个作用域中第一次使用的时候创建实例,之后在同一个实例中只保持一个,但在其他作用域中则会重新创建,而瞬时生命周期服务每次都会创建一个新实例。

2025-01-14 22:20:28 1022

原创 ASP.NET Core — 依赖注入(二)

其中 CreateInstance 方法的泛型类型需要是具体的类型,而不是接口,这个方法还可以传入构造函数需要的,但没有在容器中注册的参数。当我们通过容器解析一个服务实例的时候,容器根据当前服务的链式依赖关系图解析其依赖项,根据依赖项的生命周期或创建、或从已有的实例获取,然后注入到我们解析的服务当中。构造函数注入是非常常见的服务注入方式,也是微软最推荐的方式,这种方式可以明确地声明当前类所依赖的东西,一目了然。这种方式用于缩小依赖注入的粒度,适用于注入的服务只在当前方法使用的时候,是对构造函数注入的简化。

2025-01-14 22:09:36 808

原创 ASP.NET Core - 自定义中间件

上一章讲了请求管道与中间件的基本概念和工作模式,也介绍了 ASP.NET Core 中内置的中间件,这一章介绍一下如何自定义中间件,这是很常用也很重要的内容,日常工作中很多场景我们都可以自定义自己的中间件,通过对请求管道进行拦截执行我们自己的业务逻辑,实现各种需求。这也是 ASP.NET Core 框架下的一种最基本的 AOP 编程方式。中间件本质上是一个委托,上一章的例子中我们将中间件的代码逻辑通过Use()、Run()、Map() 等方法写在了入口文件中,这样很不优雅。

2025-01-13 23:46:38 1021

原创 ASP.NET Core 系列总结

ASP.NET Core》 系列文章基于 .NET 3.1 和 .NET 6,主要是系统总结自己日常工作和学习中的知识点,之前是自己在 OneNote 上自己写,作为学习、总结笔记,逐渐放出来也供大家参考,希望大家都能够对 ASP.NET Core 框架有一个清晰的认知。最近在重看自己以前的技术文章,算是对旧知识点的复习,同时也将一些博客内容进行迁移,先迁移完已有的内容,后续会基于.NET 9 持续更新新的知识点,系统化地将 .NET 体系的知识点学明白、讲明白。

2025-01-13 23:11:51 622

原创 ASP.NET Core - .NET 6 以上版本的入口文件

NET 6 下应用的构建有了一些区别,不再直接使用原来的 Host 进行配置构建,而是通过 WebApplication 的静态方法构建 WebApplicationBuilder 来对主机进行配置,其实内部是 BootstrapHostBuilder 来进行的,调用 BootstrapHostBuilder 的相关配置方法时,只是将委托保存起来,之后还是通过 HostingBuilder 来进行配置。之后,应用已经初始化了依赖注入容器,所以我们可以通过 app.services获取我们需要的实例。

2025-01-13 23:09:28 771

原创 ASP.NET Core - IStartupFilter 与 IHostingStartup

通过源码可以看到,在调用 Build 方法构建主机的时候会获取外部程序集名称,然后将其加载,再通过HostingStartupAttribute 程序集特性找到配置的 HostingStartType,该类需要实现 IHostingStartup 接口,之后反射生成实例,调用其中的 Configure 方法,传入 IWebHostBuider 对象,因此在 IHostingStartup 实现类中一样可以进行依赖注入、管道配置。可以看到是从配置系统中获取的,而 key 是。

2025-01-13 22:59:29 1384

原创 ASP.NET Core - 日志记录系统(二)

显然,仅这些内置日志提供程序并不能满足我们生产开发中的使用,例如缺少最基础且常用的文件日志提供程序,还有在分布式应用已经非常普遍的业界现状下,时常需要将日志写分布式日志系统中进行统一的管理和分析,这些是微软没有提供的,但是第三方都有成熟的按照 .NET Core 日志记录系统体系架构开发的实现,这些将在下面细讲。类应用了装饰器模式,对多种日志记录提供程序的记录器进行了包装,提供了统一的日志记录 API,使得我们在使用时可以通过统一的入口将日志同时书写到不同的地方。

2025-01-12 14:59:29 908

原创 ASP.NET Core - 日志记录系统(一)

NET Core 框架中内置了日志记录系统,支持通过统一的 API 进入日志的记录,并且支持通过配置各种日志提供程序以各种不同的方式保存日志信息,不仅有多种内置的日志提供程序,也兼容各种按照标准规范实现的第三方框架。这样一个日志记录器实例。日志记录器在创建的时候需要指定日志类别,它会与该记录器的记录的每一条日志关联,方便我们在众多的日志信息中查找特定的日志。我们可以在记录日志的时候指定日志的级别,但是并不是我们记录的任何一个级别的日志都会输出保存,还得配合日志记录系统的配置,就像上面的例子中,最开始。

2025-01-12 12:43:24 1371

原创 ASP.NET Core - 缓存之分布式缓存

分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护。分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时。与其他将缓存数据存储在单个应用服务器上的缓存方案相比,分布式缓存具有多个优势。

2025-01-12 11:46:14 1701

原创 ASP.NET Core - 缓存之内存缓存(下)

介绍.net core框架下内存缓存的详细使用方式

2025-01-12 11:14:06 941

原创 ASP.NET Core - 缓存之内存缓存(上)

缓存指的是在软件应用运行过程中,将一些数据生成副本直接进行存取,而不是从原始源(数据库,业务逻辑计算等)读取数据,减少生成内容所需的工作,从而显著提高应用的性能和可伸缩性,使用好缓存技术,有利于我们提升用户体验性。除了 TryGetValue 方法外,如果你确定缓存中一定存在相应的数据,还可以通过 Get 方法获取数据,Get 方法支持泛型,可以直接进行类型转换,但是如果缓存中不存在该缓存项,则会返回对应类型的默认值。通过控制台打印结果,可以看到,当前时间已经改变,但是缓存的时间是之前的数据。

2025-01-12 10:53:55 961

原创 ASP.NET Core - 选项系统之选项配置

预定义的数据注解毕竟有限,在某些验证逻辑比较复杂的情况下,数据注解可能并不能完全满足我们的需求,我们可以通过 OptionsBuilder 类中的 Validate 方法传入一个委托来实现自己的验证逻辑。// 标题中不能包含特殊字符 if(options . Title . Contains("eval")) {// 验证失败 return false;} // 验证通过 return true;});

2022-12-18 00:10:26 1049

原创 ASP.NET Core - 配置系统之配置读取

一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为。配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们以 Hard Code (硬编码)的方式写在应用代码中,这样配置就会很乱,而且后续也不容易修改。乱而多,而且不容易修改,这就需要一个统一管理的地方,最常见的方式就是配置文件,这个也是开发人员非常熟悉的方式。通过配置文件设置好软件应用运行的各种参数之后,我们在开发过程中需要能够读取到配置文件的内容,根据配置内容进行软件逻辑的判断,实现完善的软件行

2022-12-04 13:34:28 2163

原创 ASP.NET Core — 依赖注入(一)

NET Core 框架下默认提供250个以上的的服务,包括ASP.NET Core MVC、EF Core 等等,当然这些服务很多不会默认就注入到容器中,我们在新建一个项目的时候,不同项目框架的模板会帮我们默认配置好一些最基本的必须的服务,其他的服务我们可以根据自己的需要进行使用。这也是我们在日常开发中可以学习的方式,随着业务增长,需要依赖注入的服务也越来越多,我们可以根据业务模块,通过扩展方法讲相应模块的服务注入注册进行封装,命名为 Add{Services},更加清晰明了地对我们的业务进行封装。

2022-11-19 22:04:58 5522 1

原创 ASP.NET Core — 请求管道与中间件

中间件本质上是一个委托,上面的例子中我们将中间件的代码逻辑通过 Use()、Run()、Map() 等方法写在了入口文件中,这样很不优雅。我们可以对这些代码进行封装,最简单的封装方式,就是通过一个静态类将相关的代码写成静态方法,在 Use() 等方法中只需要传入静态方法即可。但是这种方法一样不够优雅,我们可以模仿微软内置中间件和一些第三方组件提供的中间件的封装方式。例如,静态文件中间件的实现源码:其实对于中间件的封装,可以不实现某个接口,但是它有一套约定的规则。

2022-11-07 22:34:28 1987

原创 ASP.NET Core — 入口文件

根据顶级语句语法,顶级语句文件中存在隐式 using 指令, 但如果我们需要在 Program.cs 文件中额外引入一些命名空间也是可以的,using 语句需要在文件的最前面,也可以定义方法或者类,只不过需要在顶级语句的后面,也可以使用异步方法。从代码中可以看到,在对主机进行配置的时候,使用到了 Startup 类,在 .NET 6 之前的版本,Startup 类承担应用的启动任务,是应用配置的主要地方。○ 该方法内中间件的注册顺序与代码的书写顺序是一致的,先注册的先执行,后注册的后执行。

2022-11-07 22:11:51 1092

原创 记FreeSql查询缓慢的一种情况

大佬也觉得奇怪,远程过来帮我们调试了一下,刚开始也没有太多的头绪,但却肯定了ado模式使用脚本查询,和Code First模式查询的实体转换逻辑是不一样的,后来我们注意到,在数据查询那一行语句执行的过程中,输出一直在输出异常,而且是类型转换失败的异常。果然,查询脚本在数据库中执行是很快的。这时候就怀疑是不是网络传输啊,或者暂时不知道的因素导致的了,不管怎么样,先测试一下相同的脚本在代码里面执行起来怎么样吧,虽然觉得不会有什么区别,毕竟脚本本来就是有FreeSql生成的。

2022-10-29 15:57:44 1251

原创 DevOps—基于Jenkins构建.Net Core应用自动化流程

前一篇文章演示了怎么基于 Jenkins 自动化构建发布一个前端工程,接下来将演示基于 Jenkins 构建发布一个后端应用,我主要使用的开发语言就是 .Net Core,这里以 .Net Core 为示例。

2022-10-08 22:44:57 1831

原创 DevOps—基于 Jenkins 构建 Vue 前端工程自动化流程

这里需要新增 SSH Server,就像平常通过 ssh 连接远程服务器一样,需要填写名称、远程机器 ip,远程机器登录账号,其中的远程机器目录可以填写,这个路径必须在远程机器中已存在,不存在不会自动创建,填写之后后面传输文件时,文件的路径就相对于这个路径,否则就相对于账号的家目录。也可以通过配置页面的流水线语法链接,调整到 Jenkins 的帮助文档,里面有一个代码片段生成器,可以帮助生成一些基本操作的代码,这里生成的代码一般不要更改,包括换行,直接拷到 jenkinsfile 中使用即可。

2022-10-08 22:27:36 2221

原创 DevOps— CI/CD 工具 Jenkins

Jenkins 是一个基于Java的跨平台开源 CI/CD 工具,可以用来自动执行与构建、测试和交付或部署软件相关的各种任务,支持实时测试和报告,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

2022-10-07 19:36:02 828

原创 DevOps—源码管理工具Gitlab

在自动化构建的过程中,总是需要将我们开发的应用的源码拉取到服务器中进行生成、发布、测试操作,之后再推送到目标服务器上进行部署应用。这就需要我们拥有一个在线保存开发过程中的源代码的地方,也就是源代码管理服务器。GitLab 是一个开源的源代码管理应用,支持私有化部署安装,对于 GitLab 大家都应该很熟悉,就算大家实际工作中不涉及 DevOps 相关技术,没有用过 GitLab,相信也必然用过类似的工具,开发团队协助中一个源代码管理工具必然是必不可少的。,各种文档请参考官网。

2022-10-07 15:19:31 1921

原创 DevOps—基本概念

这是这个行业演变过程,也是一个公司从成立,到发展壮大的过程,一个公司的项目管理模式演变过程是整个行业演变过程的缩影,不同阶段有不同阶段的模式,达到一定阶段才有改变的必要,不过我们如果提前有这些了解,提前有所准备,那边在转变的过程中就可以少些弯路和内耗。再后来,随着项目的再次扩大,用户对系统的需求不断增加,与此同时,用户给的时间周期却越来越少,时间周期比较长的瀑布流模式不再适用,于是就出现了“敏捷开发”,为的就是小步快跑,持续迭代,快速发现问题,快速解决问题,快速和用户、业主进行确认。

2022-10-06 22:16:45 8415 2

原创 容器技术—docker stack

在之前的几篇文章中,我们介绍了Docker Compose,它是用来进行一个完整的应用程序相互依赖的多个容器的编排的,但是缺点是不能在分布式多机器上使用;我们也介绍了Docker swarm,它构建了docker集群,并且可以通过docker service在不同集群节点上运行容器服务,但是缺点是不能同时编排多个服务。但是在实际的生产开发中,我们一个完整的应用需要的服务往往不止一个,通过docker service 命令来部署的话会很麻烦,所以这里要讲一下 Docker Stack,它用于向swarm集群部

2022-06-22 22:45:17 9153

原创 容器技术—docker swarm(二)

基于docker swarm的docker集群已经搭建完成,我们的目的是要在集群中部署应用。swarm集群部署应用最基本的命令是docker service,它的使用方式类似于docker container(也就是我们一直用的docker命令,docker命令是docker container的简写),也和docker container命令一样适合部署单个应用,不能进行编排,只不过一个是用于单机,一个用于集群。下面以在swarm集群中部署nginx为例:默认的情况下,管理节点也是一个工作节点,服务也会部

2022-06-18 22:15:38 3920

原创 容器技术—docker swarm(一)

我们的应用随着业务的扩展,从开始的单体架构,到分布式架构,再到微服务架构,其中的核心理念就是用资源换取性能。单台服务器的性能是由瓶颈的,随着业务的扩展、访问量的增大、计算量的增大,IO读写需求的增大,逐渐无法支撑,于是便通过集群技术将多台机器构成集群,调度集群内的多台服务器协同进行工作,以满足应用运行的需要,提升应用的性能。这是分布式架构的基本思想。这里的关键技术就是集群技术。集群是一组相互独立的、通过高速网络互联的计算机构成了一个组,并以单一系统的模式加以管理。每个集群节点都是运行其自己进程的一个独立服务

2022-06-18 15:22:52 2887

原创 容器技术—docker compose

在微服务架构下,我们后端会有许许多多的服务,这些服务之间可能会存在一定的依赖关系,或者会依赖一些第三方的应用容器,在生产环境中我们不可能通过docker命令一个一个地拉取镜像、启动容器,那样做将是一件非常费时费力的事情。想象一下,当我们有几十上百个甚至几百个服务时,需要一个一个的启动,那样子重复性的工作简直让人奔溃。这里介绍一下docker compose,它能够在一定程度上解决上述的困境。Compose 项目是 Docker 官方的开源项目,是用于定义和运行多容器 Docker 应用程序的工具,负责实现对

2022-06-03 20:54:41 4788

原创 容器技术—.Net Core on Docker

容器技术—.netcoreondocker1.开发环境使用docker调试2.Dockerfile2.1.FROM:指定基础镜像2.2RUN:执行shell命令2.3COPY:复制文本2.4ADD:复制和解包文件2.5CMD:容器启动命令2.6ENTRYPOINT:入口点2.7ENV:设置环境变量2.8ARG:构建参数2.9VOLUME:挂载点2.10XPOSE:暴露端口2.11WORKDIR:指定工作目录3.docker发布3.1镜像移植3.2release发

2022-05-28 23:22:06 1329

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除