Foundatio.Storage.SshNet 10.7.1

前缀已保留
dotnet add package Foundatio.Storage.SshNet --version 10.7.1                
NuGet\Install-Package Foundatio.Storage.SshNet -Version 10.7.1                
此命令旨在在Visual Studio的包管理器控制台中使用,因为它使用NuGet模块的Install-Package版本。
<PackageReference Include="Foundatio.Storage.SshNet" Version="10.7.1" />                
对于支持PackageReference的项目,请将此XML节点复制到项目文件中以引用此包。
paket add Foundatio.Storage.SshNet --version 10.7.1                
#r "nuget: Foundatio.Storage.SshNet, 10.7.1"                
#r指令可以用于F# Interactive和Polyglot Notebooks。将此复制到交互式工具或脚本源代码中以引用包。
// Install Foundatio.Storage.SshNet as a Cake Addin
#addin nuget:?package=Foundatio.Storage.SshNet&version=10.7.1

// Install Foundatio.Storage.SshNet as a Cake Tool
#tool nuget:?package=Foundatio.Storage.SshNet&version=10.7.1                

FoundatioFoundatio

Build status NuGet Version feedz.io Discord

构建松散耦合分布式应用程序的可插拔基础组件。

包括Redis、Azure、AWS、RabbitMQ、Kafka和在内存(开发中)中的实现。

为什么是Foundatio?

在构建几个大型云应用程序时,我们发现在构建可扩展的分布式应用程序的同时保持开发体验简单的情况下,缺乏许多关键解决方案。以下是为什么我们构建并使用Foundatio的一些例子

  • 希望使用抽象接口进行构建,这样我们可以轻松地更改实现。
  • 希望这些块对依赖注入友好。
  • 缓存:我们最初使用的是开源的Redis缓存客户端,但后来它变成了收费产品,且有很高的许可费用。不仅如此,没有内存实现,所以每个开发者都需要设置和配置Redis。
  • 消息总线:我们最初考虑了NServiceBus(一个优秀的解决方案),但它有很高的许可费用(他们也需要吃饭),并且不是开源友好型。我们还研究了MassTransit(另一个优秀的解决方案),但当时我们发现Azure支持不足,本地设置也很麻烦(对于内存)。我们希望有一个简单易用的消息总线,无论是本地还是云端都能用。
  • 存储:我们没有找到能够解耦并支持内存、文件存储或Azure Blob Storage的现有项目。

总的来说,如果您想要无痛苦的开发和测试,同时让您的应用程序可扩展,请使用Foundatio!

实现

入门(开发)

Foundatio可以通过NuGet软件包管理器安装。如果您需要帮助,请创建一个问题或加入我们的Discord聊天室。如果您有任何问题,我们始终在这里帮助!

本部分仅用于开发目的!如果您试图使用Foundatio库,请从NuGet获取它们。

  1. 您需要安装Visual Studio Code
  2. 打开Visual Studio解决方案文件Foundatio.sln

使用Foundatio

以下部分仅包含Foundatio可能性的一个小子集。我们建议查看源代码以获取更多信息。如果您有任何问题或需要帮助,请告诉我们!

缓存

缓存可以快速存储和访问数据,从而减少创建或获取数据的昂贵操作。我们提供了四种不同的来自ICacheClient接口的缓存实现。

  1. InMemoryCacheClient:一个内存缓存客户端实现。此缓存实现仅在进程生存期内有效。值得注意的是,内存缓存客户端能够通过MaxItems属性缓存最后X个项目。我们使用它在Exceptionless中仅保留最后250个解析过的geoip结果
  2. HybridCacheClient:这个缓存实现使用ICacheClientInMemoryCacheClient,并使用IMessageBus来在不同进程间同步缓存。这可以带来极大的性能提升,因为如果您要缓存的项已经存在于本地缓存中,这样可以节省序列化操作和远程缓存的调用。
  3. RedisCacheClient:Redis缓存客户端实现。
  4. RedisHybridCacheClientHybridCacheClient的实现,将RedisCacheClient作为ICacheClient,将RedisMessageBus作为IMessageBus使用。
  5. ScopedCacheClient:这个缓存实现采用ICacheClient的实例和一个字符串scope。将scope前缀加到每个缓存键中。这使得管理所有缓存键并轻松删除它们变得更加容易。
示例
using Foundatio.Caching;

ICacheClient cache = new InMemoryCacheClient();
await cache.SetAsync("test", 1);
var value = await cache.GetAsync<int>("test");

队列

队列提供先入先出(FIFO)的消息投递。我们提供了四个不同的队列实现,这些实现都来源于IQueue接口

  1. InMemoryQueue:内存队列实现。这个队列实现仅在进程生命周期内有效。
  2. RedisQueue:Redis队列实现。
  3. AzureServiceBusQueue:Azure Service Bus队列实现。
  4. AzureStorageQueue:Azure Storage队列实现。
  5. SQSQueue:AWS SQS实现。
示例
using Foundatio.Queues;

IQueue<SimpleWorkItem> queue = new InMemoryQueue<SimpleWorkItem>();

