Foundatio - .Net Core用于构建分布式应用程序的可插拔基础块
簡介
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 最后大家如果喜歡我的文章,還麻煩給個關注并點個贊, 希望net生態圈越來越好!
總結
以上是生活随笔為你收集整理的Foundatio - .Net Core用于构建分布式应用程序的可插拔基础块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 为大型应用接入 Applica
- 下一篇: C# 观察文件的更改