Orleans 2.0官方文档(闫辉的个人翻译)——4.10.3 高级功能:GrainServices

GrainServices

GrainService是一种特殊的grain;它没有身份标识,并且在每个silo中运行,从silo的启动到关闭。

创建GrainService

步骤1.创建接口。构建GrainService接口的原则,与构建任何其他的grain接口完全相同。

public interface IDataService : IGrainService {
    Task MyMethod();
}

步骤2.创建DataService grain本身。如果可能,使GrainService可重入,以获得更好的性能。注意必要的基类构造函数调用。您也可以注入一个IGrainFactory,这样您就可以从GrainService中进行grain调用。

关于流的一个注意事项:GrainService无法写入Orleans流,因为它不能在grain任务调度程序中工作。如果您需要GrainService为您写入流,那么您必须将对象发送给一种类型的Grain,以便写入流。

[Reentrant]

public class LightstreamerDataService : GrainService, IDataService {

    readonly IGrainFactory GrainFactory;

    public LightstreamerDataService(IServiceProvider services, IGrainIdentity id, Silo silo, ILoggerFactory loggerFactory, IGrainFactory grainFactory) : base(id, silo, loggerFactory) {
        GrainFactory = grainFactory;
    }

    public override Task Init(IServiceProvider serviceProvider) {
        return base.Init(serviceProvider);
    }

    public override async Task Start() {
        await base.Start();
    }

    public override Task Stop() {
        return base.Stop();
    }

    public Task MyMethod() {
 }
}

步骤3.为GrainServiceClient创建一个接口,供其他的grain用来连接到GrainService。

public interface IDataServiceClient : IGrainServiceClient<IDataService>, IDataService {
}

步骤4.创建实际的grain服务客户端。它几乎只是作为数据服务的代理。不幸的是,您必须手动输入的所有方法映射,这些方法映射是多个简单的单行映射。

public class DataServiceClient : GrainServiceClient<IDataService>, IDataServiceClient {

    public DataServiceClient(IServiceProvider serviceProvider) : base(serviceProvider) {
    }

    public Task MyMethod()  => GrainService.MyMethod();
}

步骤5.grain服务客户端注入到那些需要它的其他grain中。请注意,GrainServiceClient并不保证访问本地silo上的GrainService。您的命令可能会被发送给群集中的任何silo上的GrainService

public class MyNormalGrain: Grain<NormalGrainState>, INormalGrain {

    readonly IDataServiceClient DataServiceClient;

    public MyNormalGrain(IGrainActivationContext grainActivationContext, IDataServiceClient dataServiceClient) {
                DataServiceClient = dataServiceClient;
    }
}

步骤6.将grain服务注入到silo本身。需要这样做,才能使筒silo启动GrainService。

 Inject the grain service into the silo itself. You need to do this so that the silo will start the GrainService.

(ISiloHostBuilder builder) => builder .ConfigureServices(services => { services.AddSingleton<IDataService, DataService>(); });

补充说明

说明1

有一个扩展方法ISiloHostBuilder: AddGrainService<SomeGrainService>()。其类型约束是:where T : GrainService。最后调用这个点:orleans/src/Orleans.Runtime/Services/GrainServicesSiloBuilderExtensions.cs

return services.AddSingleton<IGrainService>(sp => GrainServiceFactory(grainServiceType, sp));

基本上,在启动:orleans/src/Orleans.Runtime/Silo/Silo.cs var grainServices = this.Services.GetServices<IGrainService>()时,silo从服务提供程序获取IGrainService类型。

Grainservice项目应该要引用此NuGet包Microsoft.Orleans.OrleansRuntime

说明2

为了使其工作,您必须注册服务及其客户端。代码看起来像这样:

  var builder = new SiloHostBuilder()
      .AddGrainService<DataService>()  // Register GrainService
      .ConfigureServices(s =>
       {
          // Register Client of GrainService
          s.AddSingleton<IDataServiceClient, DataServiceClient>(); 
      })

猜你喜欢

转载自blog.csdn.net/uddiqpl/article/details/86515109
今日推荐