本文要点
ASP.NET Core
内置了分布式缓存接口。分布式缓存的主要好处有性能、数据共享和稳定性。
Couchbase服务器是一个内存优先的数据库,非常适合作为分布式缓存。
NuGet程序包使得在应用程序中添加Couchbase服务器变得非常容易。
使用“IDistrubutedCache”接口屏蔽掉细节,使得在
ASP.NET Core
控制器中与缓存的交互变得简单。
随着.NET Core
2.0 的发布,微软拥有了这个通用、模块化、跨平台开源平台的下一个主要版本,该平台最初发布于 2016 年。在创建过程中,.NET Core
包含了.NET
Framework 当前版本提供的许多 API。它最初是为了下一代ASP.NET
解决方案而创建的,但现在,它推动了包括物联网、云和下一代移动解决方案在内的许多其他场景的发展,并成为它们的基础。在这个介绍.NET Core
的第二系列中,我们将进一步探讨.NET Core
的一些好处,以及它如何使传统的.NET
开发人员以及所有需要为市场提供健壮而又经济的高性能解决方案的技术人员受益。
缓存可以帮助提高ASP.NET Core
应用程序的性能。对于部署到服务器群或可伸缩云环境的ASP.NET Core
应用程序,分布式缓存非常有用。微软的文档中包含了使用 SQL Server 或 Redis 做缓存的示例,但在本文中,我将展示另一种方法。Couchbase 服务器是一个分布式数据库,具有内存优先(或可选择仅限内存)的存储体系结构,这使它成为缓存的理想选择。与 Redis 不同,它具有一套更丰富的功能,你可以在以后的用例和产品扩展时使用它们。但在这篇文章中,我将重点介绍它的缓存功能和与ASP.NET Core
的集成。Github 上提供了所有的代码示例。
分布式缓存的优点
性能:缓存会将数据存储在RAM中,可以进行方便快捷地检索。从这个缓存中检索数据通常比每次都使用原始数据源要快。
缓存数据共享:如果你的
ASP.NET Core
应用程序正在使用多服务器部署,那么负载均衡器可以把用户定向到任何一个ASP.NET Core
服务器。如果缓存的数据在Web服务器上,那么你就需要打开粘性会话,以确保用户总是被定向到相同的ASP.NET Core
服务器。这可能导致负载不均匀和其他网络问题——更多细节请参见Stack Overflow上的回答)。稳定性:如果一个
ASP.NET Core
Web服务器宕机或者因为什么原因需要重启,这不会影响缓存的数据。重启后,它仍然在分布式缓存中。
无论你使用哪种工具作为分布式缓存(Couchbase、Redis 或 SQL Server), ASP.NET Core
为你希望使用的任何缓存技术都提供了一致的接口。
安装 Couchbase
第一步是让分布式缓存服务器运行起来。选择对你而言最方便的安装方法。你可以使用 Docker 或云提供商,也可以在本地机器上安装它(我在本文中就是这样做的)。它是免费下载的,你可以使用免费的 Couchbase 社区版。(企业版对于预生产使用也是免费的,并且没有限制,但在本文中,我将使用社区版)。
在安装 Couchbase 时,你需要打开 Web 浏览器并跟随一个简短的向导完成设置。对于这篇文章,使用默认设置即可。
安装 Couchbase 后,创建一个“桶(bucket)”。这是存储缓存数据的地方。我将我的桶命名为为“infoqcache”。我创建了一个“临时(Ephemeral)”桶(这是一个仅限内存的选项)。你还可以使用“Couchbase”桶(首先将数据存储在内存中,并异步地持久化到磁盘上)。
Couchbase 设置的最后一个步骤是安全。向那个桶添加一个具有适当权限的 Couchbase 用户。我给我的用户取名为“infoq”,并给它设置了一个密码“password”(在生产环境中,请使用更强的密码!)。在企业版中,有许多角色可供选择,但是对于这个简单的用例,我们不需要它们。对于 infoqcache,“桶完全访问(Bucket Full Access)”已经足够了。
在开始使用ASP.NET Core
之前,请确保你已经完成了所有这些安装步骤。下面是链接到更详细文档的步骤。
安装Couchbase(按照下载页面上的指令)
设置Couchbase(探索服务器配置)
创建一个用户,并授予访问桶的权限(在UI界面上创建和管理用户)
新建一个ASP.NET Core
应用程序
我将创建一个ASP.NET Core
API 示例应用程序,展示ASP.NET Core
的分布式缓存功能。这将是一个有两个端点的小而简单的应用程序。
我用的是 Visual Studio 2017。从中,我选择文件→新建→Web→ASP.NET Core
Web 应用程序。
下一步是选择使用哪种ASP.NET Core
项目模板。我使用了基本的“API”,没有身份验证和 Docker 支持。
这个项目有一个 ValuesController.cs 文件。我将用我自己的代码替换这个类中的大部分代码。这是我要创建的第一个端点。它不使用任何缓存,并且有一个Thread.Sleep
,用于模拟高延迟数据访问(设想一下,用缓慢的 Web 服务调用或复杂的数据库查询替换Thread.Sleep
)。
启动该网站(在 Visual Studio 中按 Ctrl+F5)。你可以使用Postman之类的工具与这个端点交互。但是,对于这个例子来说,浏览器已经足够了。在我的示例项目中,站点将启动到localhost:64921
,我将该端点的路由配置成api/get
。因此,在浏览器中,我输入localhost:64921/api/get
。
这是一个简单的例子,但是它展示了这个端点 a)获取了某个唯一的字符串值,b)花了很长时间。每次刷新至少要等待 5 秒钟。这将是引入缓存来改善延迟和性能的好地方。
ASP.NET Core
和 Couchbase 集成
我们现在已经有了一个需要缓存的ASP.NET Core
应用程序,以及一个希望提供帮助的 Couchbase 服务器实例。让它们一起工作吧。
第一步是从 NuGet 安装程序包。你可以使用 NuGet UI 搜索 Couchbase.Extensions.Caching,或者你可以在包管理器控制台中运行此命令:Install-Package Couchbase.Extensions.Caching -Version 1.0.1
。这是一个开源项目,Github 上提供了完整的源代码。
NuGet 将安装ASP.NET Core
应用程序与 Couchbase 服务器通信以及与ASP.NET Core
内置的分布式缓存功能集成所需的所有包。
现在,打开项目中的Startup.cs
文件。这里,你需要向 ConfigureServices 方法添加一些设置代码。
(在文件顶部,我还添加了using Couchbase.Extensions.Caching;
和using Couchbase.Extensions.DependencyInjection;
,但是,我是使用 ReSharper 自动识别和添加的)。
在上述代码中,AddCouchbase
和AddDistributedCouchbaseCache
是添加到ASP.NET Core
内置接口IServiceCollection
中扩展方法。
AddCouchbase
方法告诉ASP.NET Core
如何连接到 Couchbase,并提供我前面提到的用户名和密码。
AddDistributedCouchbaseCache
方法告诉ASP.NET Core
如何把 Couchbase 作为一个分布式缓存使用,并指定了我前面提到的桶的名称。
GitHub 上提供了这个扩展的文档。不要忘记在 ConfigureServices 方法中添加清理/拆除代码。
使用ASP.NET Core
的分布式缓存
现在,我们已经配置了ASP.NET Core
,它已经知道如何缓存了。让我们把它应用在一个简单的例子中。
对于分布式缓存,我们可以做的最简单的事情是将其注入到ValuesController
中,并直接使用IDistributedCachedirectly
。
首先,向构造函数添加一个参数IDistributedCacheas
。
由于我们已经在 Startup.cs 中配置了分布式缓存,ASP.NET Core
知道如何设置这个参数(使用依赖注入)。现在,可以在 ValuesController 中使用_cache
来获取/设置缓存中的值。我写了另一个端点 GetUsingCache。它与前面的 Get 端点类似,只是它将使用缓存。在第一次调用之后,它将存储该值,随后的调用将不会再到达 Thread.Sleep。
第一个到/api/getfast 的请求仍然会很慢,但是刷新页面,下一个请求将从缓存中提取数据。切换回 Couchbase 控制台,单击菜单中的“Buckets”,你将看到“infoqcache”桶中现在有一条记录。
有一件重要的事情需要指出,在 ValuesController 中,它与 Couchbase 库没有直接耦合。它完全依赖于ASP.NET Core
库。这个通用接口使你能够在任何使用微软标准ASP.NET Core
库的地方使用 Couchbase 分布式缓存。而且,全都封装在IDistributedCache
接口中,这使你更容易编写测试。
在上面的例子中,缓存的数据将无限期地驻留在缓存中。但是,你也可以为缓存指定一个过期时间。在下面的示例中,端点将缓存数据 5 分钟(在 SlidingExpiration 上指定)。
小结
ASP.NET Core
可以与 Couchbase 服务器集成获得分布式缓存功能。ASP.NET Core
提供的标准分布式缓存接口使你可以轻松地开始使用缓存。接下来,就可以通过缓存提升ASP.NET Core
分布式应用程序的速度了。
如果你对 Couchbase.Extensions 有任何问题或意见,请务必检出GitHub存储库或在Couchbase . NET SDK论坛上告诉我们。
关于作者
Matthew D. Groves 热衷于编码。不管是 C#、jQuery 还是 PHP,他都会提交 pull 请求。早在上世纪 90 年代,他就为他父母的披萨店编写了一款名为 QuickBASIC 的销售终端应用程序,从那时起,他就一直专业从事编程。目前,他是 Couchbase 的开发大使。他还是 AOP in .NET 一书的作者(由 Manning 出版),也是微软 MVP。
随着.NET Core
2.0 的发布,微软拥有了这个通用、模块化、跨平台开源平台的下一个主要版本,该平台最初发布于 2016 年。在创建过程中,.NET Core
包含了.NET
Framework 当前版本提供的许多 API。它最初是为了下一代 ASP.NET 解决方案而创建的,但现在,它推动了包括物联网、云和下一代移动解决方案在内的许多其他场景的发展,并成为它们的基础。在这个介绍.NET Core
的第二系列中,我们将进一步探讨.NET Core
的一些好处,以及它如何使传统的.NET
开发人员以及所有需要为市场提供健壮而又经济的高性能解决方案的技术人员受益。
查看英文原文:Distributed Caching With ASP.NET Core
评论 1 条评论