Grain Services
Grain Services, işlevsellik dilimlerini desteklemek için uzaktan erişilebilir, bölümlenmiş hizmetlerdir. Bir tahıl hizmetinin her örneği bazı tahıl kümelerinden sorumludur ve bu tanecikler, şu anda bir GrainServiceClient
kullanarak hizmet vermekle sorumlu olan tahıl hizmetine başvuru alabilir.
Tahıl Hizmetleri, bakım taneciklerinin sorumluluğunun kümenin etrafına Orleans dağıtılması gereken durumları desteklemek için vardır. Örneğin, Orleans Anımsatıcılar tahıl hizmetleri kullanılarak uygulanır: her silo, bir dilim alt kümesi için anımsatıcı işlemlerini işlemek ve anımsatıcıları tetiklendiğinde bu taneleri bilgilendirmekle sorumludur.
Tahıl Hizmetleri silolarda yapılandırılır ve silo başlatıldığında, silo başlatma tamamlanmadan önce başlatılır. Boşta olduklarında toplanmazlar ve bunun yerine silonun ömrü boyunca uzanan yaşam süreleri vardır.
GrainService oluşturma
A GrainService , kararlı kimliği olmayan ve başlangıçtan kapatmaya kadar her siloda çalışan özel bir tahıldır. Bir arabirimi uygularken IGrainService birkaç adım vardır.
Tahıl hizmeti iletişim arabirimini tanımlayın. arabirimi, bir
GrainService
tanenin arabirimini oluşturmak için kullanacağınız ilkeler kullanılarak oluşturulur.public interface IDataService : IGrainService { Task MyMethod(); }
DataService
Tahıl hizmetini oluşturun. Ayrıca, içinden tahıl çağrıları IGrainFactoryyapabilmeniz için birGrainService
de ekleyebileceğinizi bilmek güzeldir.[Reentrant] public class DataService : GrainService, IDataService { readonly IGrainFactory _grainFactory; public DataService( IServiceProvider services, GrainId id, Silo silo, ILoggerFactory loggerFactory, IGrainFactory grainFactory) : base(id, silo, loggerFactory) { _grainFactory = grainFactory; } public override Task Init(IServiceProvider serviceProvider) => base.Init(serviceProvider); public override Task Start() => base.Start(); public override Task Stop() => base.Stop(); public Task MyMethod() { // TODO: custom logic here. return Task.CompletedTask; } }
[Reentrant] public class DataService : GrainService, IDataService { readonly IGrainFactory _grainFactory; public DataService( IServiceProvider services, IGrainIdentity id, Silo silo, ILoggerFactory loggerFactory, IGrainFactory grainFactory) : base(id, silo, loggerFactory) { _grainFactory = grainFactory; } public override Task Init(IServiceProvider serviceProvider) => base.Init(serviceProvider); public override Task Start() => base.Start(); public override Task Stop() => base.Stop(); public Task MyMethod() { // TODO: custom logic here. return Task.CompletedTask; } }
'a bağlanmak GrainServiceClient<TGrainService>üzere
GrainServiceClient
GrainService
diğer tanecikler tarafından kullanılacak bir arabirim oluşturun.public interface IDataServiceClient : IGrainServiceClient<IDataService>, IDataService { }
Grain service istemcisini oluşturun. İstemciler genellikle hedefledikleri hub'lı hizmetler için ara sunucu görevi görür, bu nedenle genellikle hedef hizmette her yöntem için bir yöntem eklersiniz. Bu yöntemlerin, araya çağırabilmeleri için hedefledikleri tahıl hizmetine bir başvuru alması gerekir.
GrainServiceClient<T>
Temel sınıf, yönteminGetGrainService
birkaç aşırı yüklemesini sağlar. Bu, bir , sayısal karmaya (GrainId
) veya öğesineuint
SiloAddress
karşılık gelen bir taneli başvuru döndürebilir. İkinci iki aşırı yükleme, bir geliştiricinin sorumluluğu konaklarla eşlemek için farklı bir mekanizma kullanmak istediği veya bir konağı doğrudan ele almak istediği gelişmiş durumlara yöneliktir. Aşağıdaki örnek kodumuzda,GrainService
öğesini çağıranIDataService
tanecik için değerini döndürenDataServiceClient
bir özelliği tanımlarız. Bunu yapmak için, özelliğiyleGetGrainService(GrainId)
birlikte aşırı yüklemeyi kullanırızCurrentGrainReference
.public class DataServiceClient : GrainServiceClient<IDataService>, IDataServiceClient { public DataServiceClient(IServiceProvider serviceProvider) : base(serviceProvider) { } // For convenience when implementing methods, you can define a property which gets the IDataService // corresponding to the grain which is calling the DataServiceClient. private IDataService GrainService => GetGrainService(CurrentGrainReference.GrainId); public Task MyMethod() => GrainService.MyMethod(); }
Gerçek tahıl hizmeti istemcisini oluşturun. Yalnızca veri hizmeti için ara sunucu işlevi görür. Ne yazık ki, yalnızca basit tek satırlı olan tüm yöntem eşlemelerini el ile yazmanız gerekir.
public class DataServiceClient : GrainServiceClient<IDataService>, IDataServiceClient { public DataServiceClient(IServiceProvider serviceProvider) : base(serviceProvider) { } public Task MyMethod() => GrainService.MyMethod(); }
Tahıl hizmeti istemcisini ihtiyacı olan diğer tahıllara enjekte edin.
GrainServiceClient
yerel siloya erişmesiGrainService
garanti değildir. Komutunuz kümedeki herhangi bir siloda adresine gönderilebilirGrainService
.public class MyNormalGrain: Grain<NormalGrainState>, INormalGrain { readonly IDataServiceClient _dataServiceClient; public MyNormalGrain( IGrainActivationContext grainActivationContext, IDataServiceClient dataServiceClient) => _dataServiceClient = dataServiceClient; }
Siloda grain service ve grain service istemcisini yapılandırın. Silonun öğesini başlatması
GrainService
için bunu yapmanız gerekir.(ISiloHostBuilder builder) => builder.ConfigureServices( services => services.AddGrainService<DataService>() .AddSingleton<IDataServiceClient, DataServiceClient>());
Ek notlar
Tahıl hizmetlerini kaydetmek için kullanılan bir uzantı yöntemi GrainServicesSiloBuilderExtensions.AddGrainService vardır.
services.AddSingleton<IGrainService>(
serviceProvider => GrainServiceFactory(grainServiceType, serviceProvider));
Silo, başlatıldığında hizmet sağlayıcısından IGrainService
türlerini alır: orleans/src/Orleans.Runtime/Silo/Silo.cs
var grainServices = this.Services.GetServices<IGrainService>();
Microsoft..Orleans. Proje, Çalışma Zamanı NuGet paketine GrainService
başvurmalıdır.
Microsoft..Orleans. OrleansRuntime NuGet paketine GrainService
proje tarafından başvurulmalıdır.
Bunun çalışması için hem hizmeti hem de istemcisini kaydetmeniz gerekir. Kod şuna benzer:
var builder = new HostBuilder()
.UseOrleans(c =>
{
c.AddGrainService<DataService>() // Register GrainService
.ConfigureServices(services =>
{
// Register Client of GrainService
services.AddSingleton<IDataServiceClient, DataServiceClient>();
});
})