日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能

發(fā)布時間:2023/12/4 asp.net 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先說聲抱歉,可能是因?yàn)榧倨诰C合癥(其實(shí)就是因?yàn)閼泄?#xff09;的原因,已經(jīng)很長時間沒更新博客了,現(xiàn)在也調(diào)整的差不多了,準(zhǔn)備還是以每周1-2篇的進(jìn)度來更新博客,并完成本項(xiàng)目所有功能。


言歸正傳,本重構(gòu)項(xiàng)目是在我根據(jù)實(shí)際需求重構(gòu),由于還未完全寫完,所以也沒進(jìn)行壓測,在2月份時,張善友老師給我留言說經(jīng)過壓測發(fā)現(xiàn)我重構(gòu)的Ocelot網(wǎng)關(guān)功能性能較差,其中根本原因就是緩存模塊,由于重構(gòu)項(xiàng)目的緩存強(qiáng)依賴Redis緩存,造成性能瓶頸,發(fā)現(xiàn)問題后,我也第一時間進(jìn)行測試,性能影響很大,經(jīng)過跟張老師請教,可以使用二級緩存來解決性能問題,首先感謝張老師關(guān)注并指點(diǎn)迷津,于是就有了這篇文章,如何把現(xiàn)有緩存改成二級緩存并使用。

為了解決redis的強(qiáng)依賴性,首先需要把緩存數(shù)據(jù)存儲到本地,所有請求都優(yōu)先從本地提取,如果提取不到再從redis提取,如果redis無數(shù)據(jù),在從數(shù)據(jù)庫中提取。提取流程如下:

MemoryCache > Redis > db


此種方式減少提取緩存的網(wǎng)絡(luò)開銷,也合理利用了分布式緩存,并最終減少數(shù)據(jù)庫的訪問開銷。但是使用此種方案也面臨了一個問題是如何保證集群環(huán)境時每個機(jī)器本地緩存數(shù)據(jù)的一致性,這時我們會想到redis的發(fā)布、訂閱特性,在數(shù)據(jù)發(fā)生變動時更新redis數(shù)據(jù)并發(fā)布緩存更新通知,由每個集群機(jī)器訂閱變更事件,然后處理本地緩存記錄,最終達(dá)到集群緩存的緩存一致性。

但是此方式對于緩存變更非常頻繁的業(yè)務(wù)不適用,比如限流策略(準(zhǔn)備還是使用分布式redis緩存實(shí)現(xiàn)),但是可以擴(kuò)展配置單機(jī)限流時使用本地緩存實(shí)現(xiàn),如果誰有更好的實(shí)現(xiàn)方式,也麻煩告知下集群環(huán)境下限流的實(shí)現(xiàn),不勝感激。


改造代碼

首先需要分析下目前改造后的Ocelot網(wǎng)關(guān)在哪些業(yè)務(wù)中使用的緩存,然后把使用本地緩存的的業(yè)務(wù)重構(gòu),增加提取數(shù)據(jù)流程,最后提供網(wǎng)關(guān)外部緩存初始化接口,便于與業(yè)務(wù)系統(tǒng)進(jìn)行集成。

1

重寫緩存方法


找到問題的原因后,就可以重寫緩存方法,增加二級緩存支持,默認(rèn)使用本地的緩存,新建CzarMemoryCache類,來實(shí)現(xiàn)IOcelotCache<T>方法,實(shí)現(xiàn)代碼如下。


?

