一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案

ef,core · 浏览次数 : 43

小编点评

前言 今天大姚给大家分享一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案:ShardingCore。ShardingCore是一款开源、简单易用、高性能、普适性,针对EF Core生态下的分表分库的扩展解决方案,支持EF Core2+的所有版本,支持EF Core2+的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款EF Core拓展程序包,一款零依赖第三方组件的扩展。 1. ShardingCore项目介绍 ShardingCore是一款开源、简单易用、高性能、普适性,针对EF Core生态下的分表分库的扩展解决方案,支持EF Core2+的所有版本,支持EF Core2+的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款EF Core拓展程序包,一款零依赖第三方组件的扩展。 2. ShardingCore项目特性 - 零依赖、零学习成本、零业务代码入侵 - 支持EF Core的Code First支持表结构的迁移自动化 - 支持对数据分表/分库的自定义路由,可以满足几乎90%的业务分表/分库规则,并且支持外部传入配置 - 具有极少数的客户端分片中间件下才有的流式聚合,和特定的高性能分页,具有低内存高性能O(n),并且支持顺序分页,反向分页,追加排序 - 多数据库支持,只要是EF Core2+支持的数据库ShardingCore都是支持的。 3. EF Core介绍 Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术,EF Core 是适用于 .NET 的现代对象数据库映射器。它支持 LINQ 查询、更改跟踪、更新和架构迁移。EF Core 通过提供程序插件 API 与 SQL Server、Azure SQL 数据库、SQLite、Azure Cosmos DB、MySQL、PostgreSQL 和其他数据库一起使用(微软官方出品)。 4. 推荐的.NET ORM框架 分享了一些比较好用且优秀的.NET ORM框架:https://mp.weixin.qq.com/s/B47HvbELB-Z-nAY8TxE15g 5. 快速上手AspNetCore示例 来源于项目官方文档教程(更多详情请前往项目官方文档地址查阅):https://xuejmnet.github.io/sharding-core-doc/guide/quick-start-aspnetcore5步实现按月分表,且支持自动化建表建库。 6. 总结 以上内容,生成内容时需要带简单的排版

正文

前言

今天大姚给大家分享一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案,开源(Apache License)的EF Core拓展程序包:ShardingCore。

ShardingCore项目介绍

ShardingCore是一款开源、简单易用、高性能、普适性,针对EF Core生态下的分表分库的扩展解决方案,支持EF Core2+的所有版本,支持EF Core2+的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款EF Core拓展程序包,一款零依赖第三方组件的扩展。

ShardingCore项目特性

  • 零依赖、零学习成本、零业务代码入侵。
  • 支持EF Core的Code First支持表结构的迁移自动化。
  • 支持对数据分表/分库的自定义路由,可以满足几乎90%的业务分表/分库规则,并且支持外部传入配置。
  • 具有极少数的客户端分片中间件下才有的流式聚合,和特定的高性能分页,具有低内存高性能O(n),并且支持顺序分页,反向分页,追加排序。
  • 多数据库支持,只要是EF Core2+支持的数据库ShardingCore都是支持的。
  • 等等等...

EF Core介绍

Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术,EF Core 是适用于 .NET 的现代对象数据库映射器。它支持 LINQ 查询、更改跟踪、更新和架构迁移。EF Core 通过提供程序插件 API 与 SQL Server、Azure SQL 数据库、SQLite、Azure Cosmos DB、MySQL、PostgreSQL 和其他数据库一起使用(微软官方出品)。

值得推荐的.NET ORM框架

分享了一些比较好用且优秀的.NET ORM框架:https://mp.weixin.qq.com/s/B47HvbELB-Z-nAY8TxE15g

快速上手AspNetCore

快速上手示例来源于项目官方文档教程(更多详情请前往项目官方文档地址查阅):https://xuejmnet.github.io/sharding-core-doc/guide/quick-start-aspnetcore

5步实现按月分表,且支持自动化建表建库。

第一步安装NuGet包依赖:

ShardingCore NuGet包安装:

# 请对应安装您需要的版本PM> Install-Package ShardingCore
复制

使用SqlServer安装如下NuGet包:

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
复制

使用MySql安装如下NuGet包:

PM> Install-Package Pomelo.EntityFrameworkCore.MySql
复制

第二步创建查询对象模型:

    /// <summary>    /// order table    /// </summary>    public class Order    {        /// <summary>        /// order Id        /// </summary>        public string Id { get; set; }        /// <summary>        /// payer id        /// </summary>        public string Payer { get; set; }        /// <summary>        /// pay money cent        /// </summary>        public long Money { get; set; }        /// <summary>        /// area        /// </summary>        public string Area { get; set; }        /// <summary>        /// order status        /// </summary>        public OrderStatusEnum OrderStatus { get; set; }        /// <summary>        /// CreationTime        /// </summary>        public DateTime CreationTime { get; set; }    }    public enum OrderStatusEnum    {        NoPay=1,        Paying=2,        Payed=3,        PayFail=4    }
复制

第三步创建dbcontext:

