Adnc是一個輕量級的.Net Core微服務開發框架,同時也適用於單體架構系統的開發。支持經典三層與DDD架構開發模式、集成了一系列主流穩定的微服務配套技術棧。一個前后端分離的框架,前端基於Vue、后端基於.Net Core 3.1構建。Webapi遵循RESTful設計規范、基於JWT認證授權、基於Maxscale實現了讀寫分離、部署靈活、代碼簡潔、開箱即用、容器化微服務的最佳實踐。
- 用戶中心:系統支撐服務,實現了用戶管理、角色管理、權限管理、菜單管理、組織架構管理
- 運維中心:系統支撐服務,實現了登錄日志、審計日志、異常日志、字典管理、配置參數管理
- 客戶中心:經典三層開發模式demo
- 訂單中心:DDD開發模式demo
- 倉儲中心:DDD開發模式demo
文檔
如何快速跑起來
- 詳細介紹如何使用docker安裝redis、mysql、rabbitmq、mongodb,以及如何在本地配置ClientApp、ServerApi。
請點擊鏈接,查看詳細介紹
如何手動部署到服務器
- 詳細介紹如何使用docker安裝consul集群、使用consul注冊中心、安裝配置Skywalking,以及相關項目dockerfile文件編寫和配置等。
請點擊鏈接,查看詳細介紹
如何實現讀寫分離
- 詳細介紹為什么要通過中間件實現讀寫分離以及EFCore基於中間件如何寫代碼。
請點擊鏈接,查看詳細介紹
如何使用Cache Redis 分布式鎖 布隆過濾器
- 詳細介紹如何使用Cache、Redis、分布式鎖以及布隆過濾器。如何配置Cache防止雪崩、擊穿、穿透以及緩存同步。
請點擊鏈接,查看詳細介紹
如何動態分配雪花算法的WorkerId
- 詳細介紹Yitter雪花算法的特點、配置以及如何動態獲取WorkerId。
請點擊鏈接,查看詳細介紹
如何使用EFCore倉儲
- 詳細介紹EFCore倉儲基礎功能、工作單元、CodeFirst,提供了豐富的演示代碼以及演示代碼對應的Sql語句。
請點擊鏈接,查看詳細介紹
演示
問題交流
- 780634162(QQ群)
GitHub
- https://github.com/alphayu/adnc
- 開源不易,如果您喜歡這個項目, 請給個星星⭐️。
Roadmap
- 開發微服務項目生成工具
- 集成Dapr
- 集成Quartz.Net實現框架計划調度功能。
目錄結構
- src
- clientApp 前端項目(
Vue
) - serverApi 后端項目(
.NET Core 3.1
)
- clientApp 前端項目(
- doc 項目相關文檔(sql腳本、docker腳本、docker-compose.yaml文件)
- tools 工具軟件
- test 測試工程
ClientApp 前端項目
- ClientApp基於Vue-Element-Admin以及Web-Flash搭建,感謝兩位作者。
- 前端主要技術棧 Vue + Vue-Router + Vuex + Axios
- 構建步驟
# Install dependencies npm install --registry=https://registry.npm.taobao.org # Serve with hot reload at localhost:5001 npm run dev # Build for production with minification npm run build:prod
- 界面
ServerApi 后端項目
- ServerApi基於
.NET CORE 3.1
搭建。 - 后端主要技術棧
名稱 | 描述 |
---|---|
Ocelot | 基於 .NET Core 編寫的開源網關 |
Consul | 配置中心、注冊中心組件 |
Refit | 一個聲明式自動類型安全的RESTful服務調用組件,用於同步調用其他微服務 |
SkyAPM.Agent.AspNetCore | Skywalking .NET Core 探針,性能鏈路監測組件 |
AspNetCore.HealthChecks | 健康監測組件,搭配consul的健康監測 |
Autofac | IOC容器組件 |
Autofac.Extras.DynamicProxy | Autfac AOP擴展 |
Pomelo.EntityFrameworkCore.MySql | EFCore ORM組件 |
Dapper | 輕量級ORM組件 |
Z.EntityFramework.Plus.EFCore | 第三方高性能的EfCore組件 |
NLog | 日志記錄組件 |
AutoMapper | 模型映射組件 |
Swashbuckle.AspNetCore | APIs文檔生成工具(swagger) |
StackExchange.Redis | 開源的Redis客戶端SDK |
CAP | 實現事件總線及最終一致性(分布式事務)的一個開源的組件 |
RabbitMq | 異步消息隊列組件 |
Polly | 一個 .NET 彈性和瞬態故障處理庫,允許開發人員以 Fluent 和線程安全的方式來實現重試、斷路、超時、隔離和回退策略 |
FluentValidation | 一個 .NET 驗證框架,支持鏈式操作,易於理解,功能完善,組件內提供十幾種常用驗證器,可擴展性好,支持自定義驗證器,支持本地化多語言 |
Maxscale | Mariadb開發的一款成熟、高性能、免費開源的數據庫中間件 |
后端解決方案
整體架構圖
Infrastructures
基礎架構相關工程Services
微服務相關工程Tests
框架測試相關工程
Infrastructures基礎架構相關工程
01.Adnc.WebApi.Shared
該層實現了認證、鑒權、異常捕獲等公共類和中間件。所有微服務WebApi層的共享層,並且都需要依賴該層。
02.Adnc.Application.Shared
該層定義了DTO對象的基類、Rpc服務通用服務、應用服務類基類以及操作日志攔截器。所有微服務Application層的共享層,並且都需要依賴該層。
03.Adnc.Core.Shared
該層定義了Entity對象的基類、業務服務接口基類、UOW接口與攔截器、倉儲接口、以及處理本地事務與分布式事務。所有微服務Core層的共享層,並且都需要依賴該層。
04.Adnc.Infra.Common
該層實現了一些通用幫助類。該層不依賴任何層。
10.Adnc.Infra.Gateway
該層是一個輸出項目,基於Ocelot實現的Api網關,如果項目采用整體結構開發,該項目可以直接刪除。ocelot網關包含路由、服務聚合、服務發現、認證、鑒權、限流、熔斷、緩存、Header頭傳遞等功能。市面上主流網關還有Kong,Traefik,Ambassador,Tyk等。
11.Adnc.Infra.HealthCheckUI
該層是一個輸出項目, AspNetCore.HealthChecks組件的Dashboard,直接配置需要監測的服務地址就可以了,沒有代碼,關鍵的代碼參考webapi層的AddHealthChecks()方法。
20.Adnc.Infra.Consul
該層集成了Consul,提供服務的自動注冊、發現以及系統配置讀寫。
21.Adnc.Infra.EasyCaching
該層集成了EasyCaching,負責一、二級緩存的管理,並重寫了EasyCaching攔截器部分代碼。
22.Adnc.Infra.EfCore
該層負責Adnc.Core.Shared倉儲接口與Uow的EfCore的實現,負責mysql數據庫的操作。同時也集成了Dapper部分接口,用來處理復雜查詢。
23.Adnc.Infra.Mongo
該層負責Adnc.Core.Shared倉儲接口的Mongodb實現,負責mongodb數據庫的操作。
23.Adnc.Infra.RabbitMq
該層集成了RabbitMq。封裝了發布者與訂閱者等公共類,方便更加便捷的調用rabbitmq。
Services微服務相關工程
該層都是具體微服務業務的實現。
Adnc.Usr
用戶中心微服務,系統支撐服務,實現了用戶管理、角色管理、權限管理、菜單管理、組織架構管理。Adnc.Maint
運維中心微服務,系統支撐服務,實現了登錄日志、審計日志、異常日志、字典管理、配置參數管理。Adnc.Cus
客戶中心微服務,經典三層開發模式demo。Adnc.Ord
訂單中心微服務,DDD開發模式demo。Adnc.Whse
倉儲中心微服務,DDD開發模式demo。
每個微服務的Migrations層是Efcore用來做數據遷移的,遷移的日志文件存放在各自Migrations目錄中。
代碼片段
[Route("usr/session")] [ApiController] public class AccountController : ControllerBase { private readonly JWTConfig _jwtConfig; private readonly IAccountAppService _accountService; private readonly ILogger<AccountController> _logger; public AccountController(IOptionsSnapshot<JWTConfig> jwtConfig , IAccountAppService accountService , ILogger<AccountController> logger) { _jwtConfig = jwtConfig.Value; _accountService = accountService; _logger = logger; } /// <summary> /// 登錄/驗證 /// </summary> /// <param name="userDto"><see cref="UserValidateInputDto"/></param> /// <returns></returns> [AllowAnonymous] [HttpPost()] public async Task<UserTokenInfoDto> Login([FromBody]UserValidateInputDto userDto) { var userValidateDto = await _accountService.Login(userDto); return new UserTokenInfoDto { Token = JwtTokenHelper.CreateAccessToken(_jwtConfig, userValidateDto), RefreshToken = JwtTokenHelper.CreateRefreshToken(_jwtConfig, userValidateDto) }; } }
問題交流
- 企 鵝 群:780634162
- 博 客:https://www.cnblogs.com/alphayu
- GitHub :https://github.com/alphayu/adnc
- 項目網址:https://aspdotnetcore.net