await queue.EnqueueAsync(new SimpleWorkItem {
    Data = "Hello"
});

var workItem = await queue.DequeueAsync();

锁确保资源在任何给定时间内只被一个消费者访问。我们提供了两种不同的锁定实现,这些实现来源于ILockProvider接口

  1. CacheLockProvider:锁定实现,使用缓存在进程间通信。
  2. ThrottlingLockProvider:锁定实现,仅允许通过一定数量的锁。您可以使用它来限制对某些外部服务的API调用,并且将跨所有请求该锁的进程进行限制。
  3. ScopedLockProvider:这个锁定实现接受一个ILockProvider的实例和一个字符串scope。将scope前缀加到每个锁键上。这使得管理所有锁并轻松释放它们变得非常简单。

值得注意的是,所有锁提供者都接受一个ICacheClient。这允许您确保代码在机器间正确锁定。

示例
using Foundatio.Lock;

ILockProvider locker = new CacheLockProvider(new InMemoryCacheClient(), new InMemoryMessageBus());
var testLock = await locker.AcquireAsync("test");
// ...
await testLock.ReleaseAsync();

ILockProvider throttledLocker = new ThrottlingLockProvider(new InMemoryCacheClient(), 1, TimeSpan.FromMinutes(1));
var throttledLock = await throttledLocker.AcquireAsync("test");
// ...
await throttledLock.ReleaseAsync();

消息

允许您发布和订阅通过应用程序的消息。我们提供了四个不同的消息总线实现,这些实现都来源于IMessageBus接口

  1. InMemoryMessageBus:内存中的消息总线实现。此消息总线实现仅在进程生命周期内有效。
  2. RedisMessageBus:Redis消息总线实现。
  3. RabbitMQMessageBus:RabbitMQ实现。
  4. KafkaMessageBus:Kafka实现。
  5. AzureServiceBusMessageBus:Azure Service Bus实现。
示例
using Foundatio.Messaging;

IMessageBus messageBus = new InMemoryMessageBus();
await messageBus.SubscribeAsync<SimpleMessageA>(msg => {
  // Got message
});

await messageBus.PublishAsync(new SimpleMessageA { Data = "Hello" });

作业

允许您在不担心进程提前终止的情况下运行长时间运行的过程(进程内或进程外)。根据您的用例,我们提供三种不同的方式来定义工作

  1. 工作:所有工作必须从 IJob 接口 派生。我们还提供了一个 JobBase 基类,您可以从它派生,它提供作业上下文和日志记录。您可以通过在作业上调用 RunAsync() 或创建 JobRunner 实例并调用其中一个运行方法来运行作业。作业运行器可以用于轻松地将您的作业作为Azure Web工作运行。
示例
using Foundatio.Jobs;

public class HelloWorldJob : JobBase {
  public int RunCount { get; set; }

  protected override Task<JobResult> RunInternalAsync(JobContext context) {
     RunCount++;
     return Task.FromResult(JobResult.Success);
  }
}
var job = new HelloWorldJob();
await job.RunAsync(); // job.RunCount = 1;
await job.RunContinuousAsync(iterationLimit: 2); // job.RunCount = 3;
await job.RunContinuousAsync(cancellationToken: new CancellationTokenSource(10).Token); // job.RunCount > 10;
  1. 队列处理器作业:队列处理器作业非常适合处理将从队列数据驱动的作业。队列处理器作业必须从 QueueJobBase<T> 派生。然后,您可以通过在作业上调用 RunAsync() 或将其传递给 JobRunner 来运行作业。作业运行器可以用于轻松地将您的作业作为Azure Web工作运行。
示例
using Foundatio.Jobs;

public class HelloWorldQueueJob : QueueJobBase<HelloWorldQueueItem> {
  public int RunCount { get; set; }

  public HelloWorldQueueJob(IQueue<HelloWorldQueueItem> queue) : base(queue) {}

  protected override Task<JobResult> ProcessQueueEntryAsync(QueueEntryContext<HelloWorldQueueItem> context) {
     RunCount++;

     return Task.FromResult(JobResult.Success);
  }
}

public class HelloWorldQueueItem {
  public string Message { get; set; }
}
 // Register the queue for HelloWorldQueueItem.
container.AddSingleton<IQueue<HelloWorldQueueItem>>(s => new InMemoryQueue<HelloWorldQueueItem>());

// To trigger the job we need to queue the HelloWorldWorkItem message.
// This assumes that we injected an instance of IQueue<HelloWorldWorkItem> queue

IJob job = new HelloWorldQueueJob();
await job.RunAsync(); // job.RunCount = 0; The RunCount wasn't incremented because we didn't enqueue any data.

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunAsync(); // job.RunCount = 1;

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunUntilEmptyAsync(); // job.RunCount = 3;
  1. 工作项作业:工作项作业将在工作池中与其他工作项作业一起运行。此类作业非常适合那些不经常发生但应该作为作业进行的事情(例如:删除拥有许多子项的实体)。当您在 message bus 上发布消息时,它会被触发。作业必须从 WorkItemHandlerBase 派生。然后,您可以通过 JobRunner 运行所有共享作业。作业运行器可以用于轻松地将您的作业作为Azure Web工作运行。
