在家千日好 發表於 2025-12-8 14:14:00

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

<h1 id="前言">前言</h1>
<p>现在做系统,光会写接口已经不够了。越来越多项目要求支持多租户、分布式部署,还要集成登录认证、定时任务、实时通知,甚至加上 AI 功能。用 .NET 从头搭一套这样的架构,费时又容易踩坑。</p>
<p>本文推荐一个基于 .NET 8 的微服务脚手架。它按 DDD 分层,模块之间解耦清晰,常用功能都配好了,拿来就能用,省下大量搭架子的时间。</p>
<h2 id="项目介绍">项目介绍</h2>
<p>NetCoreKevin 是一套基于领域驱动设计(DDD)的 .NET 8 Web API 项目,采用前后端分离架构,前端用 Vue3 + Ant Design,后端按微服务思路设计。</p>
<p>它包含了实际项目中常用的功能:基于 IdentityServer4 的统一认证、细粒度权限控制、Quartz 定时任务、SignalR 实时通信、多租户支持(一库多租户),以及 Redis 缓存、CAP 事件总线、RabbitMQ 解耦等基础设施。</p>
<p>另外,也集成了一些实用的 AI 能力,比如用 OCR 自动识别验证码、通过 SemanticKernel 调用大模型、结合 Qdrant 实现 RAG 检索等。这些功能都以模块化方式封装,按需启用即可,适合需要快速搭建 SaaS 类系统的团队使用。</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126153210991-56841971.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2 id="项目功能">项目功能</h2>
<p><strong>1、安全认证体系</strong></p>
<p>基于IdentityServer4实现OAuth2与OpenID Connect协议,支持单点登录(SSO)与多租户权限管理,通过API级别的权限控制确保系统安全。</p>
<p><strong>2、分布式系统支持</strong></p>
<p>通过CAP消息总线实现跨服务事件通信,结合Consul服务注册与发现机制,构建高可用的分布式架构。</p>
<p><strong>3、智能缓存策略</strong></p>
<p>集成Redis与内存缓存,支持多级缓存机制,显著提升系统响应速度。</p>
<p><strong>4、自动化任务调度</strong></p>
<p>基于Quartz.NET的定时任务系统,支持复杂调度规则与任务依赖管理,满足数据同步、清理等后台处理需求。</p>
<p><strong>5、AI能力集成</strong></p>
<p>嵌入SemanticKernel语义理解框架、OCR验证码识别与MCP协议服务,为业务注入智能基因。</p>
<p><strong>6、多云存储与短信服务</strong></p>
<p>支持阿里云、腾讯云等主流云服务商的文件存储与短信发送,降低企业上云门槛。</p>
<h2 id="项目技术">项目技术</h2>
<h3 id="技术亮点">技术亮点</h3>
<p>.NET 8 最新的 .NET 框架,性能更优,支持更多新特性</p>
<p>DDD 领域驱动设计,将复杂业务逻辑抽象为模块化结构</p>
<p>微服务架构 通过 Consul、CAP、Quartz 等实现服务解耦和分布式管理</p>
<p>CAP 消息总线,用于跨服务事件通信</p>
<p>MediatR 领域事件处理</p>
<p>IdentityServer4 安全认证中心,支持 OAuth2 和 OpenID Connect</p>
<p>Quartz 定时任务调度</p>
<p>EF Core ORM 工具,用于数据库操作</p>
<p>Docker 容器化部署,便于环境管理</p>
<p>AI 集成 SemanticKernel、MCP 服务、OCR 验证码识别等 AI 技术</p>
<h3 id="ai-集成说明">AI 集成说明</h3>
<p>AI 模块包括:</p>
<p>SemanticKernel:语义理解框架,支持自然语言处理。</p>
<p>OCR 验证码识别:通过 AI 技术识别验证码图像。</p>
<p>MCP 服务:用于 AI 服务通信或协议扩展。</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126154105424-73423872.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2 id="项目框架">项目框架</h2>
<h3 id="ddd思想">DDD思想</h3>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126152428388-1060454711.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h3 id="思维导图">思维导图</h3>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126152445215-1898205483.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h3 id="项目核心">项目核心</h3>
<p><strong>分层结构和模块化设计</strong></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126152608033-1846108587.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2 id="项目启动与配置">项目启动与配置</h2>
<p><strong>1、配置 Redis 和数据库</strong></p>
<p>项目启动前需在 JSON 配置文件中设置 Redis 和数据库连接字符串。默认使用 MySQL,可根据需要更换数据库类型。数据库结构可通过 EF Core 迁移脚本生成。</p>
<p><strong>2、Docker 部署</strong></p>
<p>项目提供完整的 Dockerfile 和相关配置文件,支持容器化部署。</p>
<p><strong>3、JSON 配置</strong></p>
<p>所有模块(包括缓存、短信、日志、AI 等)均通过 JSON 文件进行配置,便于环境隔离和灵活调整。</p>
<h2 id="项目上手教程">项目上手教程</h2>
<p><strong>1、配置数据库连接</strong></p>
<p>编辑 appsettings.json,填写正确的 MySQL 连接字符串。如不熟悉 EF Core,可参考微软官方文档。</p>
<p><strong>2、初始化数据库</strong></p>
<p>在 Kevin.EntityFrameworkCore 项目目录下执行以下命令:</p>
<pre><code class="language-bash">Add-Migration "初始化数据库"
Update-Database
</code></pre>
<p><strong>3、启动主 API 服务</strong></p>
<p>运行 App.WebApi 项目。首次启动会自动初始化种子数据(定义位于 kevin.Domain.BaseDatas)。</p>
<p>启动成功后,访问 http://localhost:9901/swagger/index.html 查看 API 文档。</p>
<p><strong>4、启动认证中心</strong></p>
<p>运行 App.AuthorizationService 项目,作为统一身份认证与授权服务。</p>
<p><strong>5、启动前端</strong></p>
<p>进入 vue 目录,依次执行:</p>
<pre><code class="language-bash">npm install
npm run dev(开发模式)
</code></pre>
<p>或</p>
<pre><code class="language-bash">npm run build(生产构建)
</code></pre>
<h2 id="项目代码">项目代码</h2>
<p>文件上传控制器</p>
<pre><code class="language-cs">/// &lt;summary&gt;
/// 通过图片文件ID获取图片
/// &lt;/summary&gt;
/// &lt;param name="fileId"&gt;图片ID&lt;/param&gt;
/// &lt;param name="width"&gt;宽度&lt;/param&gt;
/// &lt;param name="height"&gt;高度&lt;/param&gt;
/// &lt;param name="cancellationToken"&gt;cancellationToken&lt;/param&gt;
/// &lt;returns&gt;&lt;/returns&gt;
/// &lt;remarks&gt;不指定宽高参数,返回原图&lt;/remarks&gt;


