rClientRateLimitCounterRegion = "CacheCzarClientRateLimitCounter";
}
}
现在只需要修改缓存的region
为定义的值即可,唯一需要改动的代码就是把之前写死的代码改成如下代码即可。
var enablePrefix = CzarCacheRegion.AuthenticationRegion;
3.开发缓存变更接口
现在整个二级缓存基本完成,但是还遇到一个问题就是外部如何根据数据库变更数据时来修改缓存数据,这时就需要提供外部修改api
来实现。
添加CzarCacheController.cs
对外部提供缓存更新相关接口,详细代码如下:
using Czar.Gateway.Authentication;
using Czar.Gateway.Configuration;
using Czar.Gateway.RateLimit;
using Czar.Gateway.Rpc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using Ocelot.Configuration;
using Ocelot.Configuration.Creator;
using Ocelot.Configuration.Repository;
using System;
using System.Threading.Tasks;
namespace Czar.Gateway.Cache
{
/// <summary>
/// 提供外部缓存处理接口
/// </summary>
[Authorize]
[Route("CzarCache")]
public class CzarCacheController : Controller
{
private readonly CzarOcelotConfiguration _options;
private readonly IClientAuthenticationRepository _clientAuthenticationRepository;
private IFileConfigurationRepository _fileConfigurationRepository;
private IInternalConfigurationCreator _internalConfigurationCreator;
private readonly IClientRateLimitRepository _clientRateLimitRepository;
private readonly IRpcRepository _rpcRepository;
private readonly IMemoryCache _cache;
public CzarCacheController(IClientAuthenticationRepository clientAuthenticationRepository, CzarOcelotConfiguration options,
IFileConfigurationRepository fileConfigurationRepository,
IInternalConfigurationCreator internalConfigurationCreator,
IClientRateLimitRepository clientRateLimitRepository,
IRpcRepository rpcRepository,
IMemoryCache cache)
{
_clientAuthenticationRepository = clientAuthenticationRepository;
_options = options;
_fileConfigurationRepository = fileConfigurationRepository;
_internalConfigurationCreator = internalConfigurationCreator;
_clientRateLimitRepository = clientRateLimitRepository;
_rpcRepository = rpcRepository;
_cache = cache;
}
/// <summary>
/// 更新客户端地址访问授权接口
/// </summary>
/// <param name="clientid">客户端ID</param>
/// <param name="path">请求模板</param>
/// <returns></returns>
[HttpPost]
[Route("ClientRule")]
public async Task UpdateClientRuleCache(string clientid, string path)
{
var region = CzarCacheRegion.AuthenticationRegion;
var key = CzarOcelotHelper.ComputeCounterKey(region, clientid, "", path);
key = CzarOcelotHelper.GetKey(_options.RedisOcelotKeyPrefix, region, key);
var result = await _clientAuthenticationRepository.ClientAuthenticationAsync(clientid, path);
var data = new ClientRoleModel() { CacheTime = DateTime.Now, Role = result };
if (_options.ClusterEnvironment)
{
RedisHelper.Set(key, data); //加入redis缓存
RedisHelper.Publish(key, data.ToJson()); //发布事件
}
else
{
_cache.Remove(key);
}
}
/// <summary>
/// 更新网关配置路由信息
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("InternalConfiguration")]
public async Task UpdateInternalConfigurationCache()
{
var key = CzarCacheRegion.InternalConfigurationRegion;
key = CzarOcelotHelper.GetKey(_op