摘要:分表分库集成易用简单高性能普适性,是一款扩展针对生态下的分表分库的扩展解决方案支持的所有版本支持的所有数据库支持自定义路由动态路由高性能分页读写分离的一款组件,如果你喜欢这组件或者这个组件对你有帮助请点击下发让更多的可以看到使用助力生态
ShardingCore
易用、简单、高性能、普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2+的所有版本,支持efcore2+的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款组件,如果你喜欢这组件或者这个组件对你有帮助请点击下发star让更多的.neter可以看到使用
Github Star 助力dotnet 生态 Gitee Star
随着.net6的发布,陆陆续续的框架都已经开始支持了,ShardingCore也不例外,为了推动.net生态,也为了让更多的的人了解.net下其实也有分表分库的解决方案,所以打算写一篇关于ShardingCore
集成到其他框架的思路。
Fourin
框架大家应该也是比较清楚的,作者也是一个乐于开源有着开源精神的人,秉着大家都是热爱开源的所以决定助Fourin
一臂之力(蹭一下热度)。随着上次的AbpVNext的"完美"集成ShardingCore
后,这次带来的就是Furion
下的ShardingCore
集成。
efcore
下完美的分表分库解决方案,支持任意efcore的集成框架,完美支持或者需要稍作修改即可完美支持,并不需要让你有任何使用的学习成本,几乎做到不修改现有efcore
代码的前提下让你的程序完美支持分表分库。真正做到“零”代码修改。
首先我们已目前Furion
最新版本为例v3.0.5
,新建一个空的aspnetcore web api的net6项目,当然也支持efcore2+的所有aspnetcore版本。
然后我们添加ShardingCore
和efcore.SqlServer
包
这边看了Furion
的使用方法和Abp一样需要继承一个他自己的DbContext叫做AppDbContext
,但是没有关西。因为ShardingCore
是基于接口来实现的,所以不存在多继承问题,只是我们需要自行实现Furion
的ShardingDbContext的抽象版本源码地址 AppShardingDbContext
简单的说下就是如果你是需要继承某个dbcontext的那么就需要自己实现三个接口IShardingDbContext
, ISupportShardingTransaction
, ISupportShardingReadWrite
分别是分表分库的核心接口,支持事务,支持读写分离。
具体已经帮你们抽象好了只需要复制代码就可以了。
做好了准备工作我们开始新建dbcontext
[AppDbContext("SqlServerConnectionString", DbProvider.SqlServer)] public class DefaultDbContext : AppShardingDbContext,IShardingTableDbContext { public DefaultDbContext(DbContextOptions options) : base(options) { } public IRouteTail RouteTail { get; set; } }
public class TodoItem:IPrivateEntity { public string Id { get; set; } public string Name { get; set; } }
这边我们将TodoItem
的Id
做成取模分表
[AppDbContext("SqlServerConnectionString", DbProvider.SqlServer)] public class DefaultDbContext : AppShardingDbContext,IShardingTableDbContext { public DefaultDbContext(DbContextOptions options) : base(options) { } public IRouteTail RouteTail { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity(entity => { entity.HasKey(o => o.Id); entity.Property(o => o.Id).IsRequired().IsUnicode(false).HasMaxLength(50).HasComment("Id"); entity.Property(o => o.Name).IsRequired().HasMaxLength(50).HasComment("名称"); entity.ToTable(nameof(TodoItem)); }); } }
配置了todoitem的简单配置,注意这边不一定要这么配置,也可以用Attribute+DbSet,也可以用FluentApi
public class TodoItemVirtualTableRoute : AbstractSimpleShardingModKeyStringVirtualTableRoute { public TodoItemVirtualTableRoute() : base(2, 8) { } public override void Configure(EntityMetadataTableBuilder builder) { builder.ShardingProperty(x => x.Id); } }
这边采用的是简单取模通过构造函数传入,具体可以参考文档就是分表后缀为2位数,模8也就是00,01.....07,一共8张表,ShardingProperty(x => x.Id)
表示TodoItem的分表字段为Id。
注意: 这边只是为了简单演示,你如果需要外部传入可以自行通过实现AbstractShardingOperatorVirtualTableRoute
来实现,并且路由构造函数支持单例的依赖注入
[AppStartup(600)] public sealed class SqlServerEntityFrameworkCoreStartup : AppStartup { public static readonly ILoggerFactory efLogger = LoggerFactory.Create(builder => { builder.AddFilter((category, level) => category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Information).AddConsole(); }); public void ConfigureServices(IServiceCollection services) { var connStr = DbProvider.GetConnectionString(/*这里可写可不写*/); // 配置数据库上下文,支持N个数据库 services.AddDatabaseAccessor(options => { // 配置默认数据库 options.AddDb(o => { o.UseSqlServer(connStr).UseSharding().UseLoggerFactory(efLogger); }); }); services.AddShardingConfigure((s, builder) => { builder.UseSqlServer(s).UseLoggerFactory(efLogger); }).Begin(o => { o.CreateShardingTableOnStart = true; o.EnsureCreatedWithOutShardingTable = true; o.AutoTrackEntity = true; }) .AddShardingTransaction((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger)) .AddDefaultDataSource("ds0", connStr) .AddShardingTableRoute(o => { o.AddShardingTableRoute(); }).End(); } }
通过官网我们可以知道如何针对Furion
进行efcore的配置,这边目前sharding-core不支持efcore的单例dbcontext,所以不建议使用单例。
额外配置:.UseSharding
仅需要配置dbcontext使用sharding原先的所有dbcontext的注入都可以不去管他
sharding-core的配置:AddShardingConfigure
是sharding-core
在efcore的基础上额外进行配置就可以支持分表分库的扩展更多配置可以参考文档
using ShardingCore.Bootstrapers;var builder = WebApplication.CreateBuilder(args).Inject();// Add services to the container.builder.Services.AddControllers().AddInject();var app = builder.Build();// Configure the HTTP request pipeline.app.UseAuthorization();app.UseInject();app.Services.GetRequiredService().Start();app.MapControllers();app.Run();
注意:很多同学老是忘记启动导致sharding-core
没法使用app.Services.GetRequiredService
首先我们通过注入构造函数IRepository
这是Furion
提供的
其次我们编写增删改查接口
[HttpGet] public async Task Add() { await _todoItemRepository.InsertAsync(new TodoItem() { Id = Guid.NewGuid().ToString("n"), Name = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") }); await _todoItemRepository.SaveNowAsync(); return Ok(); } [HttpGet] public async Task List() { var list = await _todoItemRepository.AsQueryable().ToListAsync(); return Ok(list); } [HttpGet] public async Task First([FromQuery]string id) { var todoItem = await _todoItemRepository.FirstOrDefaultAsync(o => o.Id == id); return Ok(todoItem); } [HttpGet] public async Task Update([FromQuery]string id) { var todoItem = await _todoItemRepository.FirstOrDefaultAsync(o => o.Id == id); todoItem.Name = "123"; await _todoItemRepository.SaveNowAsync(); return Ok(todoItem); }
因为默认为了测试ShardingCore
配置了
o.CreateShardingTableOnStart = true; o.EnsureCreatedWithOutShardingTable = true;
所以启动会帮我们建表并且建库
符合预期插入到了具体的hash%8的表
因为是获取所有所以这边会查询所有的分表符合预期
获取单条符合预期用的id取模所以用id去查询会到指定的表里面
符合预期代码先查询05表在更新05表并且使用的是追踪更新
我们接着再来查询一次看看是否真的修改了
到此为止我们的Furion
的ShardingCore
集成就完成了,当然这只是ShardingCore
的冰山一角,最最最简单的分表,如果你喜欢或者你认为ShardingCore
有用那么可以给个赞或者star吗?开原作者希望自己开源的项目被更多人高人指点并且进步。也希望为.net下的分表分库进行一份微薄之力。在efcore下我相信ShardingCore
是在官方不支持efcore
下最最最完美的解决方案。全程的使用代码体验是0感知,并且支持所有使用efcore的框架,只要你配置好了完全不需要考虑,当然也有同学要杠,如果某些情况下我就是要指定某几张表呢,ShardingCore
也是支持的所以在自动情况下是“零”入侵业务代码的最优分表分库方案,更多使用方式请查询
github ShardingCore文档
gitee ShardingCore文档
dotnet 天下第一 (大吼)
QQ群:771630778
个人QQ:326308290(欢迎技术支持提供您宝贵的意见)
个人邮箱:326308290@qq.com
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/124816.html
摘要:为此,一款高性能的分布式数据库,日渐成为刚需。基于如上的原因,我们选择了,作为丰巢的核心系统的分布式数据库,来取代和。 作者:丰巢技术团队 随着丰巢业务系统快速增长,其核心系统的数据量,早就跨越了亿级别,而且每年增量仍然在飞速发展。整个核心系统随着数据量的压力增长,不但系统架构复杂度急剧增长,数据架构更加复杂,传统的单节点数据库,已经日渐不能满足丰巢的需求,当单表数量上亿的时候,Ora...
阅读 2234·2021-11-24 11:15
阅读 3078·2021-11-24 10:46
阅读 1377·2021-11-24 09:39
阅读 3923·2021-08-18 10:21
阅读 1476·2019-08-30 15:53
阅读 1393·2019-08-30 11:19
阅读 3317·2019-08-29 18:42
阅读 2321·2019-08-29 16:58