Foundatio.Aliyun 10.7.1

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

// Install Foundatio.Aliyun as a Cake Tool
#tool nuget:?package=Foundatio.Aliyun&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存储的项目。

总结一下,如果您希望在开发和测试过程中不感到痛苦,同时允许您的应用进行扩展,请使用Foundatio!

实现

入门(开发)

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

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

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

使用Foundatio

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

缓存

缓存允许您高速存储和访问数据,从而节省创建或获取数据的昂贵操作。我们提供了四种不同的缓存实现,这些实现都源于ICacheClient接口

  1. InMemoryCacheClient:一种内存缓存客户端实现。这种缓存实现仅适用于进程的生命周期。值得注意的是,内存缓存客户端具有通过MaxItems属性缓存最后X个项目的功能。我们在Exceptionless中使用它仅保留最后250个解析的geoip结果
  2. HybridCacheClient:这种缓存实现同时使用ICacheClient和InMemoryCacheClient,并通过IMessageBus保持进程间缓存的一致性。如果项存在于本地缓存中,这可以带来<强>巨大的性能提升,因为你节省了序列化操作和对远程缓存的调用。
  3. RedisCacheClient:Redis缓存客户端实现。
  4. RedisHybridCacheClient:一个HybridCacheClient的实现,它使用RedisCacheClient作为ICacheClient和RedisMessageBus作为IMessageBus。
  5. ScopedCacheClient:这种缓存实现接受一个ICacheClient的实例和一个字符串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 Queue实现。
  4. AzureStorageQueue:Azure Storage Queue实现。
  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。范围被添加到每个锁键的前面。这使得对所有锁进行范围划分和轻松释放变得非常简单。

值得注意的是,所有锁提供者都使用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基类,它提供了JobContext和日志记录。您可以通过在作业上调用RunAsync()或在创建JobRunner的一个实例并调用Run方法之一来运行作业。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来运行作业。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来运行所有共享作业。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 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.Aliyun 依赖的最受欢迎的 1 个 GitHub 仓库

仓库 星星数
exceptionless/Exceptionless
Exceptionless 应用
版本 下载 最后更新
10.7.1 708 3/27/2024
10.7.0 1,844 1/5/2024
10.6.1 2,235 6/23/2023
10.6.0 1,196 1/1/2023
10.5.0 1,732 5/18/2022
10.4.0 692 3/8/2022
10.3.0 513 1/20/2022
10.2.2 849 9/23/2021
10.2.0 669 7/8/2021
10.0.0 1,818 9/16/2020
10.0.0-beta9 636 8/25/2020
10.0.0-beta8 327 8/3/2020
10.0.0-beta7 332 7/29/2020
10.0.0-beta6 423 7/8/2020
10.0.0-beta5 536 6/20/2020
10.0.0-beta3 428 6/14/2020
10.0.0-beta2 403 6/6/2020
10.0.0-beta10 344 9/15/2020
10.0.0-beta1 360 5/26/2020
9.0.0 2,087 1/16/2020
8.1.54 1,715 8/30/2019
8.0.48 2,218 5/14/2019
8.0.46 791 4/16/2019
8.0.43 909 2/24/2019
8.0.41 703 2/22/2019
7.0.30 1,302 9/7/2018
7.0.28 1,199 5/9/2018
6.0.4 1,125 11/30/2017