/Adnc

.NET6微服务/分布式开发框架,同时也适用于单体架构系统的开发。

Primary LanguageC#MIT LicenseMIT

GitHub license GitHub stars GitHub forks

Adnc是一个微服务开发框架 代码改变世界 开源推动社区

代码改变世界,开源推动社区

    Adnc是一个轻量级的完全可以落地的微服务/分布式开发框架,同时也适用于单体架构系统的开发。支持经典三层与DDD架构开发模式、集成了一系列主流稳定的微服务配套技术栈。一个前后端分离的框架,前端基于Vue、后端基于.Net6构建。WebApi遵循RESTful设计规范、基于JWT认证授权、基于Maxscale实现了读写分离、部署灵活、代码简洁、开箱即用、容器化微服务的最佳实践。

  • 用户中心:系统支撑服务,实现了用户管理、角色管理、权限管理、菜单管理、组织架构管理
  • 运维中心:系统支撑服务,实现了登录日志、审计日志、异常日志、字典管理、配置参数管理
  • 客户中心:经典三层开发模式demo
  • 订单中心:DDD开发模式demo
  • 仓储中心:DDD开发模式demo

问题交流

文档

如何快速跑起来

如何手动部署到容器

  • 详细介绍如何使用docker安装配置consul集群、Skywalking系列组件、相关项目的dockerfile文件编写与配置以及如何将多个服务部署到服务器。
    请点击链接,查看详细介绍

如何实现读写分离

如何使用Cache Redis 分布式锁 布隆过滤器

  • 详细介绍如何使用Cache、Redis、分布式锁以及布隆过滤器。如何配置Cache防止雪崩、击穿、穿透以及缓存同步。
    请点击链接,查看详细介绍

如何动态分配雪花算法的WorkerId

如何认证与授权

如何使用EFCore仓储

详细介绍EFCore仓储基础功能、工作单元、CodeFirst,执行原生SQL等提供了丰富的演示代码以及演示代码对应的Sql语句。

  1. 如何使用仓储(一)-基础功能
  2. 如何使用仓储(二)-分布式事务/本地事务
  3. 如何使用仓储(三)-CodeFirst
  4. 如何使用仓储(四)-撸SQL
  5. 如何使用仓储(五)-切换数据库类型

总体结构设计

  • 经典三层 .NET微服务开源框架-总体设计
  • DDD三层 .NET微服务开源框架-总体设计
  • 总体结构 .NET微服务开源框架-总体设计

代码片段

internal static class Program
{
    internal static async Task Main(string[] args)
    {
        var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
        logger.Debug($"init {nameof(Program.Main)}");
        try
        {
            var webApiAssembly = System.Reflection.Assembly.GetExecutingAssembly();
            var serviceInfo = Shared.WebApi.ServiceInfo.CreateInstance(webApiAssembly);
            
            var app = WebApplication
                .CreateBuilder(args)
                .ConfigureAdncDefault(args, serviceInfo)
                .Build();

            app.UseAdncDefault(endpointRoute: endpoint =>
            {
                endpoint.MapGrpcService<Grpc.MaintGrpcServer>();
            });

            await app
                .ChangeThreadPoolSettings()
                .UseRegistrationCenter()
                .RunAsync();
        }
        catch (Exception ex)
        {
            logger.Error(ex, "Stopped program because of exception");
            throw;
        }
        finally
        {
            LogManager.Shutdown();
        }
    }
}

Jmeter测试

  • ECS服务器配置:4核8G,带宽8M。服务器上装了很多东西,剩余大约50%的CPU资源,50%的内存资源。
  • 因为服务器带宽限制,吞吐率约1000/s左右。
  • 模拟并发线程1200/s
  • 读写比率7:3

6个测试用例覆盖了网关、服务发现、配置中心、服务间同步调用、数据库CURD、本地事务、分布式事务、缓存、布隆过滤器、SkyApm链路、Nlog日志记录、操作日志记录。

演示

GitHub

路线图

目录结构

  • src
    • clientApp 前端项目(Vue)
    • serverApi 后端项目(.NET6.0)
  • 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
  • 界面 .NET微服务开源框架-异常日志界面 .NET微服务开源框架-角色管理界面

ServerApi

  • ServerApi基于.NET 5.0搭建。
  • 后端主要技术栈
