.NET 8 Web API结合Azure SQL异地复制实现读写分离方案问询
.NET 8 Web API 实现 Azure SQL 读写分离(Active Geo-Replication)
核心思路
利用连接字符串的ApplicationIntent=ReadOnly参数,让读操作自动路由到异地只读副本;写操作使用默认连接指向主数据库。核心要点:
- 异地副本在Active Geo-Replication配置下默认具备可读属性
- 连接字符串需指向主库服务器地址,SQL驱动会自动完成副本路由,无需直接指定副本服务器
步骤1:配置连接字符串
在appsettings.json中配置两个独立的连接字符串:
{ "ConnectionStrings": { "SqlPrimary": "Server=tcp:你的主库服务器名.database.windows.net,1433;Initial Catalog=你的数据库名;Persist Security Info=False;User ID=你的用户名;Password=你的密码;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;", "SqlReadOnly": "Server=tcp:你的主库服务器名.database.windows.net,1433;Initial Catalog=你的数据库名;Persist Security Info=False;User ID=你的用户名;Password=你的密码;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;ApplicationIntent=ReadOnly;" } }
步骤2:注册数据库上下文
在Program.cs中分别注册主库和只读副本对应的数据库上下文:
// 主库上下文:用于所有写操作 builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("SqlPrimary"))); // 只读副本上下文:用于所有读操作 builder.Services.AddDbContext<AppReadOnlyDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("SqlReadOnly")));
步骤3:业务层区分读写逻辑
在服务类中注入不同上下文,分别处理读写操作:
public class ProductService { private readonly AppDbContext _primaryDbContext; private readonly AppReadOnlyDbContext _readOnlyDbContext; public ProductService(AppDbContext primaryDbContext, AppReadOnlyDbContext readOnlyDbContext) { _primaryDbContext = primaryDbContext; _readOnlyDbContext = readOnlyDbContext; } // 写操作:使用主库上下文 public async Task CreateProductAsync(Product product) { _primaryDbContext.Products.Add(product); await _primaryDbContext.SaveChangesAsync(); } // 读操作:使用只读副本上下文 public async Task<List<Product>> GetAllProductsAsync() { return await _readOnlyDbContext.Products.ToListAsync(); } }
关键注意事项
- 禁止直接连接副本服务器:通过主库地址+
ApplicationIntent=ReadOnly连接,Azure会自动选择最优可用副本,避免手动维护副本地址 - 容忍数据延迟:只读副本数据存在秒级延迟,对实时性要求极高的读操作仍需走主库
- 故障转移自动适配:主库故障触发故障转移后,原副本晋升为主库,驱动会自动调整路由,无需修改连接字符串
- 权限配置:确保数据库用户拥有主库的读写权限,以及副本的读权限
内容的提问来源于stack exchange,提问作者santosh kumar patro
相关产品推荐
相关产品推荐

