Foundatio - .Net Core用于构建分布式应用程序的可插拔基础块
簡介
Foundatio - 用于構(gòu)建分布式應(yīng)用程序的可插拔基礎(chǔ)塊
?想要針對抽象接口進(jìn)行構(gòu)建,以便我們可以輕松更改實(shí)現(xiàn)。希望這些塊對依賴注入友好。?緩存:我們最初使用的是開源 Redis 緩存客戶端,但后來它變成了具有高許可成本的商業(yè)產(chǎn)品。不僅如此,而且沒有任何內(nèi)存實(shí)現(xiàn),因此每個(gè)開發(fā)人員都需要設(shè)置和配置 Redis。?消息總線:我們最初關(guān)注的是NServiceBus(偉大的產(chǎn)品),但它的許可成本很高(他們也必須吃),但對 OSS 不友好。我們還研究了MassTransit,但發(fā)現(xiàn)缺少 Azure 支持并且本地設(shè)置很麻煩。我們想要一個(gè)可以在本地或云中運(yùn)行的簡單消息總線。?存儲:我們找不到任何在內(nèi)存、文件存儲或 Azure Blob 存儲中解耦和支持的現(xiàn)有項(xiàng)目。
總而言之,如果您希望在允許應(yīng)用擴(kuò)展的同時(shí)進(jìn)行無痛開發(fā)和測試,請使用 Foundatio!
使用
功能
?Caching?Queues?Locks?Messaging?Jobs?File Storage?Metrics
Caching
緩存允許您快速存儲和訪問數(shù)據(jù),ICacheClient我們提供了四種不同的從接口派生的緩存實(shí)現(xiàn):?InMemoryCacheClient:內(nèi)存緩存客戶端實(shí)現(xiàn)。此緩存實(shí)現(xiàn)僅在進(jìn)程的生命周期內(nèi)有效?HybridCacheClient:此緩存實(shí)現(xiàn)同時(shí)使用 anICacheClient和 theInMemoryCacheClient并使用 anIMessageBus來保持緩存跨進(jìn)程同步?RedisCacheClient:Redis 緩存客戶端實(shí)現(xiàn)?RedisHybridCacheClient:HybridCacheClient使用RedisCacheClientasICacheClient和RedisMessageBusas的實(shí)現(xiàn)IMessageBus
-ScopedCacheClient:此緩存實(shí)現(xiàn)采用一個(gè)實(shí)例ICacheClient和一個(gè)字符串scope。范圍是每個(gè)緩存鍵的前綴。這使得確定所有緩存鍵的范圍并輕松刪除它們變得非常容易。
using?Foundatio.Caching; ICacheClient?cache?=?new?InMemoryCacheClient(); await?cache.SetAsync("test",?1); var?value?=?await?cache.GetAsync<int>("test");Queues
隊(duì)列提供先進(jìn)先出 (FIFO) 消息傳遞。IQueue我們提供了四種不同的從接口派生的隊(duì)列實(shí)現(xiàn):
?InMemoryQueue:內(nèi)存隊(duì)列實(shí)現(xiàn)。此隊(duì)列實(shí)現(xiàn)僅在進(jìn)程的生命周期內(nèi)有效。?RedisQueue:一個(gè) Redis 隊(duì)列實(shí)現(xiàn)。?AzureServiceBusQueue:Azure 服務(wù)總線隊(duì)列實(shí)現(xiàn)。?AzureStorageQueue:Azure 存儲隊(duì)列實(shí)現(xiàn)。?SQSQueue:AWS SQS 實(shí)施。
using?Foundatio.Queues;IQueue<SimpleWorkItem>?queue?=?new?InMemoryQueue<SimpleWorkItem>();await?queue.EnqueueAsync(new?SimpleWorkItem?{Data?=?"Hello" });var?workItem?=?await?queue.DequeueAsync();Locks
鎖確保在任何給定時(shí)間只能由一個(gè)消費(fèi)者訪問資源。ILockProvider我們提供了兩種從接口派生的不同鎖定實(shí)現(xiàn):
?CacheLockProvider:使用緩存在進(jìn)程之間進(jìn)行通信的鎖實(shí)現(xiàn)。?ThrottlingLockProvider:一種只允許一定數(shù)量的鎖通過的鎖實(shí)現(xiàn)。您可以使用它來限制對某些外部服務(wù)的 api 調(diào)用,它會(huì)在所有請求該鎖的進(jìn)程中限制它們。?ScopedLockProvider:這個(gè)鎖實(shí)現(xiàn)需要一個(gè)實(shí)例ILockProvider和一個(gè)字符串scope。范圍是每個(gè)鎖定鍵的前綴。這使得確定所有鎖的范圍并輕松釋放它們變得非常容易。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
允許您發(fā)布和訂閱流經(jīng)您的應(yīng)用程序的消息。IMessageBus我們提供了四種不同的從接口派生的消息總線實(shí)現(xiàn):
?InMemoryMessageBus:內(nèi)存消息總線實(shí)現(xiàn)。此消息總線實(shí)現(xiàn)僅在進(jìn)程的生命周期內(nèi)有效。?RedisMessageBus : Redis 消息總線實(shí)現(xiàn)。?RabbitMQMessageBus : RabbitMQ 實(shí)現(xiàn)。?AzureServiceBusMessageBus:Azure 服務(wù)總線實(shí)現(xiàn)。using?Foundatio.Messaging;
IMessageBus?messageBus?=?new?InMemoryMessageBus();
await?messageBus.SubscribeAsync<SimpleMessageA>(msg?=>?{
//?Got?message
});
await?messageBus.PublishAsync(new?SimpleMessageA?{?Data?=?"Hello"?});
Jobs
所有作業(yè)都必須從IJob接口派生。我們還有一個(gè)可以派生的JobBase基類,它提供 JobContext 和日志記錄。然后,您可以通過調(diào)用RunAsync()作業(yè)或創(chuàng)建JobRunner類的實(shí)例并調(diào)用其中一個(gè) Run 方法來運(yùn)行作業(yè)。JobRunner 可用于輕松地將您的作業(yè)作為 Azure Web 作業(yè)運(yùn)行。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我們提供從接口派生的不同文件存儲實(shí)現(xiàn):?InMemoryFileStorage:內(nèi)存文件實(shí)現(xiàn)。此文件存儲實(shí)現(xiàn)僅在進(jìn)程的生命周期內(nèi)有效。?FolderFileStorage:使用硬盤驅(qū)動(dòng)器進(jìn)行存儲的文件存儲實(shí)現(xiàn)。?AzureFileStorage:Azure Blob 存儲實(shí)現(xiàn)。?S3FileStorage:AWS S3 文件存儲實(shí)現(xiàn)。?RedisFileStorage : Redis 文件存儲實(shí)現(xiàn)。?MinioFileStorage Minio文件存儲實(shí)現(xiàn)。?AliyunFileStorage : 一個(gè)阿里云文件存儲實(shí)現(xiàn)。?SshNetFileStorage:一個(gè) SFTP 文件存儲實(shí)現(xiàn)。???using?Foundatio.Storage;
IFileStorage?storage?=?new?InMemoryFileStorage();
await?storage.SaveFileAsync("test.txt",?"test");
string?content?=?await?storage.GetFileContentsAsync("test.txt")
Metrics
IMetricsClient我們提供了五個(gè)從接口派生的實(shí)現(xiàn):?InMemoryMetricsClient:內(nèi)存中的指標(biāo)實(shí)現(xiàn)。?RedisMetricsClient:一個(gè) Redis 指標(biāo)實(shí)現(xiàn)。?StatsDMetricsClient:一個(gè) statsd 指標(biāo)實(shí)現(xiàn)。?MetricsNETClient:一個(gè)Metrics.NET實(shí)現(xiàn)。?AppMetricsClient:一個(gè)AppMetrics實(shí)現(xiàn)。?CloudWatchMetricsClient:AWS CloudWatch實(shí)施。IMetricsClient?metrics?=?new?InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1",?2.534);
metrics.Timer("t1",?50788);
Github地址
https://github.com/FoundatioFx/Foundatio 最后大家如果喜歡我的文章,還麻煩給個(gè)關(guān)注并點(diǎn)個(gè)贊, 希望net生態(tài)圈越來越好!
總結(jié)
以上是生活随笔為你收集整理的Foundatio - .Net Core用于构建分布式应用程序的可插拔基础块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 为大型应用接入 Applica
- 下一篇: .NET 6 使用 Obfuscar 进