Foundatio.AWS 10.7.1
前缀已保留
dotnet add package Foundatio.AWS --version 10.7.1
NuGet\Install-Package Foundatio.AWS -Version 10.7.1
<PackageReference Include="Foundatio.AWS" Version="10.7.1" />
paket add Foundatio.AWS --version 10.7.1
#r "nuget: Foundatio.AWS, 10.7.1"
// Install Foundatio.AWS as a Cake Addin #addin nuget:?package=Foundatio.AWS&version=10.7.1 // Install Foundatio.AWS as a Cake Tool #tool nuget:?package=Foundatio.AWS&version=10.7.1
构建松散耦合分布式应用的插件化基础块。
包含Redis、Azure、AWS、RabbitMQ、Kafka和内存(开发阶段)中的实现。
为什么选择Foundatio?
在构建几个大型云应用时,我们发现缺乏优秀的解决方案(这并不意味着没有解决方案),这些方案在构建可扩展的分布式应用时,既保持了简单的开发体验。以下是why we built and use Foundatio的几个例子。
- 希望针对抽象接口构建,以便我们能够轻松更改实现。
- 希望块对依赖注入友好。
- 缓存:我们最初使用的是开源的Redis缓存客户端,但后来它变成了具有高许可费用的商业产品。不仅如此,它不支持内存实现,因此每个开发者都必须设置和配置Redis。
- 消息总线:我们最初考虑了NServiceBus(优秀的产品),但由于其高许可费用(他们也有生计要解决),对于开源不是特别友好。我们还考虑了MassTransit(另一个优秀的工具),但当时发现Azure支持不足,而本地设置却很麻烦(对于内存)。我们希望有一个简单易用的消息总线,无论是在本地还是云端都能够顺畅运行。
- 存储:我们找不到任何现有的项目能够提供解耦合且支持内存、文件存储或Azure Blob存储的功能。
总结一下,如果您希望开发测试无痛苦,同时允许您的应用进行扩展,请使用Foundatio!
实现
- Redis - 缓存、存储、队列、消息、锁、指标
- Azure存储 - 存储、队列
- Azure ServiceBus - 队列、消息
- AWS - 存储、队列、指标
- Kafka - 消息
- RabbitMQ - 消息
- Minio - 存储
- 阿里云 - 存储
- SshNet - 存储
入门指南(开发)
可以通过 NuGet包管理器 安装Foundatio。如果您需要帮助,请提交一个issue或加入我们的Discord聊天室。如果您有任何问题,我们随时都在这里帮忙!
本部分仅用于开发目的!如果您正在尝试使用Foundatio库,请从NuGet获取。
- 您需要已安装Visual Studio Code。
- 打开Visual Studio
Foundatio.sln
解决方案文件。
使用Foundatio
下文包含Foundatio功能的一小部分。我们建议查看源代码以获取更多信息。如果您有任何问题或需要帮助,请告诉我们!
缓存
缓存允许您快速存储和访问数据,从而节省创建或获取数据的昂贵操作。我们提供了四种不同的缓存实现,这些实现源自ICacheClient
接口
- InMemoryCacheClient:内存缓存客户端实现。此缓存实现仅适用于进程生命周期。值得注意的是,内存缓存客户端可以通过
MaxItems
属性缓存最后X个项目。我们在Exceptionless中使用了它,只保留最后250个解析的GeoIP结果。 - HybridCacheClient:该缓存实现同时使用
ICacheClient
和InMemoryCacheClient
,并通过IMessageBus
保持缓存在进程间的同步。如果项存在于本地缓存中,则这可以带来巨大的性能提升,因为您节省了一个序列化操作和远程调用的调用。 - RedisCacheClient:Redis缓存客户端实现。
- RedisHybridCacheClient:
HybridCacheClient
的实现,其中使用RedisCacheClient
作为ICacheClient
,并使用RedisMessageBus
作为IMessageBus
。 - ScopedCacheClient:该缓存实现接受一个
ICacheClient
实例和一个字符串scope
。作用域会添加到每个缓存键的前面。这使得统一定义并轻松删除缓存键变得非常容易。
示例
using Foundatio.Caching;
ICacheClient cache = new InMemoryCacheClient();
await cache.SetAsync("test", 1);
var value = await cache.GetAsync<int>("test");
队列
队列提供先进先出(FIFO)的消息传递。我们提供了四个不同的队列实现,这些实现源于IQueue
接口
- InMemoryQueue:内存队列实现。此队列实现仅在进程的生命周期内有效。
- RedisQueue:Redis队列实现。
- AzureServiceBusQueue:Azure Service Bus Queue实现。
- AzureStorageQueue:Azure Storage Queue实现。
- 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
接口。
- CacheLockProvider:使用缓存进行进程间通信的锁实现。
- ThrottlingLockProvider:仅允许一定数量的锁通过的锁实现。您可以将其用于限制对某些外部服务的API调用,并在所有请求该锁的进程之间对其进行节流。
- 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
接口
- InMemoryMessageBus:内存消息代理实现。此消息代理实现仅在进程的生命周期内有效。
- RedisMessageBus:Redis消息代理实现。
- RabbitMQMessageBus:RabbitMQ 实现版本。
- KafkaMessageBus:Kafka 实现版本。
- 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" });
作业
允许您运行长时间运行的过程(进程内或进程外)而不用担心它被提前终止。我们根据您的用例提供三种定义作业的不同方法
- 作业:所有作业都必须从以下接口继承:
IJob
接口。我们还提供了一个您可以从中继承以提供 JobContext 和日志记录的基础类:JobBase
基类。您可以调用作业上的RunAsync()
来运行作业,或者创建一个JobRunner
类的实例,并调用其其中一个运行方法。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;
- 队列处理作业:队列处理作业非常适合处理那些将来自队列数据的作业。队列处理作业必须从以下类继承:
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;
- 工作项作业:工作项作业将在与其他工作项作业一起工作的作业池中运行。这种类型的作业非常适合不太经常发生但应该作为作业处理的事情(例如:删除具有许多子项的实体)。它将在您在
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
接口
- InMemoryFileStorage:内存中的文件实现。这种文件存储实现仅在过程中的生命周期内有效。
- FolderFileStorage:使用硬盘进行存储的文件存储实现。
- AzureFileStorage:Azure Blob 存储实现。
- S3FileStorage:AWS S3 文件存储实现。
- RedisFileStorage:Redis 文件存储实现。
- MinioFileStorage:Minio 文件存储实现。
- AliyunFileStorage:阿里云文件存储实现。
- SshNetFileStorage:一个SFTP文件存储实现。
我们建议将所有 IFileStorage
实现用作单例。
示例
using Foundatio.Storage;
IFileStorage storage = new InMemoryFileStorage();
await storage.SaveFileAsync("test.txt", "test");
string content = await storage.GetFileContentsAsync("test.txt")
度量
我们提供了五个由 IMetricsClient
接口 衍生的实现。
- InMemoryMetricsClient:一个内存中的度量值实现。
- RedisMetricsClient:一个Redis度量值实现。
- StatsDMetricsClient:一个statsd度量值实现。
- MetricsNETClient:一个Metrics.NET实现。
- AppMetricsClient:一个AppMetrics实现。
- CloudWatchMetricsClient:一个AWS CloudWatch实现。
我们建议将所有 IMetricsClient
实现用作单例。
示例
IMetricsClient metrics = new InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1", 2.534);
metrics.Timer("t1", 50788);
示例应用程序
我们有演示如何使用Foundatio的幻灯片和一个示例应用程序。
感谢所有贡献者
产品 | 版本 兼容的和额外的计算目标框架版本。 |
---|---|
.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 已计算。 |
-
.NETStandard 2.0
- AWSSDK.CloudWatch (>= 3.7.301.14)
- AWSSDK.S3 (>= 3.7.307.3)
- AWSSDK.SQS (>= 3.7.300.62)
- Foundatio (>= 10.7.1)
NuGet包 (1)
显示依赖Foundatio.AWS的顶级1个NuGet包
包 | 下载 |
---|---|
LShared.Frameworks
包描述 |
GitHub仓库 (1)
显示依赖Foundatio.AWS的顶级1个流行的GitHub仓库
仓库 | 星标 |
---|---|
exceptionless/Exceptionless
Exceptionless应用程序
|
版本 | 下载 | 最后更新 |
---|---|---|
10.7.1 | 7,113 | 3/27/2024 |
10.7.0 | 5,573 | 1/5/2024 |
10.6.1 | 8,973 | 6/23/2023 |
10.6.0 | 18,727 | 1/4/2023 |
10.5.0 | 3,944 | 5/18/2022 |
10.4.0 | 7,070 | 3/8/2022 |
10.3.0 | 1,461 | 1/20/2022 |
10.2.2 | 4,922 | 9/23/2021 |
10.2.0 | 4,170 | 7/8/2021 |
10.1.0 | 448 | 6/17/2021 |
10.0.2 | 24,557 | 1/20/2021 |
10.0.0 | 4,035 | 9/16/2020 |
10.0.0-beta9 | 1,005 | 8/25/2020 |
10.0.0-beta8 | 396 | 8/6/2020 |
10.0.0-beta6 | 824 | 7/8/2020 |
10.0.0-beta5 | 544 | 6/20/2020 |
10.0.0-beta3 | 988 | 6/14/2020 |
10.0.0-beta2 | 427 | 6/6/2020 |
10.0.0-beta10 | 373 | 9/15/2020 |
10.0.0-beta1 | 389 | 5/26/2020 |
10.0.0-alpha3 | 671 | 5/8/2020 |
9.0.0 | 20,722 | 1/16/2020 |
8.1.1556 | 16,002 | 8/30/2019 |
8.0.1547 | 5,943 | 5/14/2019 |
8.0.1544 | 638 | 5/10/2019 |
8.0.1541 | 1,645 | 4/16/2019 |
8.0.1537 | 1,091 | 3/12/2019 |
8.0.1535 | 669 | 3/12/2019 |
8.0.1533 | 975 | 2/24/2019 |
8.0.1531 | 979 | 2/22/2019 |
7.1.1514 | 2,232 | 11/9/2018 |
7.0.1510 | 9,273 | 9/7/2018 |
7.0.1508 | 3,659 | 5/9/2018 |
6.0.1482 | 2,862 | 11/30/2017 |
5.1.1467 | 1,183 | 8/21/2017 |
5.1.1463 | 1,234 | 8/1/2017 |
5.1.1455 | 5,027 | 6/23/2017 |
5.1.1452 | 1,229 | 5/5/2017 |
5.0.1336 | 1,169 | 3/14/2017 |
5.0.1334 | 1,115 | 3/13/2017 |
5.0.1331 | 1,131 | 3/12/2017 |
5.0.1329-pre | 836 | 3/12/2017 |
5.0.1328-pre | 851 | 3/12/2017 |
5.0.1327-pre | 840 | 3/12/2017 |
5.0.1326-pre | 872 | 3/12/2017 |
5.0.1324-pre | 833 | 3/12/2017 |
4.3.1323-pre | 839 | 3/11/2017 |
4.3.1319 | 1,185 | 3/1/2017 |
4.3.1317 | 1,206 | 2/23/2017 |
4.3.1316 | 1,151 | 2/22/2017 |
4.3.1315 | 1,155 | 2/22/2017 |
4.3.1314 | 1,230 | 2/20/2017 |
4.3.1312 | 1,123 | 2/20/2017 |
4.3.1311-pre | 828 | 2/20/2017 |
4.3.1307 | 1,132 | 2/16/2017 |
4.3.1306 | 1,114 | 2/15/2017 |
4.3.1305 | 1,121 | 2/15/2017 |
4.3.1304-pre | 889 | 2/15/2017 |
4.3.1303-pre | 833 | 2/14/2017 |
4.3.1301 | 1,113 | 2/14/2017 |
4.3.1299 | 1,103 | 2/14/2017 |
4.3.1293 | 1,100 | 2/12/2017 |
4.3.1292 | 1,107 | 2/10/2017 |
4.3.1291 | 1,110 | 2/10/2017 |
4.3.1290 | 1,115 | 2/10/2017 |
4.3.1289 | 1,108 | 2/9/2017 |
4.3.1288 | 1,155 | 2/9/2017 |
4.3.1286 | 1,109 | 2/8/2017 |
4.3.1282 | 1,156 | 2/5/2017 |
4.3.1281 | 1,214 | 2/5/2017 |
4.3.1280 | 1,130 | 2/5/2017 |
4.3.1276-pre | 845 | 2/5/2017 |
4.3.1177-pre | 5,731 | 9/2/2016 |
4.3.1164-pre | 806 | 8/21/2016 |
4.2.1205-pre | 1,144 | 9/19/2016 |
4.2.1183 | 1,415 | 9/9/2016 |
4.2.1179 | 1,039 | 9/8/2016 |
4.2.1176 | 1,061 | 9/2/2016 |
4.2.1172 | 1,024 | 9/1/2016 |
4.2.1171-pre | 812 | 9/1/2016 |
4.2.1169 | 1,033 | 8/22/2016 |
4.2.1167-pre | 813 | 8/22/2016 |
4.2.1166-pre | 832 | 8/22/2016 |
4.2.1161 | 1,017 | 8/10/2016 |
4.2.1156-pre | 825 | 8/2/2016 |
4.2.1155 | 1,026 | 8/1/2016 |
4.2.1150 | 1,036 | 7/20/2016 |
4.2.1149-pre | 831 | 7/19/2016 |
4.2.1148-pre | 788 | 7/19/2016 |
4.2.1147-pre | 830 | 7/19/2016 |
4.2.1146-pre | 805 | 7/19/2016 |
4.2.1137 | 1,026 | 7/19/2016 |
4.2.1129-pre | 839 | 7/19/2016 |
4.2.1128-pre | 819 | 7/19/2016 |
4.2.1127-pre | 815 | 7/19/2016 |
4.2.1126-pre | 831 | 7/19/2016 |
4.2.1125-pre | 805 | 7/19/2016 |
4.2.1123-pre | 829 | 7/19/2016 |
4.2.1119-pre | 828 | 7/18/2016 |
4.2.1113-pre | 816 | 7/16/2016 |
4.2.1108-pre | 852 | 7/15/2016 |
4.2.1107-pre | 860 | 7/15/2016 |
4.2.1104-pre | 999 | 7/13/2016 |
4.2.1099-pre | 1,015 | 7/12/2016 |
4.2.1098-pre | 987 | 7/12/2016 |
4.2.1093-pre | 857 | 7/8/2016 |
4.2.1091-pre | 887 | 7/8/2016 |
4.2.1090-pre | 865 | 7/8/2016 |
4.2.1089-pre | 864 | 7/7/2016 |
4.2.1087-pre | 844 | 7/7/2016 |
4.2.1083-pre | 851 | 7/6/2016 |
4.2.1082-pre | 870 | 7/6/2016 |
4.2.1081-pre | 862 | 7/6/2016 |
4.2.1079-pre | 851 | 7/6/2016 |
4.2.1078-pre | 871 | 7/6/2016 |
4.2.1073-pre | 880 | 7/5/2016 |
4.2.1070-pre | 840 | 7/5/2016 |
4.2.1069-pre | 836 | 7/1/2016 |
4.2.1059-pre | 821 | 7/1/2016 |
4.2.1046-pre | 830 | 6/24/2016 |
4.2.1031-pre | 842 | 6/24/2016 |
4.2.1028-pre | 822 | 6/24/2016 |
4.2.1027-pre | 888 | 6/24/2016 |
4.1.1009 | 1,276 | 6/15/2016 |
4.1.1002-pre | 1,137 | 6/14/2016 |
4.1.995-pre | 994 | 6/13/2016 |
4.1.989-pre | 1,147 | 5/26/2016 |
4.1.983-pre | 855 | 5/25/2016 |
4.1.982-pre | 816 | 5/25/2016 |
4.1.978-pre | 855 | 5/6/2016 |
4.1.977-pre | 831 | 5/5/2016 |
4.1.975-pre | 830 | 5/5/2016 |
4.0.958 | 1,133 | 5/1/2016 |
4.0.957 | 1,206 | 4/29/2016 |
4.0.956 | 1,262 | 4/29/2016 |
4.0.955 | 1,056 | 4/28/2016 |
4.0.941 | 1,327 | 4/27/2016 |
4.0.940 | 1,303 | 4/27/2016 |
4.0.925 | 1,226 | 4/27/2016 |
4.0.922 | 1,155 | 4/27/2016 |
4.0.909 | 1,198 | 4/20/2016 |
4.0.880 | 1,114 | 4/7/2016 |
4.0.869 | 1,077 | 3/30/2016 |
4.0.864 | 1,051 | 3/29/2016 |
4.0.861 | 1,055 | 3/29/2016 |
4.0.860 | 1,070 | 3/29/2016 |
4.0.857 | 1,052 | 3/29/2016 |
4.0.855 | 1,057 | 3/29/2016 |