.NET 8.0 开源项目伪微服务框架

2024-08-23 23:44

本文主要是介绍.NET 8.0 开源项目伪微服务框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

项目介绍

项目核心

项目框架

项目说明

1、业务功能

2、生成文档工具

3、分布式雪花Id生成器

4、分布式缓存和分布式锁

5、自动化部署

项目地址


前言

嘿,小伙伴们!最近看到了一个 .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下载项目源码,我们可以查看项目框架,具体如下图所示:

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 所使用的开源类库:GitHub - stulzq/snowflake-net: Twitter的分布式全局唯一ID算法,雪花(snowflake)算法。支持.NET Core 2.0。Twitter's snowflake for .net core

/// <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;
}作者:小码编匠
链接:https://juejin.cn/post/7406147685303451684
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

其中 WorkerId和DatacenterId保持不同的话,例如两个微服务WorkerId一个为1一个为2,那么在同一毫秒数生成的Id肯定是不同的。

同一个IdWorker在一个毫秒中可以生成4096个序列号 足够大型系统使用了,不怕重复的问题。

4、分布式缓存和分布式锁

Redis 统一封装实现分布式缓存和分布式锁,所使用的开源类库:GitHub - 2881099/csredis: .NET Core or .NET Framework 4.0+ client for Redis and Redis Sentinel (2.8) and Cluster. Includes both synchronous and asynchronous clients.

目前主要封装了几个常用的接口方法

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();
}作者:小码编匠
链接:https://juejin.cn/post/7406147685303451684
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

主要是为了保持与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获取下一页的keysreturn result;
}作者:小码编匠
链接:https://juejin.cn/post/7406147685303451684
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
5、自动化部署

通过google/zx使用nodejs开发了一个脚本,用于自动化部署

可以参考Github的地址:GitHub - aehyok/zx-deploy: google/zx typescript nodejs autodeploy tool

主要是用于开发环境,通过

pnpm sun-baisc
pnpm sun-ncdp
pnpm sun-systemserivce

当然你还可以通过组合命令进行部署,例如想一起部署三个服务

pnpm sun-all 其实就是  "pnpm sun-ncdp && pnpm sun-basic && pnpm sun-systemservice"

这里我用的&&相当于上面三个命令串行执行,先执行sun-ncdp,再执行sun-basic,最后执行sun-systemservice。

如果你的电脑或者服务器性能足够好,可以使用&符号,这样就是并行执行,三个服务同时启动,这样可以节省时间。

以上仅展示了项目的部分内容,还有许多其他的技术应用和功能等待大家学习。大家可以下载源码参考文档并进行实际操作,以便全面了解整个项目的技术应用和特性。

项目地址

Github:GitHub - aehyok/.NET8.0: net8.0 efcore mysql redis rabbitmq 微服务GitHub - aehyok/.NET8.0: net8.0 efcore mysql redis rabbitmq 微服务GitHub - aehyok/.NET8.0: net8.0 efcore mysql redis rabbitmq 微服务

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

这篇关于.NET 8.0 开源项目伪微服务框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100834

相关文章

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客