简介
Foundatio - 用于构建分布式应用程序的可插拔基础块
- 想要针对抽象接口进行构建,以便我们可以轻松更改实现。希望这些块对依赖注入友好。
- 缓存:我们最初使用的是开源 Redis 缓存客户端,但后来它变成了具有高许可成本的商业产品。不仅如此,而且没有任何内存实现,因此每个开发人员都需要设置和配置 Redis。.
- 消息总线:我们最初关注的是NServiceBus(伟大的产品),但它的许可成本很高(他们也必须吃),但对 OSS 不友好。我们还研究了MassTransit,但发现缺少 Azure 支持并且本地设置很麻烦。我们想要一个可以在本地或云中运行的简单消息总线。
- 存储:我们找不到任何在内存、文件存储或 Azure Blob 存储中解耦和支持的现有项目。
总而言之,如果您希望在允许应用扩展的同时进行无痛开发和测试,请使用 Foundatio!
使用
功能
- Caching
- Queues
- Locks
- Messaging
- Jobs
- File Storage
- Metrics
Caching
缓存允许您快速存储和访问数据,ICacheClient我们提供了四种不同的从接口派生的缓存实现:
- InMemoryCacheClient:内存缓存客户端实现。此缓存实现仅在进程的生命周期内有效
- HybridCacheClient:此缓存实现同时使用 anICacheClient和 theInMemoryCacheClient并使用 anIMessageBus来保持缓存跨进程同步
- RedisCacheClient:Redis 缓存客户端实现
- RedisHybridCacheClient:HybridCacheClient使用RedisCacheClientasICacheClient和RedisMessageBusas的实现IMessageBus
- ScopedCacheClient:此缓存实现采用一个实例ICacheClient和一个字符串scope。范围是每个缓存键的前缀。这使得确定所有缓存键的范围并轻松删除它们变得非常容易。
using Foundatio.Caching;
ICacheClient cache = new InMemoryCacheClient();
await cache.SetAsync("test", 1);
var value = await cache.GetAsync<int>("test");
Queues
队列提供先进先出 (FIFO) 消息传递。IQueue我们提供了四种不同的从接口派生的队列实现:
- InMemoryQueue:内存队列实现。此队列实现仅在进程的生命周期内有效。
- RedisQueue:一个 Redis 队列实现。
- AzureServiceBusQueue:Azure 服务总线队列实现。
- AzureStorageQueue:Azure 存储队列实现。
- SQSQueue:AWS SQS 实施。
using Foundatio.Queues;
IQueue<SimpleWorkItem> queue = new InMemoryQueue<SimpleWorkItem>();
await queue.EnqueueAsync(new SimpleWorkItem {
Data = "Hello"
});
var workItem = await queue.DequeueAsync();
Locks
锁确保在任何给定时间只能由一个消费者访问资源。ILockProvider我们提供了两种从接口派生的不同锁定实现:
- CacheLockProvider:使用缓存在进程之间进行通信的锁实现。
- ThrottlingLockProvider:一种只允许一定数量的锁通过的锁实现。您可以使用它来限制对某些外部服务的 api 调用,它会在所有请求该锁的进程中限制它们。
- ScopedLockProvider:这个锁实现需要一个实例ILockProvider和一个字符串scope。范围是每个锁定键的前缀。这使得确定所有锁的范围并轻松释放它们变得非常容易。
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();
Messaging
允许您发布和订阅流经您的应用程序的消息。IMessageBus我们提供了四种不同的从接口派生的消息总线实现:
- InMemoryMessageBus:内存消息总线实现。此消息总线实现仅在进程的生命周期内有效。
- RedisMessageBus : Redis 消息总线实现。
- RabbitMQMessageBus : RabbitMQ 实现。
- AzureServiceBusMessageBus:Azure 服务总线实现。
using Foundatio.Messaging;
IMessageBus messageBus = new InMemoryMessageBus();
await messageBus.SubscribeAsync<SimpleMessageA>(msg => {
// Got message
});
await messageBus.PublishAsync(new SimpleMessageA { Data = "Hello" });
Jobs
所有作业都必须从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);
}}
File Storage
IFileStorage我们提供从接口派生的不同文件存储实现:
- InMemoryFileStorage:内存文件实现。此文件存储实现仅在进程的生命周期内有效。
- FolderFileStorage:使用硬盘驱动器进行存储的文件存储实现。
- AzureFileStorage:Azure Blob 存储实现。
- S3FileStorage:AWS S3 文件存储实现。
- RedisFileStorage : Redis 文件存储实现。
- MinioFileStorage Minio文件存储实现。
- AliyunFileStorage : 一个阿里云文件存储实现。
- SshNetFileStorage:一个 SFTP 文件存储实现。
using Foundatio.Storage;
IFileStorage storage = new InMemoryFileStorage();
await storage.SaveFileAsync("test.txt", "test");
string content = await storage.GetFileContentsAsync("test.txt")
Metrics
IMetricsClient我们提供了五个从接口派生的实现:
- InMemoryMetricsClient:内存中的指标实现。
- RedisMetricsClient:一个 Redis 指标实现。
- StatsDMetricsClient:一个 statsd 指标实现。
- MetricsNETClient:一个Metrics.NET实现。
- AppMetricsClient:一个AppMetrics实现。
- CloudWatchMetricsClient:AWS CloudWatch实施。
IMetricsClient metrics = new InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1", 2.534);
metrics.Timer("t1", 50788);
Github地址
https://github.com/FoundatioFx/Foundatio