摘要:分表分庫集成易用簡單高性能普適性,是一款擴展針對生態下的分表分庫的擴展解決方案支持的所有版本支持的所有數據庫支持自定義路由動態路由高性能分頁讀寫分離的一款組件,如果你喜歡這組件或者這個組件對你有幫助請點擊下發讓更多的可以看到使用助力生態
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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124816.html
摘要:為此,一款高性能的分布式數據庫,日漸成為剛需。基于如上的原因,我們選擇了,作為豐巢的核心系統的分布式數據庫,來取代和。 作者:豐巢技術團隊 隨著豐巢業務系統快速增長,其核心系統的數據量,早就跨越了億級別,而且每年增量仍然在飛速發展。整個核心系統隨著數據量的壓力增長,不但系統架構復雜度急劇增長,數據架構更加復雜,傳統的單節點數據庫,已經日漸不能滿足豐巢的需求,當單表數量上億的時候,Ora...
閱讀 2236·2021-11-24 11:15
閱讀 3079·2021-11-24 10:46
閱讀 1378·2021-11-24 09:39
閱讀 3924·2021-08-18 10:21
閱讀 1478·2019-08-30 15:53
閱讀 1395·2019-08-30 11:19
閱讀 3319·2019-08-29 18:42
閱讀 2321·2019-08-29 16:58