public FileResult GetImage( Guid fileId, int width, int height, CancellationToken cancellationToken)
{

    var file = db.Set&lt;TFile&gt;().Where(t =&gt; 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;

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

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

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

            if (width == 0 &amp;&amp; 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");
      }

    }
}

/// &lt;summary&gt;
/// 通过文件ID获取文件静态访问路径
/// &lt;/summary&gt;
/// &lt;param name="fileid"&gt;文件ID&lt;/param&gt;
/// &lt;param name="cancellationToken"&gt;cancellationToken&lt;/param&gt;
/// &lt;returns&gt;&lt;/returns&gt;

public async Task&lt;string&gt; GetFilePath( Guid fileid, CancellationToken cancellationToken)
{
    returnawait _fileService.GetFilePath(fileid, cancellationToken);
}
</code></pre>
<h2 id="项目效果">项目效果</h2>
<p><strong>AI集成</strong></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126153307448-1634430006.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126153547903-1484116474.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><strong>系统首页</strong></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126153640868-461673202.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><strong>后台自动任务调度系统(基于Quartz.NET)</strong></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126153811843-121721508.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><strong>基础API</strong></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202511/576536-20251126154441490-1154492042.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2 id="项目源码">项目源码</h2>
<p>项目源码包含完整代码、配置文件与说明文档。</p>
<p>Gitee:https://gitee.com/netkevin-li/NetCoreKevin</p>
<h2 id="总结">总结</h2>
<p>NetCoreKevin 是一个非常完整的微服务架构项目,结合了 DDD、CAP、Quartz、EFCore 等多种技术,并集成了 AI、OCR、短信、文件存储等实用功能。其模块化设计使每个功能都可以独立引用,非常适合大型企业级应用的开发。</p>
<h2 id="关键词">关键词</h2>
<p>NetCoreKevin、.NET 8、DDD架构、微服务、AI集成、IdentityServer4、CAP事件总线、Quartz调度、Vue3前端、模块化设计、DDD、微服务、多租户、AI智能体、.NET8、Vue3、SignalR、Quartz、CAP、RAG</p>
<h2 id="最后">最后</h2>
<p>如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。</p>
<p>也可以加入微信公众号 社区,与其他热爱技术的同行一起交流心得,共同成长!</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250527195524293-1794896295.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p><br><br>
来源:https://www.cnblogs.com/1312mn/p/19273206
頁: [1]
查看完整版本: .NET 8 微服务框架长什么样?集成 AI 智能体、多租户、自动调度与实时通信