Adnc 轻量级的 .Net Core 微服务开发框架
微服务框架,同时也适用于单体架构系统的开发。支持经典三层与DDD架构开发模式、集成了一系列主流稳定的微服务配套技术栈。一个前后端分离的框架,前端基于Vue、后端基于.Net Core 3.1构建。
Adnc 是一个轻量级的 .Net Core 微服务开发框架,同时也适用于单体架构系统的开发。支持经典三层与DDD架构开发模式、集成了一系列主流稳定的微服务配套技术栈。一个前后端分离的框架,前端基于Vue、后端基于 .Net Core 3.1构建。Webapi遵循RESTful设计规范、基于JWT认证授权、基于Maxscale实现了读写分离、部署灵活、代码简洁、开箱即用、容器化微服务的最佳实践。
用户中心:系统支撑服务,实现了用户管理、角色管理、权限管理、菜单管理、组织架构管理
运维中心:系统支撑服务,实现了登录日志、审计日志、异常日志、字典管理、配置参数管理
客户中心:经典三层开发模式demo
订单中心:DDD开发模式demo
仓储中心:DDD开发模式demo
演示
文档
如何快速跑起来
- 详细介绍如何使用 docker 安装 reids、mysql、rabbitmq、mongodb,以及如何在本地配置 ClientApp、ServerApi。
请点击链接,查看详细介绍
如何手动部署到服务器
- 详细介绍如何使用 docker 安装 consul集群、使用 consul 注册中心、安装配置 Skywalking,以及相关项目 dockerfile 文件编写和配置等。
请点击链接,查看详细介绍
如何实现读写分离
- 详细介绍为什么要通过中间件实现读写分离以及 EFCore 基于中间件如何写代码。
请点击链接,查看详细介绍
如何使用 EFCore 仓储
- 详细介绍 EFCore 仓储基础功能、工作单元、CodeFirst,提供了丰富的演示代码以及演示代码对应的 Sql 语句。
请点击链接,查看详细介绍
目录结构
- 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) |
EasyCaching | 实现了一、二级缓存管理的一个开源的组件 |
CAP | 实现事件总线及最终一致性(分布式事务)的一个开源的组件 |
RabbitMq | 异步消息队列组件 |
Polly | 一个 .NET 弹性和瞬态故障处理库,允许开发人员以 Fluent 和线程安全的方式来实现重试、断路、超时、隔离和回退策略 |
FluentValidation | 一个 .NET 验证框架,支持链式操作,易于理解,功能完善,组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,支持本地化多语言 |
Maxscale | Mariadb开发的一款成熟、高性能、免费开源的数据库中间件 |
后端解决方案
整体架构图
Adnc.Infras
基础架构相关工程Adnc.Portal
微服务相关工程Adnc.Tests
框架测试相关工程
Adnc.Infras 基础架构相关工程
01.Adnc.WebApi.Shared
该层实现了认证、鉴权、异常捕获等公共类和中间件。所有微服务WebApi层的共享层,并且都需要依赖该层。
02.Adnc.Application.Shared
该层定义了DTO对象的基类、Rpc服务通用服务、应用服务类基类以及操作日志拦截器。所有微服务Application层的共享层,并且都需要依赖该层。
03.Adnc.Core.Shared
该层定义了Entity对象的基类、业务服务接口基类、UOW接口与拦截器、仓储接口、以及处理本地事务与分布式事务。所有微服务Core层的共享层,并且都需要依赖该层。
04.Adnc.Infr.Common
该层实现了一些通用帮助类。该层不依赖任何层。
10.Adnc.Infr.Gateway
该层是一个输出项目,基于Ocelot实现的Api网关,如果项目采用整体结构开发,该项目可以直接删除。ocelot网关包含路由、服务聚合、服务发现、认证、鉴权、限流、熔断、缓存、Header头传递等功能。市面上主流网关还有Kong,Traefik,Ambassador,Tyk等。
11.Adnc.Infr.HealthCheckUI
该层是一个输出项目, AspNetCore.HealthChecks组件的Dashboard,直接配置需要监测的服务地址就可以了,没有代码,关键的代码参考webapi层的AddHealthChecks()方法。
20.Adnc.Infr.Consul
该层集成了Consul,提供服务的自动注册、发现以及系统配置读写。
21.Adnc.Infr.EasyCaching
该层集成了EasyCaching,负责一、二级缓存的管理,并重写了EasyCaching拦截器部分代码。
22.Adnc.Infr.EfCore
该层负责Adnc.Core.Shared仓储接口与Uow的EfCore的实现,负责mysql数据库的操作。同时也集成了Dapper部分接口,用来处理复杂查询。
23.Adnc.Infr.Mongo
该层负责Adnc.Core.Shared仓储接口的Mongodb实现,负责mongodb数据库的操作。
23.Adnc.Infr.RabbitMq
该层集成了RabbitMq。封装了发布者与订阅者等公共类,方便更加便捷的调用 rabbitmq。
Adnc.Portal 微服务相关工程
该目录都是具体微服务业务的实现。
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)
};
}
}
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);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论