Orleans.NET 内的 IHttpClient 实现

IHttpClient implementation within Orleans.NET

通常是recommended to create a wrapper implementing IHttpClient or IHttpClientFactory. Meanwhile, some Orleans samples表明可以按需创建HttpClient实例,直接从grain中使用

问题

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 服务。

关于GrainServiceGrainServiceClient的目的问题,GrainService是一项特殊服务,旨在从grain代码访问。 GrainServices 在集群中的每个节点上实例化,并且每个节点都负责一组谷物。例如,Orleans 中的提醒(持久计时器)是使用 GrainServices 实现的。每个节点上的 LocalReminderService 负责一组谷物,并在提醒到期时唤醒这些谷物。 GrainServiceClient 被grains用来访问负责调用grain的GrainService实例。文档在此处进行了更多解释:https://dotnet.github.io/orleans/Documentation/grains/grainservices.html

我会避免使用 GrainService 除非你找到一个非常适合的用例。