Time.Now, Role = result };
if (_options.ClusterEnvironment)
{
RedisHelper.Set(key, data); //加入redis缓存
RedisHelper.Publish(key, data.ToJson()); //发布事件
}
else
{
_cache.Remove(key);
}
}
[HttpPost]
[Route("Rpc")]
public async Task UpdateRpcCache(string UpUrl)
{
var region = CzarCacheRegion.RemoteInvokeMessageRegion;
var key = UpUrl;
key = CzarOcelotHelper.GetKey(_options.RedisOcelotKeyPrefix, region, key);
var result = await _rpcRepository.GetRemoteMethodAsync(UpUrl);
if (_options.ClusterEnvironment)
{
RedisHelper.Set(key, result); //加入redis缓存
RedisHelper.Publish(key, result.ToJson()); //发布事件
}
else
{
_cache.Remove(key);
}
}
}
}
现在基本实现整个缓存的更新策略,只要配合后台管理界面,在相关缓存原始数据发送变更时,调用对应接口即可完成redis
缓存的更新,并自动通知集群的所有本机清理缓存等待重新获取。
接口的调用方式参考之前我写的配置信息接口变更那篇即可。
四、性能测试
完成了改造后,我们拿改造前网关、改造后网关、原始Ocelot、直接调用API四个环境分别测试性能指标,由于测试环境有效,我直接使用本机环境,然后是Apache ab测试工具
测试下相关性能(本测试不一定准确,只作为参考指标),测试的方式是使用100个并发请求10000次,测试结果分别如下。
1、改造前网关性能
2、改造后网关性能
3、Ocelot默认网关性能
4、直接调用API性能
本测试仅供参考,因为由于网关和服务端都在本机环境部署,所以使用网关和不使用网关性能差别非常小,如果分开部署可能性别差别会明显写,这不是本篇讨论的重点。
从测试中可以看到,重构的网关改造前和改造后性能有2倍多的提升,且与原生的Ocelot性能非常接近。
五、总结
本篇主要讲解了如何使用redis
的发布订阅来实现二级缓存功能,并提供了缓存的更新相关接口供外部程序调用,避免出现集群环境下无法更新缓存数据导致提取数据不一致情况,但是针对每个客户端独立限流这块集群环境目前还是采用的redis
的方式未使用本地缓存,如果有写的不对或有更好方式的,也希望多提宝贵意见。
本篇相关源码地址:https://github.com/jinyancao/czar.gateway