dbcontext AbstractShardingDbContext和IShardingTableDbContext如果你是普通的DbContext那么就继承AbstractShardingDbContext需要分表就实现IShardingTableDbContext,如果只有分库可以不实现IShardingTableDbContext接口。

    public class MyDbContext:AbstractShardingDbContext,IShardingTableDbContext    {        public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)        {        }        protected override void OnModelCreating(ModelBuilder modelBuilder)        {            base.OnModelCreating(modelBuilder);            modelBuilder.Entity<Order>(entity =>            {                entity.HasKey(o => o.Id);                entity.Property(o => o.Id).IsRequired().IsUnicode(false).HasMaxLength(50);                entity.Property(o=>o.Payer).IsRequired().IsUnicode(false).HasMaxLength(50);                entity.Property(o => o.Area).IsRequired().IsUnicode(false).HasMaxLength(50);                entity.Property(o => o.OrderStatus).HasConversion<int>();                entity.ToTable(nameof(Order));            });        }        /// <summary>        /// empty impl if use sharding table        /// </summary>        public IRouteTail RouteTail { get; set; }    }
复制

第四步添加分表路由:

/// <summary>/// 创建虚拟路由/// </summary>public class OrderVirtualTableRoute:AbstractSimpleShardingModKeyStringVirtualTableRoute<Order>{    public OrderVirtualTableRoute() : base(2, 3)    {    }    public override void Configure(EntityMetadataTableBuilder<Order> builder)    {        builder.ShardingProperty(o => o.Id);        builder.AutoCreateTable(null);        builder.TableSeparator("_");    }}
复制

第五步配置启动项:

无论你是何种数据库只需要修改AddDefaultDataSource里面的链接字符串 请不要修改委托内部的UseXXX参数 conStr and connection。

        public void ConfigureServices(IServiceCollection services)        {            //添加分片配置            services.AddShardingDbContext<MyDbContext>()                .UseRouteConfig(op =>                {                    op.AddShardingTableRoute<OrderVirtualTableRoute>();                }).UseConfig((sp,op) =>                {                                        op.UseShardingQuery((conn, builder) =>                    {                        builder.UseSqlServer(conn);                    });                    op.UseShardingTransaction((conn, builder) =>                    {                        builder.UseSqlServer(conn);                    });                    op.AddDefaultDataSource(Guid.NewGuid().ToString("n"),                        "Data Source=localhost;Initial Catalog=EFCoreShardingTableDB;Integrated Security=True;");                }).AddShardingCore();        }        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }                        //not required, enable check table missing and auto create,非必须  启动检查缺少的表并且创建            app.ApplicationServices.UseAutoTryCompensateTable();            // other configure....        }
复制

这样所有的配置就完成了你可以愉快地对Order表进行取模分表了:

[Route("api/[controller]")]public class ValuesController : Controller{        private readonly MyDbContext _myDbContext;        public ValuesController(MyDbContext myDbContext)        {            _myDbContext = myDbContext;        }        [HttpGet]        public async Task<IActionResult> Get()        {            var order = await _myDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == "2");            return OK(order)        }}
复制

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群👪

与一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案相似的内容:

一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案

前言 今天大姚给大家分享一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案,开源(Apache License)的EF Core拓展程序包:ShardingCore。 ShardingCore项目介绍 ShardingCore是一款开源、简单易用、高性能、普适性,针对EF Core生态

efcore如何优雅的实现按年分库按月分表

efcore如何优雅的实现按年分库按月分表 介绍 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵适配 距离上次发文.net相关的已经有很久了,期间一直在从事java相关的

基于EF Core存储的Serilog持久化服务

前言 Serilog是 .NET 上的一个原生结构化高性能日志库,这个库能实现一些比内置库更高度的定制。日志持久化是其中一个非常重要的功能,生产环境通常很难挂接调试器或者某些bug的触发条件很奇怪。为了在脱离调试环境的情况下尽可能保留更多线索来辅助解决生产问题,持久化的日志就显得很重要了。目前Ser

论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(下)

前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实现功能的同时控制这些S

Ubuntu22.04 安装单机版kubernetes

# 前言 上期讲到要实现.net 6框架下的EF Core操作数据库基本增删改查,没有及时兑现。没有兑现的原因就是因为安装kubernetes。安装kubernetes的过程是灾难性的,也是十分顺利的。灾难性是因为在安装kubernetes过程中误操作,在/etc下执行了一个重置的命令导致我的工作站

造轮子之ORM集成

Dotnet的ORM千千万,还是喜欢用EF CORE 前面一些基础完成的差不多了,接下来可以集成数据库了,官方出品的ORM还是比较香。所以接下来就是来集成EF CORE。 安装包 首先我们需要安装一下EF CORE的NUGET包,有如下几个: Microsoft.EntityFrameworkCor

基于EF Core存储的国际化服务

前言 .NET 官方有一个用来管理国际化资源的扩展包Microsoft.Extensions.Localization,ASP.NET Core也用这个来实现国际化功能。但是这个包的翻译数据是使用resx资源文件来管理的,这就意味着无法动态管理。虽然官方有在文档中提供了一些第三方管理方案,但是都不太

论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(中)

前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实现功能的同时控制这些S

论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(上)

前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实现功能的同时控制这些S

EF Core从TPH迁移到TPT

Intro EF Core支持多种方式处理具有继承关系的表,现在支持TPH、TPC(EF Core 7)、TPT,具体的实现方式可以参考官方文档和这篇文章。 大致总结一下不同的方式的区别: TPH:所有的类型都放在一张表中,使用discriminator字段用以区别不同的类型 TPT:不同的子类型有