Orleans.NET 内的 IHttpClient 实现
IHttpClient implementation within Orleans.NET
通常是recommended to create a wrapper implementing IHttpClient
or IHttpClientFactory
. Meanwhile, some Orleans samples表明可以按需创建HttpClient
实例,直接从grain中使用
问题
- 我应该创建 Orleans 服务作为
IHttpClient
的包装器还是直接从 grain 调用 HttpClient?
- 如果我需要一个包装器,这个实现是否足够?
GrainService
和GrainServiceClient
有什么区别?
public interface IRemoteGrainService : IGrainService
{
Task<T> Get<T>(string source) where T : new();
}
public class RemoteGrainService : GrainService, IRemoteGrainService
{
private IGrainFactory _grainFactory;
private HttpClient _remoteService;
public RemoteGrainService(
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()
{
_remoteService = new HttpClient();
await base.Start();
}
public override Task Stop()
{
_remoteService.Dispose();
return base.Stop();
}
public Task<T> Get<T>(string source) where T : new()
{
return JsonConvert
.DeserializeObject<T>(
await _client.GetAsync(source))
.Content
.ReadAsStringAsync);
}
}
在奥尔良使用 HttpClient
时应遵循标准 best-practices。该示例正在创建一个新示例以简化说明,而不是作为最佳实践的指标。更改示例文档以使用 IHttpClientFactory
(例如)的 PR 可能会被接受。
您不需要 GrainService
从您的 grain 调用 HTTP 服务:您可以注入所需的依赖项(IHttpClientFactory
或您键入的客户端)并直接从 grain 代码调用 HTTP 服务。
关于GrainService
和GrainServiceClient
的目的问题,GrainService
是一项特殊服务,旨在从grain代码访问。 GrainServices
在集群中的每个节点上实例化,并且每个节点都负责一组谷物。例如,Orleans 中的提醒(持久计时器)是使用 GrainService
s 实现的。每个节点上的 LocalReminderService
负责一组谷物,并在提醒到期时唤醒这些谷物。 GrainServiceClient
被grains用来访问负责调用grain的GrainService
实例。文档在此处进行了更多解释:https://dotnet.github.io/orleans/Documentation/grains/grainservices.html
我会避免使用 GrainService
除非你找到一个非常适合的用例。
通常是recommended to create a wrapper implementing IHttpClient
or IHttpClientFactory
. Meanwhile, some Orleans samples表明可以按需创建HttpClient
实例,直接从grain中使用
问题
- 我应该创建 Orleans 服务作为
IHttpClient
的包装器还是直接从 grain 调用 HttpClient? - 如果我需要一个包装器,这个实现是否足够?
GrainService
和GrainServiceClient
有什么区别?
public interface IRemoteGrainService : IGrainService
{
Task<T> Get<T>(string source) where T : new();
}
public class RemoteGrainService : GrainService, IRemoteGrainService
{
private IGrainFactory _grainFactory;
private HttpClient _remoteService;
public RemoteGrainService(
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()
{
_remoteService = new HttpClient();
await base.Start();
}
public override Task Stop()
{
_remoteService.Dispose();
return base.Stop();
}
public Task<T> Get<T>(string source) where T : new()
{
return JsonConvert
.DeserializeObject<T>(
await _client.GetAsync(source))
.Content
.ReadAsStringAsync);
}
}
在奥尔良使用 HttpClient
时应遵循标准 best-practices。该示例正在创建一个新示例以简化说明,而不是作为最佳实践的指标。更改示例文档以使用 IHttpClientFactory
(例如)的 PR 可能会被接受。
您不需要 GrainService
从您的 grain 调用 HTTP 服务:您可以注入所需的依赖项(IHttpClientFactory
或您键入的客户端)并直接从 grain 代码调用 HTTP 服务。
关于GrainService
和GrainServiceClient
的目的问题,GrainService
是一项特殊服务,旨在从grain代码访问。 GrainServices
在集群中的每个节点上实例化,并且每个节点都负责一组谷物。例如,Orleans 中的提醒(持久计时器)是使用 GrainService
s 实现的。每个节点上的 LocalReminderService
负责一组谷物,并在提醒到期时唤醒这些谷物。 GrainServiceClient
被grains用来访问负责调用grain的GrainService
实例。文档在此处进行了更多解释:https://dotnet.github.io/orleans/Documentation/grains/grainservices.html
我会避免使用 GrainService
除非你找到一个非常适合的用例。