using Czar.Gateway.Configuration;using Czar.Gateway.RateLimit;using Microsoft.Extensions.Caching.Memory;using Ocelot.Cache;using System;namespace Czar.Gateway.Cache { ? ?/// <summary> ? ?/// 金焰的世界 ? ?/// 2019-03-03 ? ?/// 使用二級緩存解決集群環(huán)境問題 ? ?/// </summary> ? ?public class CzarMemoryCache<T> : IOcelotCache<T> ? ?{ ? ? ? ?private readonly CzarOcelotConfiguration _options; ? ? ? ?private readonly IMemoryCache _cache; ? ? ? ?public CzarMemoryCache(CzarOcelotConfiguration options,IMemoryCache cache) ? ? ? ?{ ? ? ? ? ? ?_options = options; ? ? ? ? ? ?_cache = cache; ? ? ? ?} ? ? ? ?public void Add(string key, T value, TimeSpan ttl, string region) ? ? ? ?{ ? ? ? ? ? ?key = CzarOcelotHelper.GetKey(_options.RedisOcelotKeyPrefix,region, key); ? ? ? ? ? ?if (_options.ClusterEnvironment) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?var msg = value.ToJson(); ? ? ? ? ? ? ? ?if (typeof(T) == typeof(CachedResponse)) ? ? ? ? ? ? ? ?{//帶過期時間的緩存 ? ? ? ? ? ? ? ? ? ?_cache.Set(key, value, ttl); //添加本地緩存 ? ? ? ? ? ? ? ? ? ?RedisHelper.Set(key, msg); //加入redis緩存 ? ? ? ? ? ? ? ? ? ?RedisHelper.Publish(key, msg); //發(fā)布 ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ?else if (typeof(T) == typeof(CzarClientRateLimitCounter?)) ? ? ? ? ? ? ? ?{//限流緩存,直接使用redis ? ? ? ? ? ? ? ? ? ?RedisHelper.Set(key, value, (int)ttl.TotalSeconds); ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ?else ? ? ? ? ? ? ? ?{//正常緩存,發(fā)布 ? ? ? ? ? ? ? ? ? ?_cache.Set(key, value, ttl); //添加本地緩存 ? ? ? ? ? ? ? ? ? ?RedisHelper.Set(key, msg); //加入redis緩存 ? ? ? ? ? ? ? ? ? ?RedisHelper.Publish(key, msg); //發(fā)布 ? ? ? ? ? ? ? ?} ? ? ? ? ? ?} ? ? ? ? ? ?else ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?_cache.Set(key, value, ttl); //添加本地緩存 ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?public void AddAndDelete(string key, T value, TimeSpan ttl, string region) ? ? ? ?{ ? ? ? ? ? ?Add(key, value, ttl, region); ? ? ? ?} ? ? ? ?public void ClearRegion(string region) ? ? ? ?{ ? ? ? ? ? ?if (_options.ClusterEnvironment) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?var keys = RedisHelper.Keys(region + "*"); ? ? ? ? ? ? ? ?RedisHelper.Del(keys); ? ? ? ? ? ? ? ?foreach (var key in keys) ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ?RedisHelper.Publish(key, ""); //發(fā)布key值為空,處理時刪除即可。 ? ? ? ? ? ? ? ?} ? ? ? ? ? ?} ? ? ? ? ? ?else ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?_cache.Remove(region); ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?public T Get(string key, string region) ? ? ? ?{ ? ? ? ? ? ?key = CzarOcelotHelper.GetKey(_options.RedisOcelotKeyPrefix, region, key); ? ? ? ? ? ?if(region== CzarCacheRegion.CzarClientRateLimitCounterRegion&& _options.ClusterEnvironment) ? ? ? ? ? ?{//限流且開啟了集群支持,默認(rèn)從redis取 ? ? ? ? ? ? ? ?return RedisHelper.Get<T>(key); ? ? ? ? ? ?} ? ? ? ? ? ?var result = _cache.Get<T>(key); ? ? ? ? ? ?if (result == null&& _options.ClusterEnvironment) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?result= RedisHelper.Get<T>(key); ? ? ? ? ? ? ? ?if (result != null) ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ?if (typeof(T) == typeof(CachedResponse)) ? ? ? ? ? ? ? ? ? ?{//查看redis過期時間 ? ? ? ? ? ? ? ? ? ? ? ?var second = RedisHelper.Ttl(key); ? ? ? ? ? ? ? ? ? ? ? ?if (second > 0) ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ?_cache.Set(key, result, TimeSpan.FromSeconds(second)); ? ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ?else ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ?_cache.Set(key, result, TimeSpan.FromSeconds(_options.CzarCacheTime)); ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ?} ? ? ? ? ? ?} ? ? ? ? ? ?return result; ? ? ? ?} ? ?} }

?

上面就段代碼實(shí)現(xiàn)了本地緩存和Redis緩存的支持,優(yōu)先從本地提取,如果在集群環(huán)境使用,增加redis緩存支持,但是此種方式不適用緩存變更非常頻繁場景,比如客戶端限流的實(shí)現(xiàn),所以在代碼中把客戶端限流的緩存直接使用redis緩存實(shí)現(xiàn)。

2

注入實(shí)現(xiàn)和訂閱

有了實(shí)現(xiàn)代碼后,發(fā)現(xiàn)還缺少添加緩存注入和配置信息修改。首先需要修改配置文件來滿足是否開啟集群判斷,然后需要實(shí)現(xiàn)redis的不同部署方式能夠通過配置文件配置進(jìn)行管理,避免硬編碼導(dǎo)致的不可用問題。

配置文件CzarOcelotConfiguration.cs修改代碼如下:

namespace Czar.Gateway.Configuration{ ? ?/// <summary> ? ?/// 金焰的世界 ? ?/// 2018-11-11 ? ?/// 自定義配置信息 ? ?/// </summary> ? ?public class CzarOcelotConfiguration ? ?{ ? ? ? ?/// <summary> ? ? ? ?/// 數(shù)據(jù)庫連接字符串,使用不同數(shù)據(jù)庫時自行修改,默認(rèn)實(shí)現(xiàn)了SQLSERVER ? ? ? ?/// </summary> ? ? ? ?public string DbConnectionStrings { get; set; } ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2018-11-12 ? ? ? ?/// 是否啟用定時器,默認(rèn)不啟動 ? ? ? ?/// </summary> ? ? ? ?public bool EnableTimer { get; set; } = false; ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2018-11.12 ? ? ? ?/// 定時器周期,單位(毫秒),默認(rèn)30分總自動更新一次 ? ? ? ?/// </summary> ? ? ? ?public int TimerDelay { get; set; } = 30 * 60 * 1000; ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2018-11-14 ? ? ? ?/// Redis連接字符串 ? ? ? ?/// </summary> ? ? ? ?public string RedisConnectionString { get; set; } ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2019-03-03 ? ? ? ?/// 配置哨兵或分區(qū)時使用 ? ? ? ?/// </summary> ? ? ? ?public string[] RedisSentinelOrPartitionConStr { get; set; } ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2019-03-03 ? ? ? ?/// Redis部署方式,默認(rèn)使用普通方式 ? ? ? ?/// </summary> ? ? ? ?public RedisStoreMode RedisStoreMode { get; set; } = RedisStoreMode.Normal; ? ? ? ?/// <summary> ? ? ? ?/// 金焰的計(jì)界 ? ? ? ?/// 2019-03-03 ? ? ? ?/// 做集群緩存同步時使用,會訂閱所有正則匹配的事件 ? ? ? ?/// </summary> ? ? ? ?public string RedisOcelotKeyPrefix { get; set; } = "CzarOcelot"; ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2019-03-03 ? ? ? ?/// 是否啟用集群環(huán)境,如果非集群環(huán)境直接本地緩存+數(shù)據(jù)庫即可 ? ? ? ?/// </summary> ? ? ? ?public bool ClusterEnvironment { get; set; } = false; ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2018-11-15 ? ? ? ?/// 是否啟用客戶端授權(quán),默認(rèn)不開啟 ? ? ? ?/// </summary> ? ? ? ?public bool ClientAuthorization { get; set; } = false; ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2018-11-15 ? ? ? ?/// 服務(wù)器緩存時間,默認(rèn)30分鐘 ? ? ? ?/// </summary> ? ? ? ?public int CzarCacheTime { get; set; } = 1800; ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2018-11-15 ? ? ? ?/// 客戶端標(biāo)識,默認(rèn) client_id ? ? ? ?/// </summary> ? ? ? ?public string ClientKey { get; set; } = "client_id"; ? ? ? ?/// <summary> ? ? ? ?/// 金焰的世界 ? ? ? ?/// 2018-11-18 ? ? ? ?/// 是否開啟自定義限流,默認(rèn)不開啟 ? ? ? ?/// </summary> ? ? ? ?public bool ClientRateLimit { get; set; } = false; ? ?} }

在配置文件中修改了redis相關(guān)配置,支持使用redis的普通模式、集群模式、哨兵模式、分區(qū)模式,配置方式可參考csrediscore開源項(xiàng)目。

然后修改ServiceCollectionExtensions.cs代碼,注入相關(guān)實(shí)現(xiàn)和redis客戶端。

builder.Services.AddMemoryCache(); //添加本地緩存
#region 啟動Redis緩存,并支持普通模式 官方集群模式 哨兵模式 分區(qū)模式
if (options.ClusterEnvironment)
{
//默認(rèn)使用普通模式
var csredis = new CSRedis.CSRedisClient(options.RedisConnectionString);
switch (options.RedisStoreMode)
{
case RedisStoreMode.Partition:
var NodesIndex = options.RedisSentinelOrPartitionConStr;
Func<string, string> nodeRule = null;
csredis = new CSRedis.CSRedisClient(nodeRule, options.RedisSentinelOrPartitionConStr);
break;
case RedisStoreMode.Sentinel:
csredis = new CSRedis.CSRedisClient(options.RedisConnectionString, options.RedisSentinelOrPartitionConStr);
break;
}
//初始化 RedisHelper
RedisHelper.Initialization(csredis);
}
#endregion
builder.Services.AddSingleton<IOcelotCache<FileConfiguration>, CzarMemoryCache<FileConfiguration>>();
builder.Services.AddSingleton<IOcelotCache<InternalConfiguration>, CzarMemoryCache<InternalConfiguration>>();
builder.Services.AddSingleton<IOcelotCache<CachedResponse>, CzarMemoryCache<CachedResponse>>();
builder.Services.AddSingleton<IInternalConfigurationRepository, RedisInternalConfigurationRepository>();
builder.Services.AddSingleton<IOcelotCache<ClientRoleModel>, CzarMemoryCache<ClientRoleModel>>();
builder.Services.AddSingleton<IOcelotCache<RateLimitRuleModel>, CzarMemoryCache<RateLimitRuleModel>>();
builder.Services.AddSingleton<IOcelotCache<RemoteInvokeMessage>, CzarMemoryCache<RemoteInvokeMessage>>();
builder.Services.AddSingleton<IOcelotCache<CzarClientRateLimitCounter?>, CzarMemoryCache<CzarClientRateLimitCounter?>>();

現(xiàn)在需要實(shí)現(xiàn)redis訂閱來更新本地的緩存信息,在項(xiàng)目啟動時判斷是否開啟集群模式,如果開啟就啟動訂閱,實(shí)現(xiàn)代碼如下:

public static async Task<IApplicationBuilder> UseCzarOcelot(this IApplicationBuilder builder, OcelotPipelineConfiguration pipelineConfiguration)
{
//重寫創(chuàng)建配置方法
var configuration = await CreateConfiguration(builder);
ConfigureDiagnosticListener(builder);
CacheChangeListener(builder);
return CreateOcelotPipeline(builder, pipelineConfiguration);
}
/// <summary>
/// 金焰的世界
/// 2019-03-03
/// 添加緩存數(shù)據(jù)變更訂閱
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
private static void CacheChangeListener(IApplicationBuilder builder)
{
var config= builder.ApplicationServices.GetService<CzarOcelotConfiguration>();
var _cache= builder.ApplicationServices.GetService<IMemoryCache>();
if (config.ClusterEnvironment)
{
//訂閱滿足條件的所有事件
RedisHelper.PSubscribe(new[] { config.RedisOcelotKeyPrefix + "*" }, message =>
{
var key = message.Channel;
_cache.Remove(key); //直接移除,如果有請求從redis里取
//或者直接判斷本地緩存是否存在,如果存在更新,可自行實(shí)現(xiàn)。
});
}
}



使用的是從配置文件提取的正則匹配的所有KEY都進(jìn)行訂閱,由于本地緩存增加了定時過期策略,所以為了實(shí)現(xiàn)方便,當(dāng)發(fā)現(xiàn)redis數(shù)據(jù)發(fā)生變化,所有訂閱端直接移除本地緩存即可,如果有新的請求直接從redis取,然后再次緩存,防止集群客戶端緩存信息不一致。

為了區(qū)分不同的緩存實(shí)體,便于在原始數(shù)據(jù)發(fā)送變更時進(jìn)行更新,定義CzarCacheRegion類。

namespace Czar.Gateway.Configuration{ ? ?/// <summary> ? ?/// 緩存所屬區(qū)域 ? ?/// </summary> ? ?public class CzarCacheRegion ? ?{ ? ? ? ?/// <summary> ? ? ? ?/// 授權(quán) ? ? ? ?/// </summary> ? ? ? ?public const string AuthenticationRegion = "CacheClientAuthentication"; ? ? ? ?/// <summary> ? ? ? ?/// 路由配置 ? ? ? ?/// </summary> ? ? ? ?public const string FileConfigurationRegion = "CacheFileConfiguration"; ? ? ? ?/// <summary> ? ? ? ?/// 內(nèi)部配置 ? ? ? ?/// </summary> ? ? ? ?public const string InternalConfigurationRegion = "CacheInternalConfiguration"; ? ? ? ?/// <summary> ? ? ? ?/// 客戶端權(quán)限 ? ? ? ?/// </summary> ? ? ? ?public const string ClientRoleModelRegion = "CacheClientRoleModel"; ? ? ? ?/// <summary> ? ? ? ?/// 限流規(guī)則 ? ? ? ?/// </summary> ? ? ? ?public const string RateLimitRuleModelRegion = "CacheRateLimitRuleModel"; ? ? ? ?/// <summary> ? ? ? ?/// Rpc遠(yuǎn)程調(diào)用 ? ? ? ?/// </summary> ? ? ? ?public const string RemoteInvokeMessageRegion = "CacheRemoteInvokeMessage"; ? ? ? ?/// <summary> ? ? ? ?/// 客戶端限流 ? ? ? ?/// </summary> ? ? ? ?public const string CzarClientRateLimitCounterRegion = "CacheCzarClientRateLimitCounter"; ? ?} }





現(xiàn)在只需要修改緩存的region為定義的值即可,唯一需要改動的代碼就是把之前寫死的代碼改成如下代碼即可。

var enablePrefix = CzarCacheRegion.AuthenticationRegion;

3

開發(fā)緩存變更接口


現(xiàn)在整個二級緩存基本完成,但是還遇到一個問題就是外部如何根據(jù)數(shù)據(jù)庫變更數(shù)據(jù)時來修改緩存數(shù)據(jù),這時就需要提供外部修改api來實(shí)現(xiàn)。

添加CzarCacheController.cs對外部提供緩存更新相關(guān)接口,詳細(xì)代碼如下:

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> ? ? ? ?/// 更新客戶端地址訪問授權(quán)接口 ? ? ? ?/// </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()); //發(fā)布事件 ? ? ? ? ? ?} ? ? ? ? ? ?else ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?_cache.Remove(key); ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?/// <summary> ? ? ? ?/// 更新網(wǎng)關(guān)配置路由信息 ? ? ? ?/// </summary> ? ? ? ?/// <returns></returns> ? ? ? ?[HttpPost] ? ? ? ?[Route("InternalConfiguration")] ? ? ? ?public async Task UpdateInternalConfigurationCache() ? ? ? ?{ ? ? ? ? ? ?var key = CzarCacheRegion.InternalConfigurationRegion; ? ? ? ? ? ?key = CzarOcelotHelper.GetKey(_options.RedisOcelotKeyPrefix, "", key); ? ? ? ? ? ?var fileconfig = await _fileConfigurationRepository.Get(); ? ? ? ? ? ?var internalConfig = await _internalConfigurationCreator.Create(fileconfig.Data); ? ? ? ? ? ?var config = (InternalConfiguration)internalConfig.Data; ? ? ? ? ? ?if (_options.ClusterEnvironment) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?RedisHelper.Set(key, config); //加入redis緩存 ? ? ? ? ? ? ? ?RedisHelper.Publish(key, config.ToJson()); //發(fā)布事件 ? ? ? ? ? ?} ? ? ? ? ? ?else ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?_cache.Remove(key); ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?/// <summary> ? ? ? ?/// 刪除路由配合的緩存信息 ? ? ? ?/// </summary> ? ? ? ?/// <param name="region">區(qū)域</param> ? ? ? ?/// <param name="downurl">下端路由</param> ? ? ? ?/// <returns></returns> ? ? ? ?[HttpPost] ? ? ? ?[Route("Response")] ? ? ? ?public async Task DeleteResponseCache(string region,string downurl) ? ? ? ?{ ? ? ? ? ? ?var key = CzarOcelotHelper.GetKey(_options.RedisOcelotKeyPrefix, region, downurl); ? ? ? ? ? ?if (_options.ClusterEnvironment) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?await RedisHelper.DelAsync(key); ? ? ? ? ? ? ? ?RedisHelper.Publish(key, "");//發(fā)布時間 ? ? ? ? ? ?} ? ? ? ? ? ?else ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?_cache.Remove(key); ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?/// <summary> ? ? ? ?/// 更新客戶端限流規(guī)則緩存 ? ? ? ?/// </summary> ? ? ? ?/// <param name="clientid">客戶端ID</param> ? ? ? ?/// <param name="path">路由模板</param> ? ? ? ?/// <returns></returns> ? ? ? ?[HttpPost] ? ? ? ?[Route("RateLimitRule")] ? ? ? ?public async Task UpdateRateLimitRuleCache(string clientid, string path) ? ? ? ?{ ? ? ? ? ? ?var region = CzarCacheRegion.RateLimitRuleModelRegion; ? ? ? ? ? ?var key = clientid + path; ? ? ? ? ? ?key = CzarOcelotHelper.GetKey(_options.RedisOcelotKeyPrefix, region, key); ? ? ? ? ? ?var result = await _clientRateLimitRepository.CheckClientRateLimitAsync(clientid, path); ? ? ? ? ? ?var data = new RateLimitRuleModel() { RateLimit = result.RateLimit, rateLimitOptions = result.rateLimitOptions }; ? ? ? ? ? ?if (_options.ClusterEnvironment) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?RedisHelper.Set(key, data); //加入redis緩存 ? ? ? ? ? ? ? ?RedisHelper.Publish(key, data.ToJson()); //發(fā)布事件 ? ? ? ? ? ?} ? ? ? ? ? ?else ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?_cache.Remove(key); ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?/// <summary> ? ? ? ?/// 更新客戶端是否開啟限流緩存 ? ? ? ?/// </summary> ? ? ? ?/// <param name="path"></param> ? ? ? ?/// <returns></returns> ? ? ? ?[HttpPost] ? ? ? ?[Route("ClientRole")] ? ? ? ?public async Task UpdateClientRoleCache(string path) ? ? ? ?{ ? ? ? ? ? ?var region = CzarCacheRegion.ClientRoleModelRegion; ? ? ? ? ? ?var key = path; ? ? ? ? ? ?key = CzarOcelotHelper.GetKey(_options.RedisOcelotKeyPrefix, region, key); ? ? ? ? ? ?var result = await _clientRateLimitRepository.CheckReRouteRuleAsync(path); ? ? ? ? ? ?var data = new ClientRoleModel() { CacheTime = DateTime.Now, Role = result }; ? ? ? ? ? ?if (_options.ClusterEnvironment) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?RedisHelper.Set(key, data); //加入redis緩存 ? ? ? ? ? ? ? ?RedisHelper.Publish(key, data.ToJson()); //發(fā)布事件 ? ? ? ? ? ?} ? ? ? ? ? ?else ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?_cache.Remove(key); ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?/// <summary> ? ? ? ?/// 更新呢客戶端路由白名單緩存 ? ? ? ?/// </summary> ? ? ? ?/// <param name="clientid"></param> ? ? ? ?/// <param name="path"></param> ? ? ? ?/// <returns></returns> ? ? ? ?[HttpPost] ? ? ? ?[Route("ClientReRouteWhiteList")] ? ? ? ?public async Task UpdateClientReRouteWhiteListCache(string clientid, string path) ? ? ? ?{ ? ? ? ? ? ?var region = CzarCacheRegion.ClientReRouteWhiteListRegion; ? ? ? ? ? ?var key = clientid + path; ? ? ? ? ? ?key = CzarOcelotHelper.GetKey(_options.RedisOcelotKeyPrefix, region, key); ? ? ? ? ? ?var result = await _clientRateLimitRepository.CheckClientReRouteWhiteListAsync(clientid, path); ? ? ? ? ? ?var data = new ClientRoleModel() { CacheTime = DateTime.Now, Role = result }; ? ? ? ? ? ?if (_options.ClusterEnvironment) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?RedisHelper.Set(key, data); //加入redis緩存 ? ? ? ? ? ? ? ?RedisHelper.Publish(key, data.ToJson()); //發(fā)布事件 ? ? ? ? ? ?} ? ? ? ? ? ?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()); //發(fā)布事件 ? ? ? ? ? ?} ? ? ? ? ? ?else ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?_cache.Remove(key); ? ? ? ? ? ?} ? ? ? ?} ? ?} }



現(xiàn)在基本實(shí)現(xiàn)整個緩存的更新策略,只要配合后臺管理界面,在相關(guān)緩存原始數(shù)據(jù)發(fā)送變更時,調(diào)用對應(yīng)接口即可完成redis緩存的更新,并自動通知集群的所有本機(jī)清理緩存等待重新獲取。

接口的調(diào)用方式參考之前我寫的配置信息接口變更那篇即可。



性能測試

完成了改造后,我們拿改造前網(wǎng)關(guān)、改造后網(wǎng)關(guān)、原始Ocelot、直接調(diào)用API四個環(huán)境分別測試性能指標(biāo),由于測試環(huán)境有效,我直接使用本機(jī)環(huán)境,然后是Apache ab測試工具測試下相關(guān)性能(本測試不一定準(zhǔn)確,只作為參考指標(biāo)),測試的方式是使用100個并發(fā)請求10000次,測試結(jié)果分別如下。

改造網(wǎng)關(guān)性能測試





改造后網(wǎng)關(guān)測試



Ocelot默認(rèn)網(wǎng)關(guān)性能


直接調(diào)用API性能


本測試僅供參考,因?yàn)橛捎诰W(wǎng)關(guān)和服務(wù)端都在本機(jī)環(huán)境部署,所以使用網(wǎng)關(guān)和不使用網(wǎng)關(guān)性能差別非常小,如果分開部署可能性別差別會明顯寫,這不是本篇討論的重點(diǎn)。

從測試中可以看到,重構(gòu)的網(wǎng)關(guān)改造前和改造后性能有2倍多的提升,且與原生的Ocelot性能非常接近。

最后



本篇主要講解了如何使用redis的發(fā)布訂閱來實(shí)現(xiàn)二級緩存功能,并提供了緩存的更新相關(guān)接口供外部程序調(diào)用,避免出現(xiàn)集群環(huán)境下無法更新緩存數(shù)據(jù)導(dǎo)致提取數(shù)據(jù)不一致情況,但是針對每個客戶端獨(dú)立限流這塊集群環(huán)境目前還是采用的redis的方式未使用本地緩存,如果有寫的不對或有更好方式的,也希望多提寶貴意見。

。



總結(jié)

以上是生活随笔為你收集整理的【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

av性网站| 久久爽久久爽久久av东京爽 | 国内精品亚洲 | 婷婷丁香激情五月 | 亚州av免费| 日韩色在线 | 欧美视频日韩视频 | 97人人模人人爽人人喊中文字 | www婷婷 | 久久99九九99精品 | 日韩在线观看 | 欧美国产在线看 | 亚洲精品国产视频 | 精品一二三四视频 | www.香蕉 | av高清网站在线观看 | 国产精品地址 | 免费观看xxxx9999片 | 99精品影视 | 午夜免费福利视频 | 国产99亚洲 | 欧美91成人网 | 深爱五月激情网 | 色婷婷激情四射 | 亚洲国产精品99久久久久久久久 | 久久久久欧美精品999 | 99精品视频播放 | 久久久国产一区二区 | 精品96久久久久久中文字幕无 | 亚洲精品久久久久中文字幕二区 | 中文字幕亚洲五码 | 91高清在线看 | 国产精品一区二区久久久 | 日本黄色黄网站 | 夜夜摸夜夜爽 | 天堂av网站 | 久久午夜国产精品 | 久久视频在线视频 | 久草在线免费在线观看 | 天天天在线综合网 | 97成人精品视频在线播放 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 免费在线一区二区三区 | 精品一二三区视频 | 亚洲成av人影院 | 99欧美精品| 色综合天天综合 | 亚洲aⅴ一区二区三区 | 日韩最新在线视频 | 免费看片成人 | 蜜臀av网站| 欧美日韩高清一区二区 国产亚洲免费看 | 亚洲aⅴ乱码精品成人区 | av一二三区| 精品国产欧美一区二区 | 成年人免费av网站 | 国产精品视频地址 | 波多野结衣视频一区 | 亚洲精品在线观看av | 91探花系列在线播放 | 国产三级久久久 | 伊人久久国产 | 国产一级视屏 | 国产精品一二三 | 91香蕉久久| 一级片免费在线 | 亚洲成aⅴ人在线观看 | 中文字幕免费一区二区 | 一本一本久久a久久精品综合小说 | 黄色www | 欧美日韩精品在线观看视频 | 免费欧美精品 | 国产盗摄精品一区二区 | 欧美在线99 | 日日夜夜综合 | 国产xxxx| 久久亚洲福利 | 久久女同性恋中文字幕 | 欧美日韩p片 | 99国产精品久久久久久久久久 | 亚洲午夜av久久乱码 | 午夜精品久久久久久久久久久久 | 国产三级精品在线 | 国产精品一区二区免费视频 | 欧美俄罗斯性视频 | 成人羞羞视频在线观看免费 | 欧美在线日韩在线 | 超碰在线日韩 | 亚洲精品av中文字幕在线在线 | 五月天激情综合 | 日韩videos高潮hd | 久久深夜福利免费观看 | 免费观看特级毛片 | 人人草人 | 激情五月婷婷激情 | 日韩欧美一区二区在线播放 | 一区二区视频网站 | 国内丰满少妇猛烈精品播 | 免费av黄色 | 最近中文字幕国语免费高清6 | av在线com| 丝袜美腿在线 | 午夜美女福利 | 中文亚洲欧美日韩 | 狠狠色丁香久久婷婷综合_中 | 欧美精品久久久久久久久久 | av日韩av| 国产精品成人av在线 | 久久艹在线观看 | 日韩免费av在线 | 欧美特一级片 | 69亚洲视频 | 国产69精品久久99不卡的观看体验 | 天天艹天天操 | 成人免费观看在线视频 | 99久久久久成人国产免费 | 久久久久久在线观看 | 亚洲精品xxx | 一区二区视频在线看 | 欧美精品三级 | 麻豆影视网| 麻花豆传媒一二三产区 | 午夜av免费在线观看 | 亚洲日本一区二区在线 | 国产精品入口66mio女同 | 狠狠干,狠狠操 | 国产剧情在线一区 | 成人在线电影观看 | 五月天综合色激情 | 91视频-88av | 日本少妇久久久 | 国产精品va在线观看入 | 欧美日韩在线观看一区二区 | 亚洲激情 | 成人av电影免费在线观看 | 成人黄色大片网站 | 99精品视频免费全部在线 | 高清av免费观看 | 黄色小说网站在线 | 精品一区二三区 | 91色偷偷 | 久久久久夜色 | 久久不卡免费视频 | 国产视频一区二区在线播放 | 国产一区二区不卡视频 | 亚洲精品tv久久久久久久久久 | 亚洲精品免费在线观看 | 国产精品自拍av | 日韩特级片 | 久久久久久久久久久久国产精品 | 欧美日韩视频免费 | 中文字幕在线影视资源 | 日韩a欧美 | 久久人人干 | 精品99免费| 激情深爱五月 | 欧美日韩国内在线 | 色噜噜在线观看 | 福利一区二区在线 | 亚洲狠狠操 | 正在播放日韩 | 久久久999免费视频 日韩网站在线 | 黄色中文字幕 | 久久亚洲二区 | 中文字幕av全部资源www中文字幕在线观看 | 久草视频在 | 91人人视频在线观看 | 成人午夜精品 | 婷婷中文字幕综合 | 久久成人免费视频 | 97免费公开视频 | 国产精品每日更新 | 粉嫩aⅴ一区二区三区 | 久久免视频 | bbbb操bbbb | 国产一区在线播放 | 国产 在线 日韩 | 色综合久久久久 | 狠狠的日日 | 中文字幕视频观看 | 国内丰满少妇猛烈精品播 | 久久久久国产精品厨房 | 91自拍成人 | 午夜久久久影院 | 激情av在线播放 | 日韩精品91偷拍在线观看 | 日韩精品视频免费专区在线播放 | 久久久久久美女 | 日韩免费视频网站 | 国产精品不卡av | av免费线看 | 日韩一二三区不卡 | 久久免费99 | 欧美专区国产专区 | www.黄色小说.com | 波多野结衣视频一区 | 亚洲黄色免费网站 | 久久国产免费视频 | 美女国产精品 | 天堂av免费观看 | 亚洲一级黄色大片 | 99久久精品免费看国产四区 | 国产精品免费小视频 | 69视频网站 | 四虎在线观看 | 97超碰国产精品女人人人爽 | 五月婷婷中文字幕 | 在线a亚洲视频播放在线观看 | 日韩丝袜 | 国产精品成人自产拍在线观看 | 99热精品免费观看 | 中文字幕亚洲欧美 | 日色在线视频 | 国产免费视频一区二区裸体 | 青青视频一区 | av大片网址 | 国产一级大片免费看 | 天天摸天天舔 | 国产成人av综合色 | 2019精品手机国产品在线 | 天天干天天摸天天操 | 久久99最新地址 | 国产精品一区二区三区99 | 在线中文字幕电影 | 亚洲乱码国产乱码精品天美传媒 | 精品久久久久国产 | av不卡网站 | 97色综合 | av九九| 天天射天天拍 | 蜜臀久久99精品久久久无需会员 | 日韩在线视频观看 | 久草在线视频首页 | 深爱综合网 | 国产精品乱看 | 99久久久国产精品免费观看 | 日韩一级电影在线 | 狠狠色网 | 国产在线理论片 | 国产成人精品一二三区 | 亚洲黄在线观看 | 91少妇精拍在线播放 | 毛片网在线观看 | 热久久免费国产视频 | 国产精品毛片久久久久久久久久99999999 | 亚洲成av人片一区二区梦乃 | 国产福利免费在线观看 | 中文字幕在线专区 | 天天爱天天操天天爽 | 欧美激情在线网站 | 黄色一级大片在线免费看国产一 | 国产精品视频地址 | 999ZYZ玖玖资源站永久 | 免费在线观看av | 久久草在线视频国产 | 亚洲精品男人天堂 | 97超碰超碰久久福利超碰 | 天天拍天天操 | 91粉色视频 | 日韩乱理 | 精品欧美小视频在线观看 | 精品国产人成亚洲区 | 免费成人黄色片 | 国产一区二区在线免费观看 | 国产在线播放一区二区三区 | 欧美日韩a视频 | 中文字幕有码在线 | 国产精品毛片一区二区 | 亚洲日本中文字幕在线观看 | 99久久精品国产免费看不卡 | 中文字幕之中文字幕 | 亚洲永久精品在线 | 国产午夜精品一区二区三区嫩草 | 国产成人精品999在线观看 | 开心色婷婷 | 婷婷色网视频在线播放 | 精品日韩在线 | 精品国产伦一区二区三区观看说明 | 久久久99精品免费观看乱色 | 欧美五月婷婷 | 在线观看免费版高清版 | 亚洲无在线 | av一级在线观看 | 久草干 | 免费中文字幕在线观看 | 最新影院 | 久久99精品国产麻豆婷婷 | 久久久久免费精品视频 | 国产成人99久久亚洲综合精品 | 国产精品视频永久免费播放 | 中文字幕在线观看免费高清电影 | 免费观看成人 | 视频成人永久免费视频 | 久久激情视频 久久 | 成年人app网址 | 97色国产| 国产99re| 麻豆免费在线播放 | 免费av网址在线观看 | 精品成人国产 | 国产精品国产三级国产aⅴ无密码 | 国产精品网红直播 | 在线播放 日韩专区 | 亚洲一级电影视频 | 日本中文在线观看 | 国产精品久久久久久久免费 | 欧美性极品xxxx娇小 | 免费a v在线| 九九在线高清精品视频 | 国产精品色婷婷视频 | 国产精品久久久久久久久免费 | 亚洲免费婷婷 | 在线视频日韩精品 | 在线免费观看黄网站 | 一区久久久 | 韩日av一区二区 | 色吧av色av| 国产一区二区三区高清播放 | 不卡的av | 国产精品免费小视频 | 国产精品不卡在线观看 | 免费观看成人av | 国产精品一区二区中文字幕 | www.久久爱.cn| 久久久官网 | 日本视频高清 | 成年人黄色免费视频 | 视频福利在线观看 | 国产1级视频| 天天夜夜亚洲 | 国产手机视频在线播放 | 免费在线观看亚洲视频 | 18+视频网站链接 | 天天射网 | 国产一级黄色免费看 | 玖玖精品在线 | 中文字幕一区二区三区四区在线视频 | 激情开心 | 久久免费视频国产 | 国产亚洲精品xxoo | 久久av在线播放 | 亚洲专区 国产精品 | 国产视频18 | 九九热视频在线免费观看 | 免费网站黄 | 日韩精品视频免费专区在线播放 | 久久成人精品 | 久久99精品国产91久久来源 | 欧美日韩3p | 天天干天天插 | 久草9视频| 国产精品久久久电影 | 最新在线你懂的 | www.国产在线观看 | 国产精品午夜8888 | 91视频 - v11av | 国内精品小视频 | 中国一级片在线观看 | 97久久久免费福利网址 | 久久99热久久99精品 | 在线观看国产中文字幕 | 菠萝菠萝蜜在线播放 | 婷五月天激情 | 97精品国产一二三产区 | 美女视频黄免费网站 | 国产精品一区二区三区在线播放 | 国产在线国偷精品产拍免费yy | 日本高清久久久 | 日韩免费av在线 | 午夜一级免费电影 | 中文在线免费看视频 | 国产中文字幕在线看 | 日韩午夜av| 成人黄色大片网站 | 五月婷婷操| 天天综合网 天天综合色 | 亚洲一区二区精品在线 | 亚洲高清色综合 | 日韩天天干 | 免费看v片 | 99久久婷婷国产一区二区三区 | av综合站| 国产永久免费观看 | 久久综合成人网 | 久久精品99国产精品酒店日本 | 久久国产精品99国产 | 黄色日本片 | 成人久久久久久久久久 | 国产老妇av | 最近的中文字幕大全免费版 | 免费看在线看www777 | 国产精品成人国产乱一区 | 日日碰狠狠躁久久躁综合网 | 99热这里只有精品久久 | 日本中文字幕视频 | av免费观看高清 | 中文av免费| 99久久精品国产一区二区成人 | 99色| 国产高清在线免费观看 | 日本在线中文在线 | 伊人天天| 欧美伦理电影一区二区 | 国产在线观看h | 日日夜夜噜 | 在线国产专区 | 伊人久久国产精品 | 欧美性色黄 | 国产精品福利无圣光在线一区 | www久久久| 亚洲精品国偷拍自产在线观看蜜桃 | 日本视频高清 | 国产一级视频免费看 | 亚洲国产精品传媒在线观看 | 久久影院亚洲 | 久草在线手机观看 | 人人射人人爱 | 97超碰中文| 黄色软件在线观看免费 | 在线观看av中文字幕 | 亚洲一区 影院 | 色综合色综合久久综合频道88 | 中文字幕在线播放视频 | 国产精品美女久久久久久网站 | 成人免费一级片 | 天天爽天天搞 | 又黄又爽又湿又无遮挡的在线视频 | 99re久久资源最新地址 | 99视频+国产日韩欧美 | 深爱激情婷婷网 | 国产精品一区二区av麻豆 | 91精品国产网站 | 成人欧美一区二区三区在线观看 | 免费精品视频 | 色综合天天射 | 欧美国产日韩一区二区三区 | 久久精品一二三 | 久久99热精品这里久久精品 | 黄色av电影网 | 毛片的网址 | 日韩欧在线 | 国产成人在线一区 | 久久亚洲精品国产亚洲老地址 | 久久精品久久99 | 五月天综合激情 | 4438全国亚洲精品在线观看视频 | 激情欧美在线观看 | 97在线看片| av福利免费| 波多野结衣一区二区 | 综合色播 | 精品国产一区二区三区久久久 | 久久精品精品 | 欧美日韩视频在线一区 | 2020天天干夜夜爽 | 国产一区二区在线免费观看 | 五月婷婷视频 | 黄色毛片在线 | 成人黄色小视频 | 国产午夜小视频 | 91热视频在线观看 | 激情小说网站亚洲综合网 | 免费日韩一区二区三区 | 手机看片久久 | 国产精品久久二区 | 四虎影视欧美 | 日本中文字幕高清 | 成人av网站在线播放 | 免费亚洲电影 | 亚洲开心激情 | 国产黄色精品 | 天天操天 | 在线视频黄 | 亚洲精品视频一 | 中文字幕的 | 在线免费观看视频一区二区三区 | 婷婷在线免费视频 | 成人免费看黄 | 欧美 日韩 国产 中文字幕 | av中文国产 | av一本久道久久波多野结衣 | 伊人黄 | 欧美日韩国产一二三区 | 精品高清视频 | 欧洲亚洲精品 | 午夜av在线播放 | 亚洲女欲精品久久久久久久18 | www..com毛片| www.av小说| 色综合天天射 | 精品一区91 | 精品成人a区在线观看 | 国产一区视频导航 | 极品久久久 | jizzjizzjizz亚洲| 欧美性生活小视频 | 日韩三级视频在线看 | 国产精品久久久久久久久久久久午夜 | 国产69精品久久99不卡的观看体验 | 欧美在线aa | 国产香蕉97碰碰久久人人 | 日韩欧美视频一区二区 | 亚洲九九九在线观看 | 久草电影免费在线观看 | 日韩av福利在线 | 亚洲成年人免费网站 | 久草视频手机在线 | 久一网站| 国产成人一区二区三区影院在线 | 天天曰天天干 | 三级黄色网络 | av久久久久久 | .国产精品成人自产拍在线观看6 | 色人久久 | 免费观看性生交 | 丁香九月婷婷 | 涩涩成人在线 | 天天做日日爱夜夜爽 | 一区二区三区视频 | 日韩精品久久久久久 | 天天干天天拍天天操天天拍 | 国产精品欧美日韩在线观看 | 视频一区二区精品 | 黄免费在线观看 | 99久久精品国产亚洲 | 精品久久久久久亚洲综合网 | 98超碰人人 | 久久99精品久久久久久秒播蜜臀 | 97av超碰| 亚洲精品高清视频在线观看 | 麻豆免费在线视频 | 中文字幕一区二区三区视频 | 国产日女人 | 白丝av在线 | 天天摸天天舔天天操 | 日韩午夜剧场 | 精品美女在线视频 | 亚洲视频axxx | 黄污在线观看 | 狠狠色丁香婷婷综合久小说久 | 六月激情丁香 | 国产视频网站在线观看 | 四虎国产精品成人免费影视 | 成人黄色短片 | 日韩精品一区二区三区丰满 | 日韩黄色在线观看 | 免费色视频网站 | 高清av在线免费观看 | 国产精品大片在线观看 | 中文久草 | 综合在线色 | 日韩精品免费在线观看视频 | 国产精品永久免费 | 国产精品久久久久久久久久久杏吧 | 欧美一区在线观看视频 | 久久精品一| 91视频黄色 | av在线永久免费观看 | 99国产情侣在线播放 | 天天操天天色天天射 | 97电影在线看视频 | 亚洲国产精品第一区二区 | 成 人 黄 色 片 在线播放 | 欧美地下肉体性派对 | 精品福利视频在线观看 | 国产美女免费视频 | 久草国产在线 | 欧美男同视频网站 | 亚洲第一中文网 | 色在线观看网站 | 中文字幕最新精品 | 毛片网站在线 | 欧美激情xxxx| 国产在线精品区 | 日韩av免费大片 | 亚洲永久精品在线 | 欧美午夜久久 | 91av在线不卡 | 免费看一及片 | 激情开心网站 | 国产精品video爽爽爽爽 | 国产精品观看视频 | 日韩精品一区在线观看 | 中文字幕欧美日韩va免费视频 | 一区二区av| 久久社区视频 | 91最新国产 | 欧美一级视频免费看 | 天天操天天舔天天爽 | 精品一区精品二区高清 | 国产精品美女久久久久久久久久久 | 国产欧美精品一区二区三区 | 国产视频欧美视频 | 91黄色影视| 久久网页 | 国产精选在线观看 | 青草视频在线 | 欧美国产日韩一区二区三区 | 久久精品综合一区 | av中文字幕在线观看网站 | 中文字幕黄色 | 亚洲成人999 | 中文字幕一区二区三区四区在线视频 | 色婷婷五| www国产精品com | 欧美精品一区二区三区一线天视频 | 日日夜夜天天久久 | 日韩黄色免费看 | 国产精品2区 | 日韩欧美视频免费在线观看 | 国产精品白浆视频 | 中文视频在线播放 | 日日日天天天 | 97精品国产97久久久久久久久久久久 | 中文字幕在线观看免费 | 96久久欧美麻豆网站 | 99精品欧美一区二区 | a级国产乱理论片在线观看 特级毛片在线观看 | 正在播放国产精品 | av成人免费在线观看 | 黄色一级大片在线观看 | www.夜夜操.com| 久久综合亚洲鲁鲁五月久久 | 三级av免费| 免费视频久久久久 | 免费观看黄色av | 欧美 日韩 性 | 在线一区av| 久久久久日本精品一区二区三区 | 99久久精品免费一区 | 狠狠艹夜夜干 | 免费观看日韩 | 久久久久久久久久影视 | 69精品在线 | 日本久久久久久 | 日韩电影一区二区三区 | 国产日产av| 密桃av在线| 一二三区视频在线 | 久草在线免费新视频 | 18做爰免费视频网站 | 日韩在线视频精品 | 99热超碰在线 | 欧美一区视频 | 亚洲 欧美变态 另类 综合 | 日本韩国精品一区二区在线观看 | 四虎影视久久久 | 国产精品 欧美 日韩 | 国产999| 亚洲精品一区二区在线观看 | 在线观看香蕉视频 | 五月婷婷丁香 | 国产特级毛片aaaaaaa高清 | 精品国产一区二区三区日日嗨 | 黄色午夜| 日本黄色免费网站 | 色综合网 | 欧美污网站 | 天天操夜夜想 | 亚洲区另类春色综合小说 | 国产一区二区视频在线 | 亚洲视频免费在线观看 | 2021久久 | 超碰在线官网 | 国产精品系列在线观看 | 久久久国产一区二区三区四区小说 | 国产偷国产偷亚洲清高 | 亚洲最新av在线网址 | 久久精品国产免费 | 欧日韩在线视频 | 日韩欧美在线国产 | 亚洲精品国产精品乱码不99热 | 日韩天堂在线观看 | av资源免费观看 | 久久国内精品99久久6app | 日韩欧美一区二区三区视频 | 婷婷激情五月综合 | 久久理伦片 | 日韩av男人的天堂 | 国产亚洲精品成人av久久影院 | 国产网红在线观看 | 91久久精品一区二区二区 | 国产精品99久久久久的智能播放 | 99免在线观看免费视频高清 | 在线视频 亚洲 | 欧美一级艳片视频免费观看 | 毛片网在线观看 | 免费日韩一区二区三区 | 99久久婷婷国产综合亚洲 | 天天射天天操天天色 | 久草视频播放 | 中文字幕一区二区三区久久 | 国产精品不卡在线 | 久久久这里有精品 | 日韩高清在线观看 | 午夜视频一区二区三区 | 免费热情视频 | 人人插人人搞 | 亚洲春色奇米影视 | 国产色一区| 日韩亚洲在线观看 | av黄色免费看 | 亚洲无人区小视频 | 99热超碰 | 黄色av高清 | 超碰97免费观看 | 黄色在线观看www | 91超碰在线播放 | 91高清完整版在线观看 | 欧美另类调教 | 亚洲黄a | 激情视频亚洲 | 五月婷婷在线视频观看 | 国产精品中文在线 | 成人一级免费电影 | 日韩字幕| 五月天久久 | 国产伦理一区 | 超碰电影在线观看 | 欧美a在线看 | 国产精品 亚洲精品 | 国产亚洲人成网站在线观看 | 天堂在线视频免费观看 | 亚洲 欧美 综合 在线 精品 | 久久av在线播放 | 国产高清第一页 | 中文字幕亚洲欧美 | 久久av网| 91毛片视频 | 91成人短视频在线观看 | 91超国产| 97在线看片 | 精品国产1区2区 | 久久香蕉国产精品麻豆粉嫩av | 在线www色 | 色综合久久久久综合体桃花网 | 国产精品久久久久久久久久久久午 | 亚洲成人av一区 | 久久91久久久久麻豆精品 | 在线观看国产区 | 一级片免费视频 | 国产黄色成人av | 欧美日韩中文在线视频 | 久久精彩免费视频 | 美女免费视频黄 | 黄色福利视频网站 | 中文字幕最新精品 | 免费情趣视频 | 国产黄影院色大全免费 | 97精品久久| 日本在线精品视频 | 国产精品亚州 | 国产一级黄色免费看 | 天天干天天插伊人网 | 麻豆91视频 | 激情av五月婷婷 | 亚洲视频精品 | 日韩在线视频播放 | 精品在线播放 | 深夜福利视频在线观看 | 人人澡人人爽 | 亚洲电影久久久 | 999在线精品 | 午夜电影久久 | 五月激情婷婷丁香 | 日韩一区在线免费观看 | 麻豆一区在线观看 | 蜜臀av免费一区二区三区 | 日韩激情在线视频 | 久草影视在线 | 国产无区一区二区三麻豆 | 91污污视频在线观看 | 手机看片久久 | 免费在线播放视频 | av中文字幕av| 成人黄色大片在线免费观看 | 91黄色视屏| 亚州精品一二三区 | 欧美大码xxxx | 精品视频免费在线 | 91久久精| 亚洲精品小区久久久久久 | 韩国av电影在线观看 | 日本久久久久久久久久 | 国产精品婷婷午夜在线观看 | 中文不卡视频 | 色婷婷激婷婷情综天天 | 91大神dom调教在线观看 | 天天曰视频 | 欧美精品乱码久久久久久按摩 | 色综合国产 | 日韩v在线91成人自拍 | 日本视频精品 | 国产91精品高清一区二区三区 | 天堂av色婷婷一区二区三区 | 亚洲精品videossex少妇 | 亚洲日本一区二区在线 | 九九免费精品视频在线观看 | 日日夜夜综合网 | 色亚洲激情 | 国产精品久久久久aaaa | 国产在线观看免费观看 | 最近免费在线观看 | 91日韩在线专区 | 91九色丨porny丨丰满6 | 精品欧美一区二区三区久久久 | 2021国产在线 | 国产一区在线不卡 | 黄色精品免费 | 日韩欧美一区二区三区视频 | 精品免费观看视频 | 免费国产视频 | 国产成人精品999在线观看 | 午夜视频一区二区 | 亚洲开心激情 | 91漂亮少妇露脸在线播放 | 欧美日韩一二三四区 | 日韩xxxx视频 | 天天干夜夜夜 | 91精品久久久久久久久 | 亚洲影院国产 | 国产一二三在线视频 | 国产精品久久久久久久久久 | 欧美性大战 | 国产视频二区三区 | 久久久久99精品成人片三人毛片 | 久久字幕网 | 五月开心六月婷婷 | 91视频在线播放视频 | 欧美精品久久久久久久免费 | 国产精品久久久久久久久久新婚 | 97成人精品视频在线播放 | 美女网站在线播放 | 有码中文字幕在线观看 | 丁香花五月 | 91精品免费看 | 中文字幕一二三区 | 伊人日日干 | 免费亚洲一区二区 | 天天射成人 | 91超碰在线播放 | 欧美韩国日本在线 | 成人蜜桃| 久草在线观看视频免费 | 二区三区在线视频 | 麻豆传媒视频在线免费观看 | 成人av播放 | 波多野结衣视频一区二区三区 | 国产美女免费看 | 天天干天天射天天操 | 九九热视频在线免费观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 色吊丝在线永久观看最新版本 | 亚洲美女视频在线观看 | 午夜手机电影 | 一区二区不卡视频在线观看 | 国产专区视频在线 | 97碰视频| 国产精品国产三级国产aⅴ无密码 | 欧美精品一区二区免费 | 免费特级黄色片 | 蜜桃视频色 | 成人a视频片观看免费 | 日韩国产高清在线 | 青青草国产成人99久久 | 91桃色在线观看视频 | 日本免费久久高清视频 | 国产精品一区久久久久 | 欧美色就是色 | 国产不卡在线观看视频 | 国产精品久久久久久久久久尿 | 这里只有精品视频在线 | 国产黄色高清 | 国产在线观 | 久久成人在线 | 精品国产一区二区三区不卡 | 国产成人精品av在线观 | 片网址 | 毛片3| 13日本xxxxxⅹxxx20 | 91在线91| 欧美久久久久久久久久久久久 | 18久久久久 | 西西www4444大胆在线 | 中文有码在线视频 | 国产精品毛片久久久久久 | 婷婷网在线 | 九九精品久久 | 色婷婷成人网 | 久久综合九色综合网站 | 黄色小说在线观看视频 | 国产精品中文字幕在线观看 | 中文字幕乱码亚洲精品一区 | 三级在线播放视频 | 在线观看日韩中文字幕 | 免费久久久 | 99精品视频在线观看播放 | 成人性生爱a∨ | 亚洲日本欧美在线 | 97在线观视频免费观看 | 麻豆高清免费国产一区 | 天天色天天艹 | 五月天国产精品 | 欧美性大战久久久久 | 精品久久精品 | 久久五月精品 | 在线观看片 | 天天天干天天天操 | 在线观看亚洲成人 | 日韩精品一区二区三区中文字幕 | 日本福利视频在线 | 精品美女久久久久 | 日韩av影视在线观看 | 2000xxx影视 | av免费网站 | 中文字幕资源网 国产 | 国产aaa免费视频 | 欧美黑人巨大xxxxx | 亚洲欧美色婷婷 | 精品字幕在线 | 狠狠狠操 | www看片网站 | 国产一区二区在线观看免费 | 国产精品在线看 | 国产精品1024 | 久久a免费视频 | 国产高清免费在线观看 | 九九99| 中文字幕第一页在线播放 | 国产四虎在线 | 97看片| 国产精品美女999 | 国产福利免费在线观看 | 国产精品1区2区在线观看 | 天天干天天天天 | 91精品影视 | 久久噜噜少妇网站 | 精品免费99久久 | 天天射天天爽 | 亚洲视频在线免费观看 | 日韩一级精品 | 九色porny真实丨国产18 | 日韩大陆欧美高清视频区 | 91亚洲精| 日韩免费在线视频观看 | 国产日韩欧美视频 | 国产精品久久久999 国产91九色视频 | 国产美女视频 | 欧美最猛性xxxxx亚洲精品 | 久久尤物电影视频在线观看 | 久久网页 | 亚洲综合成人专区片 | 日韩av三区| 欧美不卡视频在线 | 成人免费视频a | 91视频啪| 欧美不卡视频在线 | 国产视频资源 | 人人干人人草 | 一本之道乱码区 | 最近中文字幕大全 | 精品v亚洲v欧美v高清v | 国产午夜剧场 | 久久国产精品久久精品国产演员表 | 五月婷在线播放 | 在线观看中文字幕2021 | 96在线| 一区二区三区在线免费播放 | 九九热免费在线观看 | 亚洲成人国产精品 | 日韩在线电影 | 色久网| 久久毛片高清国产 | 国产一区二区在线免费播放 | 天天操天天射天天插 | 免费观看91视频 | 激情综合五月天 | 99在线热播精品免费99热 | 午夜视频免费 | 91在线看| 久久中文视频 | 7777精品伊人久久久大香线蕉 | 国产电影一区二区三区四区 | 久久在线免费视频 | 久久国产一区二区三区 | 成人黄视频 | 911国产精品| 亚洲欧美日韩精品久久久 | 精品视频999| 国产视频不卡一区 | 免费看的黄网站 | 中文字幕亚洲五码 | 97免费在线观看视频 | 999精品在线| 精品国产乱码久久久久久三级人 | 日韩精品偷拍 | 亚洲狠狠丁香婷婷综合久久久 | 一区二区免费不卡在线 |