示例
using System.Threading.Tasks;
using Foundatio.Jobs;

public class HelloWorldWorkItemHandler : WorkItemHandlerBase {
  public override async Task HandleItemAsync(WorkItemContext ctx) {
    var workItem = ctx.GetData<HelloWorldWorkItem>();

    // We can report the progress over the message bus easily.
    // To receive these messages just inject IMessageSubscriber
    // and Subscribe to messages of type WorkItemStatus
    await ctx.ReportProgressAsync(0, "Starting Hello World Job");
    await Task.Delay(TimeSpan.FromSeconds(2.5));
    await ctx.ReportProgressAsync(50, "Reading value");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(70, "Reading value");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(90, "Reading value.");
    await Task.Delay(TimeSpan.FromSeconds(.5));

    await ctx.ReportProgressAsync(100, workItem.Message);
  }
}

public class HelloWorldWorkItem {
  public string Message { get; set; }
}
// Register the shared job.
var handlers = new WorkItemHandlers();
handlers.Register<HelloWorldWorkItem, HelloWorldWorkItemHandler>();

// Register the handlers with dependency injection.
container.AddSingleton(handlers);

// Register the queue for WorkItemData.
container.AddSingleton<IQueue<WorkItemData>>(s => new InMemoryQueue<WorkItemData>());

// The job runner will automatically look for and run all registered WorkItemHandlers.
new JobRunner(container.GetRequiredService<WorkItemJob>(), instanceCount: 2).RunInBackground();
 // To trigger the job we need to queue the HelloWorldWorkItem message.
 // This assumes that we injected an instance of IQueue<WorkItemData> queue

 // NOTE: You may have noticed that HelloWorldWorkItem doesn't derive from WorkItemData.
 // Foundatio has an extension method that takes the model you post and serializes it to the
 // WorkItemData.Data property.
 await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });

文件存储

我们提供了不同的文件存储实现,这些实现基于 IFileStorage 接口

  1. InMemoryFileStorage:内存中的文件实现。此文件存储实现仅在进程生命周期内有效。
  2. FolderFileStorage:使用硬盘进行存储的文件存储实现。
  3. AzureFileStorage:Azure Blob存储实现。
  4. S3FileStorage:AWS S3文件存储实现。
  5. RedisFileStorage:Redis文件存储实现。
  6. MinioFileStorage:Minio文件存储实现。
  7. AliyunFileStorage:阿里云文件存储实现。
  8. SshNetFileStorage:SFTP文件存储实现。

我们推荐使用所有的IFileStorage实现作为单例。

示例
using Foundatio.Storage;

IFileStorage storage = new InMemoryFileStorage();
await storage.SaveFileAsync("test.txt", "test");
string content = await storage.GetFileContentsAsync("test.txt")

度量

我们提供了五个从IMetricsClient接口派生的实现。

  1. InMemoryMetricsClient:内存中的度量值实现。
  2. RedisMetricsClient:Redis度量值实现。
  3. StatsDMetricsClient:statsd度量值实现。
  4. MetricsNETClient:Metrics.NET实现。
  5. AppMetricsClient:AppMetrics实现。
  6. CloudWatchMetricsClient:AWS CloudWatch实现。

我们推荐使用所有的IMetricsClient实现作为单例。

示例
IMetricsClient metrics = new InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1", 2.534);
metrics.Timer("t1", 50788);

示例应用

我们既有幻灯片,也有一个示例应用,展示如何使用Foundatio。

感谢所有做出贡献的人

contributors

产品 兼容的以及额外的计算目标框架版本。
.NET net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.1 兼容。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容目标框架
包含目标框架(在包内)
了解有关 目标框架.NET Standard 的更多信息。

NuGet 包

此包没有被任何 NuGet 包使用。

GitHub 仓库

此包没有被任何流行 GitHub 仓库使用。

版本 下载 最后更新
10.7.1 5,444 3/27/2024
10.7.0 4,077 1/5/2024
10.6.1 2,593 6/23/2023
10.6.0 1,878 1/1/2023
10.5.0 2,440 5/18/2022
10.4.0 1,138 3/8/2022
10.3.0 1,613 1/21/2022
10.2.3 544 12/7/2021
10.2.2 530 9/23/2021
10.2.0 476 7/8/2021
10.0.2 1,348 1/20/2021
10.0.0 1,693 9/16/2020
10.0.0-beta9 374 8/25/2020
10.0.0-beta8 353 8/3/2020
10.0.0-beta7 380 7/29/2020
10.0.0-beta6 401 7/8/2020
10.0.0-beta5 544 6/20/2020
10.0.0-beta3 441 6/14/2020
10.0.0-beta2 429 6/6/2020
10.0.0-beta10 383 9/15/2020
10.0.0-beta1 420 5/26/2020
9.0.0 1,528 1/16/2020
8.1.38 618 8/30/2019
8.0.32 1,680 5/14/2019
8.0.30 581 4/16/2019
8.0.27 629 2/24/2019
8.0.25 609 2/22/2019
7.0.14 831 9/7/2018
7.0.12 898 5/9/2018