一个轻量级的.Net Core微服务快速开发的轮子
前言
Adnc是一个轻量级的.Net Core微服务快速开发框架,同时也可以应用于单体架构系统的开发。框架基于JWT认证授权、集成了一系列微服务配套组件,代码简洁、易上手、学习成本低、开箱即用。
前端基于Vue、后端服务基于.Net Core 3.1搭建,也是一个前后端分离的框架。webapi遵循RESTful风格,框架包含用户、角色、权限、部门管理;字典、配置管理;登录、审计、异常日志管理等基础的后台模块。
框架对配置中心、依赖注入、日志、缓存、模型映射、认证/授权、仓储、服务注册/发现、健康检测、性能与链路监测、队列、ORM、EventBus等模块进行更高一级的自动化封装,更易于开发Asp.NET Core微服务项目。
GitHub
演示
相关文档
如何快速跑起来
- 详细介绍如何使用docker安装
reids、mysql、rabbitmq、mongodb,以及如何在本地配置ClientApp、ServerApi。
请点击链接,查看详细介绍
如何手动部署到服务器
- 详细介绍如何使用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
- 界面


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 | 实现了一、二级缓存管理的一个开源的组件 |
| CAP | 实现事件总线及最终一致性(分布式事务)的一个开源的组件 |
| RabbitMq | 异步消息队列组件 |
| Polly | 一个 .NET 弹性和瞬态故障处理库,允许开发人员以 Fluent 和线程安全的方式来实现重试、断路、超时、隔离和回退策略 |
后端解决方案
整体架构图
Adnc.Infras 基础架构相关工程
Adnc.Portal 微服务相关工程

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。
每个微服务的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);
}
}
问题交流
- 企 鹅 群:780634162
- 博 客:https://www.cnblogs.com/alphayu
- GitHub :https://github.com/alphayu/adnc
- 项目网址:https://aspdotnetcore.net
License
MIT
Free Software, Hell Yeah!
一个轻量级的.Net Core微服务快速开发的轮子的更多相关文章
- Adnc如何本地调试 - 一个轻量级的.Net Core微服务开发框架
前言 Adnc是一个轻量级的.Net Core微服务开发框架,同样适用于单体架构系统的开发. 如果只是想本地调试,只需要安装必备软件,必备软件除开发工具外,其它软件建议大家都使用`do ...
- net core 微服务 快速开发框架 Viper 初体验2020-10-17
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- 不死的小强 .net core 微服务 快速开发框架 Viper 限流
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- net core 微服务 快速开发框架
dymDemo github 地址:https://github.com/duyanming/dymDemo dym 分布式开发框架 Demo 熔断 限流 事件总线(包括基于内存的.rabbitmq的 ...
- net core 微服务框架 Viper 调用链路追踪
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- hello world .net core 微服务框架 Viper
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- .NET Core微服务之基于Polly+AspectCore实现熔断与降级机制
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.熔断.降级与AOP 1.1 啥是熔断? 在广义的解释中,熔断主要是指为控制股票.期货或其他金融衍生产品的交易风险,为其单日价格波动幅度 ...
- .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...
- .NET Core微服务之开源项目CAP的初步使用
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.CAP简介 下面的文字来自CAP的Wiki文档:https://github.com/dotnetcore/CAP/wiki CAP ...
随机推荐
- PyQt学习随笔:槽函数获取信号发送对象的方法
在PyQt中,相似控件发送的信号可以每个控件信号对应一个槽函数,也可以将相似控件的相同信号对应到一个槽函数,但如果槽函数相同,怎么区分信号是谁发送的呢?那就是在信号函数中使用sender()函数获取信 ...
- Python自动发射弹幕
Python自动发射弹幕,弹幕护体 - 环境: Python3+Windows- 开发工具: PyCharm 学习效果:1. 学会使用Python刷弹幕2. 配置INI文件信息3. 掌握网络请求知识4 ...
- 什么是VIP?什么是IP漂移?
IP地址和MAC地址 在 TCP/IP 的架构下,所有想上网的电脑,不论是用何种方式连上网路,都必须要有一个唯一的 IP-address.事实上IP地址是主机硬件地址的一种抽象,简单的说,MAC地址是 ...
- Number.isNaN和isNaN
isNaN会通过Number方法,试图将字符串"测试"转换成Number类型,但转换失败了,因为 Number('测试') 的结果为NaN ,所以最后返回true. 而Number ...
- nginx学习之——CentOS6.0下安装nginx
1.下载对应nginx版本 #注:下载地址:http://nginx.org/download/ wget -c http://nginx.org/download/nginx-1.10.3.tar. ...
- 阿里云OSS生成sts令牌
业务场景: 如果前端直接上传文件到OSS,势必要暴露令牌,无法精准控制上传内容等,使用临时令牌即可解决这个问题. 先去阿里云后台设置好token,角色,地区等 pom.xml <dependen ...
- Day5 - 02 定义函数
定义函数 Python中定义函数要使用def语句. 依次写出函数名.括号.括号中的参数和冒号,在缩进块中编写函数体,通过return语句返回函数返回值.如: ...
- Java IO流 FileOutputStream、FileInputStream的用法
FileOutputStream.FileInputStream的使用 FileOutputStream是OutputStream的继承类,它的主要功能就是向磁盘上写文件.FileOutputStre ...
- druid数据源yml配置
application.yml配置 spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:33 ...
- webpack入门级 - 从0开始搭建单页项目配置
前言 webpack 作为前端最知名的打包工具,能够把散落的模块打包成一个完整的应用,大多数的知名框架 cli 都是基于 webpack 来编写.这些 cli 为使用者预设好各种处理配置,使用多了就会 ...