如何配置Aspire AppHost实现Orleans 9的SQL Server集群?
Aspire 9 + Orleans 9 配置SQL Server集群与存储问题解决
问题背景
使用Aspire 9搭建基于Orleans 9的项目,采用SQL Server实现集群,但无法在AppHost中正确配置Orleans集群提供程序。当前配置代码如下:
IResourceBuilder<SqlServerServerResource> sqlServer = builder.AddSqlServer("sql-server") //... IResourceBuilder<SqlServerDatabaseResource> sqlDb = sqlServer.AddDatabase("orleans-db"); //...orleans db migration scripts OrleansService orleans = builder.AddOrleans("orleans-cluster") .WithClustering(provider1) // 此处参数未知 .WithGrainStorage("Default", provider2) // 此处参数未知 ; builder.AddProject<Projects.DataProcessor>("silo") .WithReference(orleans) .WithReference(sqlServer);
排查发现:
Orleans.Clustering.AdoNet中的AdoNetClusteringProviderBuilder未在GetRegisteredProviders中注册,不同于RedisClusteringProviderBuilder- 已引用
Orleans.Clustering.AdoNet和Orleans.Persistence.AdoNet,但GetRelevantAssemblies未加载这两个程序集,仅成功加载Orleans.Streaming.AdoNet Orleans.Streaming.AdoNet带有[assembly: ApplicationPart("Orleans.Streaming.AdoNet")]特性,而前两者缺失该特性
解决方案
1. 正确配置Clustering与GrainStorage
由于AdoNet提供程序未被Aspire自动注册,需手动传入配置委托,直接使用SQL Server连接字符串:
// 获取SQL数据库的连接字符串 var connectionString = sqlDb.GetConnectionString(); OrleansService orleans = builder.AddOrleans("orleans-cluster") // 配置SQL Server集群 .WithClustering(clusterBuilder => clusterBuilder.AdoNet(options => { options.ConnectionString = connectionString; options.Invariant = "Microsoft.Data.SqlClient"; // SQL Server的标准Invariant名称 })) // 配置SQL Server默认Grain存储 .WithGrainStorage("Default", storageBuilder => storageBuilder.AdoNet(options => { options.ConnectionString = connectionString; options.Invariant = "Microsoft.Data.SqlClient"; }));
2. 修复程序集未加载问题
因为Orleans.Clustering.AdoNet和Orleans.Persistence.AdoNet缺少ApplicationPart特性,导致Aspire无法自动发现,可通过以下两种方式解决:
方式一:手动加载程序集
在AppHost的Program.cs开头添加程序集加载代码:
// 在创建DistributedApplicationBuilder之前执行 System.Reflection.Assembly.Load("Orleans.Clustering.AdoNet"); System.Reflection.Assembly.Load("Orleans.Persistence.AdoNet"); var builder = DistributedApplication.CreateBuilder(args); // 后续配置代码...
方式二:添加ApplicationPart特性
在AppHost项目的任意代码文件(如AssemblyInfo.cs)中添加特性声明:
[assembly: Orleans.ApplicationPart("Orleans.Clustering.AdoNet")] [assembly: Orleans.ApplicationPart("Orleans.Persistence.AdoNet")]
3. 确保数据库迁移完成
执行Orleans针对SQL Server的迁移脚本,创建集群管理和Grain存储所需的表。脚本可从Orleans官方资源获取,或通过Orleans.Clustering.AdoNet包提供的工具生成。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

