媒介
嘿,小搭档们!迩来看到了一个 .NET 8.0 的小项目伪微服务框架,非常恰当想要快速搭建小型应用项目或是想要学习.NET 8.0及新的技能,但又不知道从那里学起的朋侪。这个框架可以资助我们简化开发流程,同时还能顺应不停变革的需求。
它固然简化了很多复杂的微服务特性,但仍生存了关键的微服务理念,让我们可以专注于业务逻辑而不是底层细节,而且到达实操结果。
想要快速上手 .NET 8.0,不妨试试这个框架。项目已经在 GitHub 上开源了,欢迎各人前来围观、提供发起或贡献代码。盼望这个框架可以或许资助更好的资助我们工作中碰到的题目。
项目先容
为什么说是伪微服务框架,常见微服务框架大概还包罗服务容错、服务间的通讯、服务追踪和监控 、服务注册和发现等等,而这里为了在使用中的更简朴,将很多东西举行了简化大概省略了。
简化微服务概念:作者固然称为“伪微服务”,但本框架依然具备一些关键的微服务特性,如模块化操持和服务解耦。它通过镌汰复杂的服务间通讯、容错机制和服务发现等功能,使开发更加高效且易于管理。
技能栈:集成了一些比力实用的新技能,包罗EF Core、Redis、RabbitMQ和MySQL,确保应用高效又能应对高并发场景。
易用性:该框架的目的是尽大概地简化开发过程,提供完备的接口和文档,可以或许敏捷上手,并将更多精力会集在业务逻辑上。
连续优化:只管现在仍处于早期阶段,但作者答应将连续改进和美满该项目。这包罗但不限于引入更多高级特性、增强现有功能以及提拔团体性能。
项目核心
对象映射:使用 AutoMapper 主动处置处罚对象之间的映射,让你无需手动编写繁琐的转换代码。
查询封装:通过 Ardalis.Specification 和 LinqKit.Core 封装 EF Core 查询,让数据获取变得更简朴直观。
数据库交互:在 EF Core 中重写了 SaveChangesInterceptor,实现了软删除功能,并主动管理创建时间和更新时间字段。
团体架构:接纳了整齐的架构操持,便于明白和维护。
业务功能:已经预置了一些根本的业务功能,开箱即用。
依靠注入:内置了依靠注入容器,方便管理组件和服务。
认证与授权:使用双 token 实现了安全登录和无感知的前端 token 革新。
分布式 ID 天生:集成了 Snowflake 分布式 ID 天生器,确保全局唯一标识符。
缓存与锁:通过 Redis 实现了分布式缓存和分布式锁,进步了体系的可用性和并发性能。
消息队列:使用 RabbitMQ 封装了异步使命处置处罚机制,如文件上传和下载。
定时使命:联合 Cronos 和 BackgroundService 实现了秒级定时使命。
数据初始化:使用 BackgroundService 举行数据初始化,比如字典数据的加载。
日记记载:接纳 Serilog 记载非常日记,并通过 Docker 摆设实现日记的可视化监控 。
操纵日记:通过自界说过滤器和反射记载操纵日记,便于追踪用户活动。
权限验证:实现了权限验证过滤器,确保用户只能访问被授权的资源。
同一相应格式:使用 IAsyncResultFilter 同一了返回给前端的数据格式。
Excel 操纵:集成 EPPlus 库,支持 Excel 导入和导出。
一键摆设:支持使用 goploy 快速摆设前后端应用。
API 文档:通过 Swagger 主动天生 RESTful API 文档,方便前端和后端开发职员协作。
设置加载:主动加载 appsettings.json 文件中的设置信息。
项目框架
通过Github下载项目源码,我们可以查察项目框架,详细如下图所示:
<img alt=""> 1、Libraries
包罗各种外部类库,对其深加工使用在项目中
2、Services/Basic
微服务底子支持子体系
3、Services/NCDP
微服务业务子体系
4、Services/SystemService
微服务体系服务(包罗数据库的更新、定时使命、数据初始化、Swagger承载、RabbitMQ队列变乱处置处罚器等)
5、sun.Core
sun.Core作为了中转,其他外部大概自己封装的类库,在引用的时间都是在sun.Core中举行的引用。
算是间接引用,来简化项目中的依靠关系。
同时在sun.Core也封装了一些核心组件和服务。
6、sun.Infrastructure
紧张封装一些通用的方法,以及底子办法组件,供外部使用。
项目分析
关于项目详细使用情况可以查察作者整理的文章链接 https://www.cnblogs.com/aehyok/p/18058032 ,盼望可以或许资助各人更好的明白项目和学习知识点,提拔自己的技能本领,下面只展示了部门内容。
1、业务功能
现在根本实现的功能包罗:用户管理、脚色管理、地区管理、查察日记(登录日记和操纵日记)、菜单管理、权限控制、体系管理等功能。
2、天生文档工具
Swagger 天生REST APIs文档工具包罗可以承载多个微服务项目,通过右上角举行切换,便可以查察当前微服务项目的接口文档,并可以举行测试
测试接口直接可在swagger ui上举行
同一添加接口中的Header参数
通过对Swagger UI举行部门的自界说,使的更好的适配自己的项目,比如添加登录,如许接口便直接可以在swagger UI上面举行。
3、分布式雪花Id天生器
Snowflake 所使用的开源类库:https://github.com/stulzq/snowflake-net- /// <summary>
- /// 分布式雪花Id生成器
- /// </summary>
- public class SnowFlake
- {
- /// <summary>
- /// 通过静态类只实例化一次IdWorker 否则生成的Id会有重复
- /// </summary>
- private static readonly Lazy<IdWorker> _instance = new(() =>
- {
- var commonOptions = App.Options<CommonOptions>();
- return new IdWorker(commonOptions.WorkerId, commonOptions.DatacenterId);
- });
- public static IdWorker Instance = _instance.Value;
- }
复制代码 此中 WorkerId和DatacenterId保持差别的话,比方两个微服务WorkerId一个为1一个为2,那么在同一毫秒数天生的Id肯定是差别的。
同一个IdWorker在一个毫秒中可以天生4096个序列号 富足大型体系使用了,不怕重复的题目。
4、分布式缓存和分布式锁
Redis 同一封装实现分布式缓存和分布式锁,所使用的开源类库:https://github.com/2881099/csredis
现在紧张封装了几个常用的接口方法- public interface IRedisService
- {
- /// <summary>
- /// 查看服务是否运行
- /// </summary>
- /// <returns></returns>
- bool PingAsync();
- /// <summary>
- /// 根据key获取缓存
- /// </summary>
- /// <param name="key"></param>
- /// <returns></returns>
- Task<T> GetAsync<T>(string key);
- /// <summary>
- /// 设置指定key的缓存值(不过期)
- /// </summary>
- /// <param name="key"></param>
- /// <param name="value"></param>
- /// <returns></returns>
- Task<bool> SetAsync(string key, object value);
- /// <summary>
- /// 设置指定key的缓存值(可设置过期时间和Nx、Xx)
- /// </summary>
- /// <param name="key"></param>
- /// <param name="value"></param>
- /// <param name="expire"></param>
- /// <param name="exists"></param>
- /// <returns></returns>
- Task<bool> SetAsync(string key, object value, TimeSpan expire, RedisExistence? exists = null);
- /// <summary>
- /// 设置指定key的缓存值(可设置过期秒数和Nx、Xx)
- /// </summary>
- /// <param name="key"></param>
- /// <param name="value"></param>
- /// <param name="expireSeconds">过期时间单位为秒</param>
- /// <param name="exists"></param>
- /// <returns></returns>
- Task<bool> SetAsync(string key, object value, int expireSeconds = -1, RedisExistence? exists = null);
- /// <summary>
- /// 删除Key
- /// </summary>
- /// <param name="key"></param>
- /// <returns></returns>
- Task<long> DeleteAsync(string key);
- Task<Dictionary<string,string>> ScanAsync();
- }
复制代码 紧张是为了保持与redis cli中的方法同等,选了这个类库,固然你也可以选择其他的类库 还是蛮多的。
同时还封装了一个接口用于前端监测全部的key和value。- public async Task<dynamic> ScanAsync(PagedQueryModelBase model)
- {
- List<string> list = new List<string>();
- //根沐model.Keyword进行模糊匹配
- var scanResult = await RedisHelper.ScanAsync(model.Page, $"*{model.Keyword}*", model.Limit);
- list.AddRange(scanResult.Items);
- var values = await RedisHelper.MGetAsync(list.ToArray());
- var resultDictionary = list.Zip(values, (key, value) => new { key, value })
- .ToDictionary(item => item.key, item => item.value);
- dynamic result = new ExpandoObject();
- result.Items = resultDictionary;
- result.Cursor = scanResult.Cursor; // 下一次要通过这个Cursor获取下一页的keys
- return result;
- }
复制代码 5、主动化摆设
通过google/zx使用nodejs开发了一个脚本,用于主动化摆设
可以参考Github的所在:https://github.com/aehyok/zx-deploy
紧张是用于开发情况,通过- pnpm sun-baisc
- pnpm sun-ncdp
- pnpm sun-systemserivce
复制代码 固然你还可以通过组合下令举行摆设,比方想一起摆设三个服务- "pnpm sun-ncdp &&
- pnpm sun-basic &&
- pnpm sun-systemservice"
复制代码 这里我用的&&相当于上面三个下令串行实行,先实行sun-ncdp,再实行sun-basic,末了实行sun-systemservice。
如果你的电脑大概服务器性能富足好,可以使用&符号,如许就是并行实行,三个服务同时启动,如许可以节省时间。
以上仅展示了项目的部门内容,另有很多其他的技能应用和功能必要各人去发现。
然后我们可以下载源码参考文档并举行现实操纵,以便全面相识整个项目的技能应用和特性。
项目所在
Github:https://github.com/aehyok/.NET8.0
末了
如果你以为这篇文章对你有资助,不妨点个赞支持一下!你的支持是我继承分享知识的动力。如果有任何疑问或必要进一步的资助,欢迎随时留言。也可以参加微信公众号 [DotNet技能匠] 社区,与其他热爱技能的偕行一起交换心得,共同发展!
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |