.NET 8 微服务框架长什么样?集成 AI 智能体、多租户、自动调度与实时通信

前言

现在做系统,光会写接口已经不够了。越来越多项目要求支持多租户、分布式部署,还要集成登录认证、定时任务、实时通知,甚至加上 AI 功能。用 .NET 从头搭一套这样的架构,费时又容易踩坑。

本文推荐一个基于 .NET 8 的微服务脚手架。它按 DDD 分层,模块之间解耦清晰,常用功能都配好了,拿来就能用,省下大量搭架子的时间。

项目介绍

NetCoreKevin 是一套基于领域驱动设计(DDD)的 .NET 8 Web API 项目,采用前后端分离架构,前端用 Vue3 + Ant Design,后端按微服务思路设计。

它包含了实际项目中常用的功能:基于 IdentityServer4 的统一认证、细粒度权限控制、Quartz 定时任务、SignalR 实时通信、多租户支持(一库多租户),以及 Redis 缓存、CAP 事件总线、RabbitMQ 解耦等基础设施。

另外,也集成了一些实用的 AI 能力,比如用 OCR 自动识别验证码、通过 SemanticKernel 调用大模型、结合 Qdrant 实现 RAG 检索等。这些功能都以模块化方式封装,按需启用即可,适合需要快速搭建 SaaS 类系统的团队使用。

项目功能

1、安全认证体系

基于IdentityServer4实现OAuth2与OpenID Connect协议,支持单点登录(SSO)与多租户权限管理,通过API级别的权限控制确保系统安全。

2、分布式系统支持

通过CAP消息总线实现跨服务事件通信,结合Consul服务注册与发现机制,构建高可用的分布式架构。

3、智能缓存策略

集成Redis与内存缓存,支持多级缓存机制,显著提升系统响应速度。

4、自动化任务调度

基于Quartz.NET的定时任务系统,支持复杂调度规则与任务依赖管理,满足数据同步、清理等后台处理需求。

5、AI能力集成

嵌入SemanticKernel语义理解框架、OCR验证码识别与MCP协议服务,为业务注入智能基因。

6、多云存储与短信服务

支持阿里云、腾讯云等主流云服务商的文件存储与短信发送,降低企业上云门槛。

项目技术

技术亮点

.NET 8 最新的 .NET 框架,性能更优,支持更多新特性

DDD 领域驱动设计,将复杂业务逻辑抽象为模块化结构

微服务架构 通过 Consul、CAP、Quartz 等实现服务解耦和分布式管理

CAP 消息总线,用于跨服务事件通信

MediatR 领域事件处理

IdentityServer4 安全认证中心,支持 OAuth2 和 OpenID Connect

Quartz 定时任务调度

EF Core ORM 工具,用于数据库操作

Docker 容器化部署,便于环境管理

AI 集成 SemanticKernel、MCP 服务、OCR 验证码识别等 AI 技术

AI 集成说明

AI 模块包括:

SemanticKernel:语义理解框架,支持自然语言处理。

OCR 验证码识别:通过 AI 技术识别验证码图像。

MCP 服务:用于 AI 服务通信或协议扩展。

项目框架

DDD思想

思维导图

项目核心

分层结构和模块化设计

项目启动与配置

1、配置 Redis 和数据库

项目启动前需在 JSON 配置文件中设置 Redis 和数据库连接字符串。默认使用 MySQL,可根据需要更换数据库类型。数据库结构可通过 EF Core 迁移脚本生成。

2、Docker 部署

项目提供完整的 Dockerfile 和相关配置文件,支持容器化部署。

3、JSON 配置

所有模块(包括缓存、短信、日志、AI 等)均通过 JSON 文件进行配置,便于环境隔离和灵活调整。

项目上手教程

1、配置数据库连接

编辑 appsettings.json,填写正确的 MySQL 连接字符串。如不熟悉 EF Core,可参考微软官方文档。

2、初始化数据库

在 Kevin.EntityFrameworkCore 项目目录下执行以下命令:

bash 复制代码
Add-Migration "初始化数据库"  
Update-Database

3、启动主 API 服务

运行 App.WebApi 项目。首次启动会自动初始化种子数据(定义位于 kevin.Domain.BaseDatas)。

启动成功后,访问 http://localhost:9901/swagger/index.html 查看 API 文档。

4、启动认证中心

运行 App.AuthorizationService 项目,作为统一身份认证与授权服务。

5、启动前端

进入 vue 目录,依次执行:

