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

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

时间:2024-07-10 09:01:13浏览次数:20  
标签:Core 分库 builder EF 分表 NET public 轻量级

前言

今天大姚给大家分享一款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框架:16个值得推荐的.NET ORM框架

快速上手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)
        }
}

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看

标签:Core,分库,builder,EF,分表,NET,public,轻量级
From: https://blog.csdn.net/qq_37237487/article/details/140281019

相关文章

  • 解析coredump文件
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、coredump是什么?二、操作步骤总结前言编写程序的时候可能会遇到coredump问题,如下方法可以解析dump,简单定位报错问题内核版本:5.10提示:以下是本篇文章正文内容,下面案例可供参考一、......
  • ASP.Net Core解读launchSettings.json
    一、环境目标框架:.NETCore3.1ASP.NETCore是一个全新的Web开发平台,微软在它上面构建了MVC、SingalR、GRPC、Orleans这样广泛使用的Web框架,我们先以MVC框架为例介绍利用ASP.NETCore构建项目的常见名词。这篇文章介绍启动配置文件launchSettings.json ASP.NET Core MVC项目......
  • Core WebAPI 中 Program.cs和Startup.cs认识 (高频考点)
    1.Program.cs认识publicclassProgram{publicstaticvoidMain(string[]args){//Build方法构建出一个web应用程序,然后去运行CreateWebHostBuilder(args)//调用下面的方法,返回一个IWebHostBuilder对象.Build()//用......
  • .net core部署linux下载文件 文件为中文下载
    在项目中,需要下载模板,某个文件夹下有excel文件或者word等 文件名为中文的时候在linux服务器下载不了  如果直接写路由的话在windows下是可以直接访问的,但是core部署在linux上所以会有些不同第一种:写一个接口使用流下载[httpget("download")]publicasyncTask<FileResult......
  • Asp.NET Core WebAPI 设置环境变量值ASPNETCORE_ENVIRONMENT
    默认情况下发布后的环境变量是Production方式一:在文件夹PublishProfiles下的FolderProfile.pubxml文件增加配置<Project><PropertyGroup><EnvironmentName>Development</EnvironmentName></PropertyGroup></Project>表示发布后通过builder.Environment.Env......
  • NetCore 模板引擎
    HTML模板<!DOCTYPEhtml><htmlxmlns="http://www.w3.org/1999/xhtml"><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><title>@Model.Title</title></hea......
  • mormot.core.os--TSynLocker和TSynLocked
    mormot.core.os--TSynLocker和TSynLockedTLightLock{****************TSynLocker/TSynLocked和低级线程特性}type///一个轻量级的独占非重入锁,存储在PtrUInt值中//-在自旋一段时间后调用SwitchToThread,但不使用任何读写操作系统API//-警告:方法是非重入......
  • CoreDNS 概述及运维实践
     概述什么是DNS?域名系统(英语:DomainNameSystem,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。DNS不仅方便了人们访问不同的互联网服务,更为很多应用提供了,动态服务发现和全局负载均衡......
  • mormot.core.threads--TSynParallelProcess
    mormot.core.threads--TSynParallelProcess{************线程池中的并行执行}type///TSynParallelProcess的并行化过程回调//-如果0<=IndexStart<=IndexStop,则应执行某些过程TOnSynParallelProcess=procedure(IndexStart,IndexStop:integer)ofobject;......
  • NVIDIA H100 Tensor Core GPU摘要
    NVIDIAH100TensorCoreGPU的特性概括如下:先进的制造工艺与规模:H100基于NVIDIAHopper架构,采用台积电定制的4N工艺,集成高达800亿个晶体管,是目前世界上最为先进的芯片。性能飞跃:针对大规模人工智能(AI)和高性能计算(HPC)应用,H100相较于上一代A100TensorCoreGPU实现了数......