Foundatio.Minio 10.7.1

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

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

FoundatioFoundatio

Build status NuGet Version feedz.io Discord

构建松散耦合分布式应用程序的可插入基础块。

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

为什么选择Foundatio?

在构建几个大型云应用程序时,我们发现缺少优秀解决方案(并不是说没有解决方案)来构建可扩展的分布式应用程序,同时保持开发体验简单。以下是为什么我们构建和使用Foundatio的一些示例:

  • 希望基于抽象接口进行构建,以便我们可以轻松更改实现。
  • 希望块对依赖注入友好。
  • 缓存:我们最初使用的是开源Redis缓存客户端,但后来它变成了一个具有高额许可费用的商业产品。不仅如此,还没有内存实现,所以每个开发者都必须设置和配置Redis。
  • 消息总线:我们最初考虑了NServiceBus(一款出色的产品),但其许可费用很高(他们也需要吃饭),并且并不开源友好。我们还考虑了MassTransit(另一款出色的产品),但当时发现Microsoft Azure支持不足,并且在内存中的本地设置很痛苦。我们想要一个简单易用的消息总线,它可以在本地或云中运行。
  • 存储:我们没有找到任何现有的项目支持解耦和内存、文件存储或Microsoft Azure Blob存储。

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

实现

入门(开发)

Foundatio可以通过NuGet包管理器进行安装。如果您需要帮助,请提交问题或加入我们的Discord聊天室。如果您有任何问题,我们始终在这里帮助你!

本节仅用于开发目的!如果您正在尝试使用Foundatio库,请从NuGet获取。

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

使用Foundatio

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

缓存

缓存允许您以闪电般的速度存储和访问数据,从而节省创建或检索数据的高额操作成本。我们提供了四种不同的缓存实现,这些实现都基于ICacheClient接口

  1. InMemoryCacheClient:内存缓存客户端实现。这种缓存实现只对进程生存期有效。值得注意的是,内存缓存客户端可以通过MaxItems属性缓存最后X个条目。我们在Exceptionless中使用它来只保持最后250个解析的GeoIP结果
  2. HybridCacheClient:这种缓存实现同时使用ICacheClientInMemoryCacheClient,并使用IMessageBus来在不同进程间保持缓存同步。如果缓存项存在于本地缓存中,这将有助于大大提高性能,因为你节省了序列化操作和对远程缓存的调用。
  3. RedisCacheClient:Redis缓存客户端实现。
  4. RedisHybridCacheClient:使用RedisCacheClient作为ICacheClient以及使用RedisMessageBus作为IMessageBusHybridCacheClient实现。
  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的实例后调用其运行方法之一来运行任务。JobRunner可用于轻松将任务作为Azure Web Jobs运行。
示例
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来运行任务。JobRunner可以用于轻松将任务作为Azure Web Jobs运行。
示例
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. 工作项任务:工作项任务将在与其他工作项任务一起运行的工作池中运行。此类任务非常适合那些不常发生但在任务中应该存在的任务(例如:删除具有许多子实体的实体)。它将在您在消息总线上发布消息时触发。任务必须派生自WorkItemHandlerBase。然后,您可以通过JobRunner运行所有共享任务。JobRunner可以用于轻松将任务作为Azure Web Jobs运行。
示例
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 netcoreapp2.0已计算。 netcoreapp2.1已计算。 netcoreapp2.2已计算。 netcoreapp3.0已计算。 netcoreapp3.1已计算。
.NET Standard netstandard2.0兼容。 netstandard2.1已计算。
.NET Framework net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包内)
了解更多关于 目标框架.NET Standard 的信息。

NuGet 包

此包不会被任何 NuGet 包使用。

GitHub 仓库 (1)

显示依赖 Foundatio.Minio 的前 1 个流行的 GitHub 仓库

仓库 星标
exceptionless/Exceptionless
Exceptionless 应用
版本 下载 最后更新
10.7.1 732 3/27/2024
10.7.0 2,210 1/5/2024
10.6.1 6,811 6/23/2023
10.6.0 1,221 1/1/2023
10.5.0 1,765 5/18/2022
10.4.0 705 3/8/2022
10.3.0 538 1/20/2022
10.2.2 912 9/23/2021
10.2.0 848 7/8/2021
10.0.2 682 1/20/2021
10.0.0 1,933 9/16/2020
10.0.0-beta9 673 8/25/2020
10.0.0-beta8 323 8/3/2020
10.0.0-beta7 333 7/29/2020
10.0.0-beta6 429 7/8/2020
10.0.0-beta5 545 6/20/2020
10.0.0-beta3 458 6/14/2020
10.0.0-beta10 379 9/15/2020
10.0.0-beta1 369 5/26/2020
9.0.0 2,511 1/16/2020
8.1.58 1,125 8/30/2019
8.0.52 2,070 5/14/2019
8.0.50 638 4/17/2019
8.0.44 804 2/24/2019
8.0.42 610 2/22/2019
7.0.29 887 9/7/2018
7.0.23 2,703 5/7/2018