博客 / 詳情

返回

.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 項目目錄下執行以下命令:

Add-Migration "初始化數據庫"  
Update-Database

3、啓動主 API 服務

運行 App.WebApi 項目。首次啓動會自動初始化種子數據(定義位於 kevin.Domain.BaseDatas)。

啓動成功後,訪問 http://localhost:9901/swagger/index.html 查看 API 文檔。

4、啓動認證中心

運行 App.AuthorizationService 項目,作為統一身份認證與授權服務。

5、啓動前端

進入 vue 目錄,依次執行:

npm install  
npm run dev(開發模式)

npm run build(生產構建)

項目代碼

文件上傳控制器

/// <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技術匠] 社區,與其他熱愛技術的同行一起交流心得,共同成長!

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.