bash 复制代码
npm install  
npm run dev(开发模式)

bash 复制代码
npm run build(生产构建)

项目代码

文件上传控制器

cs 复制代码
/// <summary>
/// 通过图片文件ID获取图片
/// </summary>
/// <param name="fileId">图片ID</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <param name="cancellationToken">cancellationToken</param>
/// <returns></returns>
/// <remarks>不指定宽高参数,返回原图</remarks>
[AllowAnonymous]
[HttpGet("GetImage")]
public FileResult GetImage([Required] Guid fileId, int width, int height, CancellationToken cancellationToken)
{

    var file = db.Set<TFile>().Where(t => t.Id == fileId).FirstOrDefault();
    var path = Kevin.Common.App.IO.Path.ContentRootPath() + file.Path;

    var stream = System.IO.File.OpenRead(path);

    string fileExt = Path.GetExtension(path);

    var provider = new FileExtensionContentTypeProvider();

    var memi = provider.Mappings[fileExt];

    if (width == 0 && height == 0)
    {
        return File(stream, memi, file.Name);
    }
    else
    {
        using var original = SKBitmap.Decode(path);
        if (original.Width < width || original.Height < height)
        {
            return File(stream, memi, file.Name);
        }
        else
        {

            if (width != 0 && height == 0)
            {
                var percent = ((float)width / (float)original.Width);

                width = (int)(original.Width * percent);
                height = (int)(original.Height * percent);
            }

            if (width == 0 && height != 0)
            {
                var percent = ((float)height / (float)original.Height);

                width = (int)(original.Width * percent);
                height = (int)(original.Height * percent);
            }
            var SKSamplingOptions = new SKSamplingOptions();  
            using var resizeBitmap = original.Resize(new SKImageInfo(width, height), SKSamplingOptions);
            using var image = SKImage.FromBitmap(resizeBitmap);
            using var imageData = image.Encode(SKEncodedImageFormat.Png, 100);
            return File(imageData.ToArray(), "image/png");
        }

    }
}

/// <summary>
/// 通过文件ID获取文件静态访问路径
/// </summary>
/// <param name="fileid">文件ID</param>
/// <param name="cancellationToken">cancellationToken</param>
/// <returns></returns>
[HttpGet("GetFilePath")]
public async Task<string> GetFilePath([Required] Guid fileid, CancellationToken cancellationToken)
{
    return  await _fileService.GetFilePath(fileid, cancellationToken); 
} 

项目效果

AI集成

系统首页

后台自动任务调度系统(基于Quartz.NET

基础API

项目源码

项目源码包含完整代码、配置文件与说明文档。

Gitee:https://gitee.com/netkevin-li/NetCoreKevin

总结

NetCoreKevin 是一个非常完整的微服务架构项目,结合了 DDD、CAP、Quartz、EFCore 等多种技术,并集成了 AI、OCR、短信、文件存储等实用功能。其模块化设计使每个功能都可以独立引用,非常适合大型企业级应用的开发。

关键词

NetCoreKevin、.NET 8、DDD架构、微服务、AI集成、IdentityServer4、CAP事件总线、Quartz调度、Vue3前端、模块化设计、DDD、微服务、多租户、AI智能体、.NET8、Vue3、SignalR、Quartz、CAP、RAG

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

相关推荐
元Y亨H2 小时前
Nacos - 服务注册
java·微服务
追逐时光者4 小时前
TIOBE 公布 C# 是 2025 年度编程语言
后端·.net
ServBay9 小时前
C# 成为 2025 年的编程语言,7个C#技巧助力开发效率
后端·c#·.net
码间拾光・菲林斯9 小时前
PostgreSQL 微服务架构开发实战:数据一致性、多租户设计与框架集成
微服务·postgresql·架构
獨枭10 小时前
.NET Framework 依赖版本冲突解决方案:从现象到本质
.net
超级小猪11 小时前
006-spring cloud alibaba之gateway网关-过滤器Filter
微服务
一只鱼丸yo12 小时前
Service Mesh:微服务治理的下一代方案
微服务·云原生·service_mesh
云草桑13 小时前
.net AI API应用 客户发的信息提取对接上下游系统报价
ai·c#·.net·semantickernel·sk
虫小宝14 小时前
导购app佣金模式微服务拆分:领域驱动设计在返利系统中的实践
微服务·云原生·架构
Mr_sun.15 小时前
Day01——微服务服务注册与发现
微服务·云原生·架构