.NET Core-统一认证平台之自定义缓存Redis(5)

一、缓存介绍及选型

网关的一个重要的功能就是缓存,可以对一些不常更新的数据进行缓存,减少后端服务开销,默认Ocelot实现的缓存为本地文件进行缓存,无法达到生产环境大型应用的需求,而且不支持分布式环境部署,所以我们需要一个满足大型应用和分布式环境部署的缓存方案。Redis应该是当前应用最广泛的缓存数据库,支持5种存储类型,满足不同应用的实现,且支持分布式部署等特性,所以缓存我们决定使用Redis作为缓存实现。

本文将介绍使用CSRedisCore来实现Redis相关操作.

二、缓存扩展实现

首先本地安装Redis和管理工具Redis Desktop Manager,本文不介绍安装过程,然后NuGet安装 CSRedisCore,现在开始我们重写IOcelotCache<T>的实现,新建InRedisCache.cs文件。

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

实现所有缓存相关接口,是不是很优雅呢?实现好缓存后,我们需要把我们现实的注入到网关里,在ServiceCollectionExtensions类中,修改注入方法。

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

奈斯,我们使用Redis实现缓存已经全部完成,现在开始我们在网关配置信息增加缓存来测试下,看缓存是否生效,并查看是否存储在Redis里。

为了验证缓存是否生效,修改测试服务api/values/{id}代码,增加服务器时间输出。

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

增加新的测试路由脚本,然后增加缓存策略,缓存60秒,缓存分类test_ahphocelot

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

现在我们测试访问网关地址http://localhost:7777/api/values/1,过几十秒后继续访问,结果如下。
【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

可以看出来,缓存已经生效,1分钟内请求都不会路由到服务端,再查询下redis缓存数据,发现缓存信息已经存在,然后使用Redis Desktop Manager查看Redis缓存信息是否存在,奈斯,已经存在,说明已经达到我们预期目的。

三、解决网关集群配置信息变更问题

前面几篇已经介绍了网关的数据库存储,并介绍了网关的2种更新方式,但是如果网关集群部署时,采用接口更新方式,无法直接更新所有集群端配置数据,那如何实现集群配置信息一致呢?前面介绍了redis缓存,可以解决当前遇到的问题,我们需要重写内部配置文件提取仓储类,使用redis存储。

我们首先使用redis实现IInternalConfigurationRepository接口,每次请求配置信息时直接从redis存储,避免单机缓存出现数据无法更新的情况。RedisInternalConfigurationRepository代码如下。

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

redis实现后,然后在ServiceCollectionExtensions里增加接口实现注入。

builder.Services.AddSingleton<IInternalConfigurationRepository, RedisInternalConfigurationRepository>();

然后启动网关测试,可以发现网关配置信息已经使用redis缓存了,可以解决集群部署后无法同步更新问题。

四、如何清除缓存记录

实际项目使用过程中,可能会遇到需要立即清除缓存数据,那如何实现从网关清除缓存数据呢?在上篇中我们介绍了接口更新网关配置的说明,缓存的更新也是使用接口的方式进行删除,详细代码如下。

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

我们可以先拉去授权,获取授权方式请参考上一篇,然后使用HTTP DELETE方式,请求删除地址,比如删除前面的测试缓存接口,可以请求http://localhost:7777/CtrOcelot/outputcache/test_ahphocelot地址进行删除,可以使用PostMan进行测试,测试结果如下。
【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

执行成功后可以删除指定的缓存记录,且立即生效,完美的解决了我们问题。

五、总结及预告

本篇介绍了使用redis缓存来重写网关的所有缓存模块,并把网关配置信息也存储到redis里,来解决集群部署的问题,如果想清理缓存数据,通过网关指定的授权接口即可完成,完全具备了网关的缓存的相关模块的需求。


未经允许不得转载:996ICU » .NET Core-统一认证平台之自定义缓存Redis(5)

赞 (0) 打赏