保举 .NET 8.0 开源项目伪微服务框架 [复制链接]
发表于 2026-2-5 23:54:31 | 显示全部楼层 |阅读模式
媒介

嘿,小搭档们!迩来看到了一个 .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
  1. /// <summary>
  2. /// 分布式雪花Id生成器
  3. /// </summary>
  4. public class SnowFlake
  5. {
  6.     /// <summary>
  7.     /// 通过静态类只实例化一次IdWorker 否则生成的Id会有重复
  8.     /// </summary>
  9.     private static readonly Lazy<IdWorker> _instance = new(() =>
  10.     {
  11.         var commonOptions = App.Options<CommonOptions>();
  12.         return new IdWorker(commonOptions.WorkerId, commonOptions.DatacenterId);
  13.     });
  14.     public static IdWorker Instance = _instance.Value;
  15. }
复制代码
此中 WorkerId和DatacenterId保持差别的话,比方两个微服务WorkerId一个为1一个为2,那么在同一毫秒数天生的Id肯定是差别的。
同一个IdWorker在一个毫秒中可以天生4096个序列号 富足大型体系使用了,不怕重复的题目。
4、分布式缓存和分布式锁

Redis 同一封装实现分布式缓存和分布式锁,所使用的开源类库:https://github.com/2881099/csredis
现在紧张封装了几个常用的接口方法
  1. public interface IRedisService
  2. {
  3.     /// <summary>
  4.     /// 查看服务是否运行
  5.     /// </summary>
  6.     /// <returns></returns>
  7.     bool PingAsync();
  8.     /// <summary>
  9.     /// 根据key获取缓存
  10.     /// </summary>
  11.     /// <param name="key"></param>
  12.     /// <returns></returns>
  13.     Task<T> GetAsync<T>(string key);
  14.     /// <summary>
  15.     /// 设置指定key的缓存值(不过期)
  16.     /// </summary>
  17.     /// <param name="key"></param>
  18.     /// <param name="value"></param>
  19.     /// <returns></returns>
  20.     Task<bool> SetAsync(string key, object value);
  21.     /// <summary>
  22.     /// 设置指定key的缓存值(可设置过期时间和Nx、Xx)
  23.     /// </summary>
  24.     /// <param name="key"></param>
  25.     /// <param name="value"></param>
  26.     /// <param name="expire"></param>
  27.     /// <param name="exists"></param>
  28.     /// <returns></returns>
  29.     Task<bool> SetAsync(string key, object value, TimeSpan expire, RedisExistence? exists = null);
  30.     /// <summary>
  31.     /// 设置指定key的缓存值(可设置过期秒数和Nx、Xx)
  32.     /// </summary>
  33.     /// <param name="key"></param>
  34.     /// <param name="value"></param>
  35.     /// <param name="expireSeconds">过期时间单位为秒</param>
  36.     /// <param name="exists"></param>
  37.     /// <returns></returns>
  38.     Task<bool> SetAsync(string key, object value, int expireSeconds = -1, RedisExistence? exists = null);
  39.     /// <summary>
  40.     /// 删除Key
  41.     /// </summary>
  42.     /// <param name="key"></param>
  43.     /// <returns></returns>
  44.     Task<long> DeleteAsync(string key);
  45.     Task<Dictionary<string,string>> ScanAsync();
  46. }
复制代码
紧张是为了保持与redis cli中的方法同等,选了这个类库,固然你也可以选择其他的类库 还是蛮多的。
同时还封装了一个接口用于前端监测全部的key和value。
  1. public async Task<dynamic> ScanAsync(PagedQueryModelBase model)
  2. {
  3.     List<string> list = new List<string>();
  4.     //根沐model.Keyword进行模糊匹配
  5.     var scanResult = await RedisHelper.ScanAsync(model.Page, $"*{model.Keyword}*", model.Limit);
  6.     list.AddRange(scanResult.Items);
  7.     var values = await RedisHelper.MGetAsync(list.ToArray());
  8.     var resultDictionary = list.Zip(values, (key, value) => new { key, value })
  9.                                     .ToDictionary(item => item.key, item => item.value);
  10.     dynamic result = new ExpandoObject();
  11.     result.Items = resultDictionary;
  12.     result.Cursor = scanResult.Cursor;  // 下一次要通过这个Cursor获取下一页的keys
  13.    return result;
  14. }
复制代码
5、主动化摆设

通过google/zx使用nodejs开发了一个脚本,用于主动化摆设
可以参考Github的所在:https://github.com/aehyok/zx-deploy
紧张是用于开发情况,通过
  1. pnpm sun-baisc
  2. pnpm sun-ncdp
  3. pnpm sun-systemserivce
复制代码
固然你还可以通过组合下令举行摆设,比方想一起摆设三个服务
  1. pnpm sun-all
复制代码
  1. 其实就是  
复制代码
  1. "pnpm sun-ncdp &&
  2. pnpm sun-basic &&
  3. pnpm sun-systemservice"
复制代码
这里我用的&&相当于上面三个下令串行实行,先实行sun-ncdp,再实行sun-basic,末了实行sun-systemservice。
如果你的电脑大概服务器性能富足好,可以使用&符号,如许就是并行实行,三个服务同时启动,如许可以节省时间。
以上仅展示了项目的部门内容,另有很多其他的技能应用和功能必要各人去发现。
然后我们可以下载源码参考文档并举行现实操纵,以便全面相识整个项目的技能应用和特性。
项目所在

Github:https://github.com/aehyok/.NET8.0
末了

如果你以为这篇文章对你有资助,不妨点个赞支持一下!你的支持是我继承分享知识的动力。如果有任何疑问或必要进一步的资助,欢迎随时留言。也可以参加微信公众号 [DotNet技能匠] 社区,与其他热爱技能的偕行一起交换心得,共同发展!


免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表