名称 描述
Ocelot 基于 `.NET6 编写的开源网关
Consul 配置中心、注册中心组件
Refit 一个声明式自动类型安全的RESTful服务调用组件,用于同步调用其他微服务
[Grpc.Net.ClientFactory](grpc/grpc-dotnet: gRPC for .NET (github.com))
Grpc.Tools
Grpc通讯框架
SkyAPM.Agent.AspNetCore Skywalking `.NET6探针,性能链路监测组件
Castle DynamicProxy 动态代理,AOP开源实现组件
Pomelo.EntityFrameworkCore.MySql EFCore ORM组件
Dapper 轻量级ORM组件
Z.EntityFramework.Plus.EFCore 第三方高性能的EfCore组件
NLog
Nlog.Mongdb
Nlog.Loki
日志记录组件
AutoMapper 模型映射组件
Swashbuckle.AspNetCore APIs文档生成工具(swagger)
StackExchange.Redis 开源的Redis客户端SDK
CAP 实现事件总线及最终一致性(分布式事务)的一个开源的组件
RabbitMq 异步消息队列组件
Polly 一个 .NET 弹性和瞬态故障处理库,允许开发人员以 Fluent 和线程安全的方式来实现重试、断路、超时、隔离和回退策略
FluentValidation 一个 .NET 验证框架,支持链式操作,易于理解,功能完善,组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,支持本地化多语言
Maxscale Mariadb开发的一款成熟、高性能、免费开源的数据库中间件
AspNetCore.HealthChecks 健康监测组件,搭配consul的健康监测

后端解决方案

整体架构图

  • Gateways 网关相关工程

  • Infrastructures 基础架构相关工程

  • Services 微服务相关工程

  • Tests 框架测试相关工程

.NET微服务开源框架-整体架构图

Gateways网关相关工程

✅ Adnc.Gateway.Ocelot

基于Ocelot实现的Api网关,如果项目采用整体结构开发,该项目可以直接删除。Ocelot网关包含路由、服务聚合、服务发现、认证、鉴权、限流、熔断、缓存、Header头传递等功能。市面上主流网关还有Kong,Traefik,Ambassador,Tyk等等。网关和实际业务有没有关联,可以自由选择。

Infrastructures 基础架构相关工程

✅ Adnc.Infra.Core

该工程是Adnc所有工程的最顶层,任何工程都会者直接或间接依赖该层。该工程提供了大量的C#基础类型的扩展方法以及Configuration、DependencyInjection、ContainerBuilder的扩展方法,还定义了一些异常类。

✅ Adnc.Infra.Caching

该工程集成了StackExchange.Redis,提供缓存的管理、Redis常用类型操作、分布式锁、布隆过滤器功能。

✅ Adnc.Infra.Consul

该工程集成了Consul,提供服务的自动注册、发现以及系统配置读写操作。

✅ Adnc.Infra.EventBus

该工程简单封装了CAP,同时集成了RabbitMq,封装了发布者与订阅者等公共类,能让开发人员更加便捷的调用。

✅ Adnc.Infra.IdGenerater

该工程负责Id的生成。

✅ Adnc.Infra.Helper

该工程提供一些通用帮助类,如HashHelper,SecurityHelper等等。

✅ Adnc.Infra.Mapper

该工程定义了IObjectMapper接口,并且提供了AutoMapper的实现。

✅ Adnc.Infra.Repository

该工程定义了Entity对象的基类、UnitOfWork接口、仓储接口。

✅ Adnc.Infra.EfCore.MySQL

该工程负责Adnc.Infra.Repository仓储接口IAdoExecuterWithQuerierRepository的实现,提供mysql数据库的CURD操作。

✅ Adnc.Infra.Dapper

该工程负责Adnc.Infra.Repository仓储接口以及IUintofWork接口的EfCore的实现,提供mysql数据库的CURD操作,同时也集成了Dapper部分接口,用来处理复杂查询。

✅ Adnc.Infra.Mongo

该工程负责Adnc.Infra.Repository仓储接口的Mongodb实现,提供mongodb数据库的CURD操作。

Services 微服务相关工程

该目录都是具体微服务业务的实现。

✅ Shared

微服务公用工程

  • Adnc.Shared 该层目前只有两个目录Consts存放常量定义文件、Events存放事件定义文件。
  • Adnc.Shared.Rpc该层负责proto文件的定义、refit接口定义以及DelegatingHandler实现。微服务同步通讯主要由该层处理,adnc支持Grpc与RestAPI两种通讯方式混用。
  • Adnc.Application.Shared 该层定义了DTO对象的基类、应用服务类基类、缓存相关服务基类以及操作日志拦截器、UnitOfWork拦截器。所有微服务Application层的共享层,并且都需要依赖该层。
  • Adnc.WebApi.Shared 该层实现了认证、鉴权、异常捕获、服务组件注册等公共类和中间件。所有微服务WebApi层的共享层,并且都需要依赖该层。
✅ Adnc.Usr

用户中心微服务,系统支撑服务,实现了用户管理、角色管理、权限管理、菜单管理、组织架构管理。

✅ Adnc.Maint

运维中心微服务,系统支撑服务,实现了登录日志、审计日志、异常日志、字典管理、配置参数管理。

✅ Adnc.Cus

客户中心微服务,经典三层开发模式demo。

✅ Adnc.Ord

订单中心微服务,DDD开发模式demo。

✅ Adnc.Whse

仓储中心微服务,DDD开发模式demo。

每个微服务的Migrations层是Efcore用来做数据迁移的,迁移的日志文件存放在各自Migrations目录中。

贡献者

License

MIT
Free Software, Hell Yeah!