【问题标题】:IHttpClient implementation within Orleans.NETOrleans.NET 中的 IHttpClient 实现
【发布时间】:2021-01-16 15:25:16
【问题描述】:

通常,使用recommended 创建实现IHttpClientIHttpClientFactory 的包装器。同时,一些奥尔良samples 表示可以按需创建HttpClient 实例并直接从grain 中使用。

问题

  • 我应该将 Orleans 服务创建为 IHttpClient 的包装器还是直接从 grain 调用 HttpClient?
  • 如果我需要一个包装器,这个实现就足够了吗?
  • GrainServiceGrainServiceClient 有什么区别?
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);
  }
}

【问题讨论】:

    标签: orleans


    【解决方案1】:

    在奥尔良使用HttpClient 时,您应该遵循标准的最佳实践。该示例正在创建一个新示例,以简化说明,而不是作为最佳实践的指标。将示例文档更改为使用 IHttpClientFactory(例如)的 PR 可能会被接受。

    您不需要GrainService 从您的grain 调用HTTP 服务:您可以注入所需的依赖项(IHttpClientFactory 或您的类型化客户端)并直接从grain 代码调用HTTP 服务。

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2022-07-10
      • 1970-01-01
      • 2014-04-28
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多