一個輕量級的.Net Core微服務快速開發的輪子

前言

    Adnc是一個輕量級的.Net Core微服務快速開發框架,同時也能夠應用於單體架構系統的開發。框架基於JWT認證受權、集成了一系列微服務配套組件,代碼簡潔、易上手、學習成本低、開箱即用。

    前端基於Vue、後端服務基於.Net Core 3.1搭建,也是一個先後端分離的框架。webapi遵循RESTful風格,框架包含用戶、角色、權限、部門管理;字典、配置管理;登陸、審計、異常日誌管理等基礎的後臺模塊。

    框架對配置中心、依賴注入、日誌、緩存、模型映射、認證/受權、倉儲、服務註冊/發現、健康檢測、性能與鏈路監測、隊列、ORMEventBus等模塊進行更高一級的自動化封裝,更易於開發Asp.NET Core微服務項目。
前端

GitHub

演示

相關文檔

如何快速跑起來

如何手動部署到服務器

  • 詳細介紹如何使用docker安裝consul集羣、使用consul註冊中心、安裝配置skywalking,以及相關項目dockerfile文件編寫和配置等。
    請點擊連接,查看詳細介紹

目錄結構

  • ClientApp 前端項目(Vue)
  • ServerApi 後端項目(.NET Core 3.1)
  • Doc 項目相關文檔(sql腳本、docker腳本、docker-compose.yaml文件)
  • Tools 工具軟件

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
  • 界面
    .NET微服務開源框架-異常日誌界面
    .NET微服務開源框架-角色管理界面

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擴展
Efcore 微軟的ORM組件
Dapper 輕量級ORM組件
Z.EntityFramework.Plus.EFCore 第三方高性能的EfCore組件
NLog 日誌記錄組件
AutoMapper 模型映射組件
Swashbuckle.AspNetCore APIs文檔生成工具(swagger)
EasyCaching 實現了1、二級緩存管理的一個開源的組件
CAP 實現事件總線及最終一致性(分佈式事務)的一個開源的組件
RabbitMq 異步消息隊列組件
Polly 一個 .NET 彈性和瞬態故障處理庫,容許開發人員以 Fluent 和線程安全的方式來實現重試、斷路、超時、隔離和回退策略

後端解決方案

總體架構圖

Adnc.Infras 基礎架構相關工程

Adnc.Portal 微服務相關工程

.NET微服務開源框架-總體架構圖vue

Adnc.Infras 基礎架構相關工程

01.Adnc.WebApi.Shared

該層實現了認證、鑑權、異常捕獲等公共類和中間件。全部微服務WebApi層的共享層,而且都須要依賴該層。

.NET微服務開源框架-webpai-shared層mysql

02.Adnc.Application.Shared

該層定義了DTO對象的基類、Rpc服務通用服務、應用服務類基類以及操做日誌攔截器。全部微服務Application層的共享層,而且都須要依賴該層。

.NET微服務開源框架-application-shared層react

03.Adnc.Core.Shared

該層定義了Entity對象的基類、業務服務接口基類、UOW接口與攔截器、倉儲接口、以及處理本地事務與分佈式事務。全部微服務Core層的共享層,而且都須要依賴該層。

.NET微服務開源框架-core-shared層ios

04.Adnc.Infr.Common

該層實現了一些通用幫助類。該層不依賴任何層。

.NET微服務開源框架-基礎機構-common層git

10.Adnc.Infr.Gateway

該層是一個輸出項目,基於Ocelot實現的Api網關,若是項目採用總體結構開發,該項目能夠直接刪除。ocelot網關包含路由、服務聚合、服務發現、認證、鑑權、限流、熔斷、緩存、Header頭傳遞等功能。市面上主流網關還有Kong,Traefik,Ambassador,Tyk等。

.NET微服務開源框架-基礎機構-gateway層github

11.Adnc.Infr.HealthCheckUI

該層是一個輸出項目, AspNetCore.HealthChecks組件的Dashboard,直接配置須要監測的服務地址就能夠了,沒有代碼,關鍵的代碼參考webapi層的AddHealthChecks()方法。

.NET微服務開源框架-基礎機構-healthchecksui層web

20.Adnc.Infr.Consul

該層集成了Consul,提供服務的自動註冊、發現以及系統配置讀寫。

.NET微服務開源框架-基礎機構-cosnul層sql

21.Adnc.Infr.EasyCaching

該層集成了EasyCaching,負責1、二級緩存的管理,並重寫了EasyCaching攔截器部分代碼。

.NET微服務開源框架-基礎機構-easycaching層mongodb

22.Adnc.Infr.EfCore

該層負責Adnc.Core.Shared倉儲接口與Uow的EfCore的實現,負責mysql數據庫的操做。同時也集成了Dapper部分接口,用來處理複雜查詢。

.NET微服務開源框架-基礎機構-efcore層

23.Adnc.Infr.Mongo

該層負責Adnc.Core.Shared倉儲接口的Mongodb實現,負責mongodb數據庫的操做。

.NET微服務開源框架-基礎機構-mongodb層

23.Adnc.Infr.RabbitMq

該層集成了RabbitMq。封裝了發佈者與訂閱者等公共類,方便更加便捷的調用rabbitmq。

.NET微服務開源框架-基礎機構-rabbitmq層

Adnc.Portal 微服務相關工程

該層都是具體微服務業務的實現。

Adnc.Usr 用戶中心微服務,實現了用戶、角色、權限、部門管理。

Adnc.Maint 運維中心微服務,實現了登陸、審計、異常日誌管理以及一些配套組件的外鏈。

Adnc.Cus 客戶中心微服務,該層主要是一些demo。

每一個微服務的Migrations層是Efcore用來作數據遷移的,遷移的日誌文件存放在各自Migrations目錄中。

.NET微服務開源框架-微服務層

代碼片斷

[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)
            };
        }
    }
public class AccountAppService : IAccountAppService
    {
        private readonly IMapper _mapper;
        private readonly IEfRepository<SysUser> _userRepo;
        private readonly RabbitMqProducer _mqProducer;
        public AccountAppService(IMapper mapper,
            IEfRepository<SysUser> userRepo,
            RabbitMqProducer mqProducer)
        {
            _mapper = mapper;
            _userRepo = userRepo;
            _mqProducer = mqProducer;
        }

        public async Task<UserValidateDto> Login(UserValidateInputDto inputDto)
        {
            var user = await _userRepo.FetchAsync(x => new { x.Password, x.Salt, x.Name, x.Email, x.RoleId,x.Account,x.ID,x.Status }
            , x => x.Account == inputDto.Account);
            //todo......
            //..........
            _mqProducer.BasicPublish(MqConsts.Exchanges.Logs, MqConsts.RoutingKeys.Loginlog, log);
            return _mapper.Map<UserValidateDto>(user);
        }
    }

問題交流

License

MIT
Free Software, Hell Yeah!

相關文章
相關標籤/搜索