精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一篇帶給你Sentinel 流控原理

開發 前端
配置流控規則我們最簡單的方式就是通過 @ResoureSetinel 的方式來管理,該注解可以直接定義流控規則、降級規則。

[[401131]]

我們在項目中添加 Spring Cloud Sentinel 依賴添加后 spring-cloud-starter-alibaba-sentinel 在 Spring-Boot 啟動的過程中回去初始化 spring.factories 中的配置信息,如:SentinelWebAutoConfiguration 、SentinelAutoConfiguration 等配置文件來初始化

再講代碼之前我先聲明一下我的版本號sentinel 1.8.0 。后續的所有內容均基于該版本進行

@ResoureSetinel 工作原理

配置流控規則我們最簡單的方式就是通過 @ResoureSetinel 的方式來管理,該注解可以直接定義流控規則、降級規則。下面是一個簡單的使用例子:

  1. @SentinelResource(value = "ResOrderGet"
  2.                   fallback = "fallback"
  3.                   fallbackClass = SentinelResourceExceptionHandler.class, 
  4.                   blockHandler = "blockHandler"
  5.                   blockHandlerClass = SentinelResourceExceptionHandler.class 
  6.                  ) 
  7. @GetMapping("/order/get/{id}"
  8. public CommonResult<StockModel> getStockDetails(@PathVariable Integer id) { 
  9.   StockModel stockModel = new StockModel(); 
  10.   stockModel.setCode("STOCK==>1000"); 
  11.   stockModel.setId(id); 
  12.   return CommonResult.success(stockModel); 

如果大家熟悉 Spring 相關的組件大家都可以想到,這里多半是通過Spring Aop. 的方式來攔截 getStockDetails 方法。我們先看看SentinelAutoConfiguration 配置文件,我們可以找到 SentinelResourceAspect Bean 的定義方法。

  1. @Bean 
  2. @ConditionalOnMissingBean 
  3. public SentinelResourceAspect sentinelResourceAspect() { 
  4.    return new SentinelResourceAspect(); 

讓后我們再來看看 SentinelResourceAspect 具體是怎么處理的,源碼如下:

  1. // 定義 Pointcut 
  2. @Pointcut("@annotation(com.alibaba.csp.sentinel.annotation.SentinelResource)"
  3. public void sentinelResourceAnnotationPointcut() { 
  4. // Around 來對被標記 @SentinelResource 注解的方法進行處理 
  5. @Around("sentinelResourceAnnotationPointcut()"
  6. public Object invokeResourceWithSentinel(ProceedingJoinPoint pjp) throws Throwable { 
  7.   Method originMethod = resolveMethod(pjp); 
  8.   // 獲取注解信息 
  9.   SentinelResource annotation = originMethod.getAnnotation(SentinelResource.class); 
  10.   // 獲取資源名稱 
  11.   String resourceName = getResourceName(annotation.value(), originMethod); 
  12.   EntryType entryType = annotation.entryType(); 
  13.   int resourceType = annotation.resourceType(); 
  14.   Entry entry = null
  15.   try { 
  16.     // 執行 entry 
  17.     entry = SphU.entry(resourceName, resourceType, entryType, pjp.getArgs()); 
  18.     // 執行業務方法 
  19.     Object result = pjp.proceed(); 
  20.     // 返回 
  21.     return result; 
  22.   } catch (BlockException ex) { 
  23.     // 處理 BlockException 
  24.     return handleBlockException(pjp, annotation, ex); 
  25.   } catch (Throwable ex) { 
  26.     Class<? extends Throwable>[] exceptionsToIgnore = annotation.exceptionsToIgnore(); 
  27.     // The ignore list will be checked first
  28.     if (exceptionsToIgnore.length > 0 && exceptionBelongsTo(ex, exceptionsToIgnore)) { 
  29.       throw ex; 
  30.     } 
  31.     if (exceptionBelongsTo(ex, annotation.exceptionsToTrace())) { 
  32.       traceException(ex); 
  33.       // 處理降級 
  34.       return handleFallback(pjp, annotation, ex); 
  35.     } 
  36.     // No fallback function can handle the exception, so throw it out
  37.     throw ex; 
  38.   } 

我們總結一下, @SentinelResource 的執行過程, 首先是通過 Aop 進行攔截,然后通過 SphU.entry 執行對應的流控規則,最后調用業務方法。如果觸發流控規則首先處理流控異常 BlockException 然后在判斷是否有服務降級的處理,如果有就調用 fallback 方法。通過 handleBlockException 、handleFallback 進行處理。

責任鏈模式處理流控

通過上面的梳理,我們知道對于流控的過程,核心處理方法就是 SphU.entry 。在這個方法中其實主要就是初始化流控 Solt 和執行 Solt. 在這個過程中會對:簇點定義、流量控制、熔斷降級、系統白名單等頁面功能進行處理。

1. 初始化責任鏈

下面是初始化 Solt 的核心代碼在 SphU.entryWithPriority

  1. // 刪減部分代碼 
  2. private Entry entryWithPriority(ResourceWrapper resourceWrapper, int count, boolean prioritized, Object... args) 
  3.   throws BlockException { 
  4.   // 初始化責任鏈 
  5.   ProcessorSlot<Object> chain = lookProcessChain(resourceWrapper); 
  6.   Entry e = new CtEntry(resourceWrapper, chain, context); 
  7.   try { 
  8.     // 執行 entry 
  9.     chain.entry(context, resourceWrapper, nullcount, prioritized, args); 
  10.   } catch (BlockException e1) { 
  11.     e.exit(count, args); 
  12.     // 異常拋出,讓 SentinelResourceAspect.invokeResourceWithSentinel 統一處理 
  13.     throw e1; 
  14.   } catch (Throwable e1) { 
  15.     // This should not happen, unless there are errors existing in Sentinel internal. 
  16.     RecordLog.info("Sentinel unexpected exception", e1); 
  17.   } 
  18.   return e; 

通過 lookProcessChain 方法我逐步的查找,我們可以看到最終的責任鏈初始化類,默認是 DefaultSlotChainBuilder

  1. public class DefaultSlotChainBuilder implements SlotChainBuilder { 
  2.     @Override 
  3.     public ProcessorSlotChain build() { 
  4.         ProcessorSlotChain chain = new DefaultProcessorSlotChain(); 
  5.         // Note: the instances of ProcessorSlot should be different, since they are not stateless. 
  6.         // 通過 SPI 去加載所有的  ProcessorSlot 實現,通過 Order 排序 
  7.         List<ProcessorSlot> sortedSlotList = SpiLoader.loadPrototypeInstanceListSorted(ProcessorSlot.class); 
  8.         for (ProcessorSlot slot : sortedSlotList) { 
  9.             if (!(slot instanceof AbstractLinkedProcessorSlot)) { 
  10.                 RecordLog.warn("The ProcessorSlot(" + slot.getClass().getCanonicalName() + ") is not an instance of AbstractLinkedProcessorSlot, can't be added into ProcessorSlotChain"); 
  11.                 continue
  12.             } 
  13.                       // 添加到 chain 尾部 
  14.             chain.addLast((AbstractLinkedProcessorSlot<?>) slot); 
  15.         } 
  16.         return chain; 
  17.     } 

2. 責任鏈的處理過程

我們可以通過斷點的方式來查看在 sortedSlotList 集合中所有的 solt 順序如下圖所示:

我們可以通過如下的順序進行逐個的簡單的分析一下

  • NodeSelectorSolt
  • CusterBuilderSolt
  • LogSlot
  • StatisicSlot
  • AuthoritySolt
  • SystemSolts
  • ParamFlowSolt
  • FlowSolt
  • DegradeSlot

對于 Sentinel 的 Slot 流控協作流程可以參考官方給出的文檔, 如下圖所示:

FlowSolt 流控

通過 NodeSelectorSolt、CusterBuilderSolt、StatisicSlot 等一系列的請求數據處理,在 FlowSolt會進入流控規則,所有的 Solt 都會執行 entry 方法, 如下所示

  1. // FlowSolt 的 entry 方法 
  2. @Override 
  3. public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count
  4.                   boolean prioritized, Object... args) throws Throwable { 
  5.   // 檢查流量 
  6.   checkFlow(resourceWrapper, context, node, count, prioritized); 
  7.   fireEntry(context, resourceWrapper, node, count, prioritized, args); 

在后續的流程中,會執進行判斷具體的流控策略,默認是快速失敗,會執行 DefaultController 方法。

  1. // DefaultController 
  2. @Override 
  3. public boolean canPass(Node node, int acquireCount, boolean prioritized) { 
  4.   // 當前資源的調用次數 
  5.   int curCount = avgUsedTokens(node); 
  6.   // 當前資源的調用次數 + 1 > 當前閾值 
  7.   if (curCount + acquireCount > count) { 
  8.     // 刪減比分代碼 
  9.     // 不通過 
  10.     return false
  11.   } 
  12.   // 通過 
  13.   return true
  14. private int avgUsedTokens(Node node) { 
  15.   if (node == null) { 
  16.     return DEFAULT_AVG_USED_TOKENS; 
  17.   } 
  18.   return grade == RuleConstant.FLOW_GRADE_THREAD ? node.curThreadNum() : (int)(node.passQps()); 

如果上面返回不通過會回到,那么會拋出 FlowException

  1. public void checkFlow(Function<String, Collection<FlowRule>> ruleProvider, ResourceWrapper resource, 
  2.                       Context context, DefaultNode node, int count, boolean prioritized) throws BlockException { 
  3.   if (ruleProvider == null || resource == null) { 
  4.     return
  5.   } 
  6.   Collection<FlowRule> rules = ruleProvider.apply(resource.getName()); 
  7.   if (rules != null) { 
  8.     for (FlowRule rule : rules) { 
  9.       if (!canPassCheck(rule, context, node, count, prioritized)) { 
  10.         // 流控規則不通過,會拋出 FlowException 
  11.         throw new FlowException(rule.getLimitApp(), rule); 
  12.       } 
  13.     } 
  14.   } 

然后會在 StatisticSlot 中增加統計信息, 最后會拋出給 SentinelResourceAspect 進行處理,完成流控功能。我們再來看看這個異常信息,如果是BlockException 異常,會進入 handleBlockException 方法處理, 如果是其他的業務異常首先會判斷是否有配置 fallback 處理如果有,就調用 handleFallback 沒有就繼續往外拋,至此完成流控功能

  1. try { 
  2.   entry = SphU.entry(resourceName, resourceType, entryType, pjp.getArgs()); 
  3.   Object result = pjp.proceed(); 
  4.   return result; 
  5. } catch (BlockException ex) { 
  6.   return handleBlockException(pjp, annotation, ex); 
  7. } catch (Throwable ex) { 
  8.   Class<? extends Throwable>[] exceptionsToIgnore = annotation.exceptionsToIgnore(); 
  9.   // The ignore list will be checked first
  10.   if (exceptionsToIgnore.length > 0 && exceptionBelongsTo(ex, exceptionsToIgnore)) { 
  11.     throw ex; 
  12.   } 
  13.   if (exceptionBelongsTo(ex, annotation.exceptionsToTrace())) { 
  14.     traceException(ex); 
  15.     return handleFallback(pjp, annotation, ex); 
  16.   } 
  17.   // No fallback function can handle the exception, so throw it out
  18.   throw ex; 

DegradeSlot 降級

斷路器的作用是當某些資源一直出現故障時,將觸發斷路器。斷路器不會繼續訪問已經發生故障的資源,而是攔截請求并返回故障信號。

Sentinel 在 DegradeSlot 這個 Slot 中實現了熔斷降級的功能,它有三個狀態 OPEN 、HALF_OPEN、CLOSED 以ResponseTimeCircuitBreaker RT 響應時間維度來分析, 斷路器工作的過程。下面是一個標準斷路器的工作流程:

在 Sentinel 實現的源碼過程如下圖所示:

Sentinel 通過 Web 攔截器

Sentinel 在默認情況下, 不使用 @ResourceSentinel 注解實現流控的時候, Sentinel 通過攔截器進行流控實現的。初始化類在 SentinelWebAutoConfiguration 它實現了 WebMvcConfigurer 接口,在 sentinelWebInterceptor 方法初始化 SentinelWebInterceptor 等 Bean。

  1. @Bean 
  2. @ConditionalOnProperty(name = "spring.cloud.sentinel.filter.enabled"
  3.                        matchIfMissing = true
  4. public SentinelWebInterceptor sentinelWebInterceptor( 
  5.   SentinelWebMvcConfig sentinelWebMvcConfig) { 
  6.   return new SentinelWebInterceptor(sentinelWebMvcConfig); 

我們在 SentinelWebInterceptor 的核心方法 preHandle 中處理,這里面我們又可以看到 SphU.entry 熟悉的過程調用流控的責任鏈。由于邏輯都類似,此處不再多說。代碼如下:

  1. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
  2.   throws Exception { 
  3.   try { 
  4.     String resourceName = getResourceName(request); 
  5.     if (StringUtil.isEmpty(resourceName)) { 
  6.       return true
  7.     } 
  8.     if (increaseReferece(request, this.baseWebMvcConfig.getRequestRefName(), 1) != 1) { 
  9.       return true
  10.     } 
  11.     // Parse the request origin using registered origin parser. 
  12.     String origin = parseOrigin(request); 
  13.     String contextName = getContextName(request); 
  14.     ContextUtil.enter(contextName, origin); 
  15.     Entry entry = SphU.entry(resourceName, ResourceTypeConstants.COMMON_WEB, EntryType.IN); 
  16.     request.setAttribute(baseWebMvcConfig.getRequestAttributeName(), entry); 
  17.     return true
  18.   } catch (BlockException e) { 
  19.     try { 
  20.       handleBlockException(request, response, e); 
  21.     } finally { 
  22.       ContextUtil.exit(); 
  23.     } 
  24.     return false
  25.   } 

參考文檔

https://github.com/alibaba/Sentinel/wiki

https://martinfowler.com/bliki/CircuitBreaker.html

 

責任編輯:姜華 來源: 運維開發故事
相關推薦

2021-05-25 08:01:55

SentinelRedis 流控算法

2021-04-08 11:00:56

CountDownLaJava進階開發

2023-02-27 10:17:05

EventBus觀察者模式

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-06-09 09:08:10

LDOlowdropoutr穩壓器

2022-04-29 14:38:49

class文件結構分析

2021-07-21 09:48:20

etcd-wal模塊解析數據庫

2021-03-12 09:21:31

MySQL數據庫邏輯架構

2021-04-14 14:16:58

HttpHttp協議網絡協議

2024-06-13 08:34:48

2023-03-29 07:45:58

VS編輯區編程工具

2022-02-17 08:53:38

ElasticSea集群部署

2021-06-21 14:36:46

Vite 前端工程化工具

2022-03-22 09:09:17

HookReact前端

2021-04-01 10:51:55

MySQL鎖機制數據庫

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2021-07-08 07:30:13

Webpack 前端Tree shakin

2023-03-13 09:31:04

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-05-08 08:36:40

ObjectString前端
點贊
收藏

51CTO技術棧公眾號

成人动漫在线视频| 欧美一区二区三区啪啪| 精品国产乱码久久久久| 久久久久久久久久综合| 精品一级视频| 一区二区三区在线观看网站| 成人精品视频在线| 国产精品国产精品88| 免费一级欧美在线大片| 亚洲精品久久久蜜桃| 国产精品入口免费| 无码人妻丰满熟妇精品| 99精品视频在线观看播放| 欧美一级片在线| 你懂的av在线| 国产www.大片在线| 精品一区二区在线播放| 欧美极品少妇xxxxⅹ免费视频| 亚洲精品第二页| 校园春色亚洲色图| 亚洲女厕所小便bbb| 国产女主播一区二区三区| 国产精品久久久久久久久久精爆| 久久精品国产99久久| 日韩女优av电影| 免费毛片小视频| 在线视频三区| 国产99久久精品| 欧美自拍视频在线| 国产喷水在线观看| 中国av一区| 色8久久人人97超碰香蕉987| 国产经典久久久| 污视频在线免费观看| 美日韩一级片在线观看| 欧美疯狂xxxx大交乱88av| av鲁丝一区鲁丝二区鲁丝三区| 韩国女主播一区二区| 亚洲综合激情另类小说区| 欧美日韩国产一二| 精品黑人一区二区三区在线观看 | 日韩欧美在线观看免费| 日韩精品四区| 日韩精品久久久久| 色男人天堂av| 男人av在线播放| 亚洲男人天堂av| 色一情一乱一伦一区二区三区| www.黄色av| 久久精品av麻豆的观看方式| 97在线视频免费播放| 日韩a级片在线观看| 少妇精品久久久一区二区| 精品免费国产一区二区三区四区| 蜜臀视频一区二区三区| 欧美xxxxxx| 色综合久久综合网欧美综合网| 男人添女人荫蒂免费视频| caoporn免费在线| 国产精品成人免费| 一区二区在线观看网站| 午夜激情在线观看| 亚洲欧洲日韩在线| 免费观看黄色大片| 新版中文在线官网| 亚洲自拍偷拍麻豆| 国产一区二区三区小说| 超碰激情在线| 日韩欧美在线播放| 好男人www社区| 日韩欧美精品电影| 色偷偷久久人人79超碰人人澡| 黄色片久久久久| 亚洲第一影院| 在线成人av网站| 无码国产精品一区二区高潮| caoporn成人| 日韩精品小视频| 国产精品美女高潮无套| 久久五月天小说| 欧美精品免费在线观看| 国产性生活网站| 亚洲一区二区动漫| 国产精品久久久91| 国产精品日韩无码| 成人午夜在线播放| 精品视频一区在线| av一区在线观看| 亚洲激情在线播放| 播放灌醉水嫩大学生国内精品| 欧美特黄aaaaaaaa大片| 欧美日本高清视频在线观看| 先锋资源在线视频| 一区二区美女| 久久这里有精品视频| 久久国产精品波多野结衣| 亚洲久久视频| 91精品久久久久| 国产综合视频在线| 久久精品亚洲一区二区三区浴池 | 欧美日韩伦理片| 国产精品亲子乱子伦xxxx裸| 人妻无码一区二区三区四区| 欧美天堂视频| 欧美一卡二卡在线观看| jizz欧美性20| 欧美伊人久久| 日韩av成人在线| 精品国产无码一区二区| 国产亚洲美州欧州综合国| 可以免费看的黄色网址| 欧美aa在线| 制服丝袜亚洲色图| 中文精品在线观看| 欧美1区视频| 国产精品久久久亚洲| 亚洲国产精品无码久久| 日本一区二区三区免费乱视频| 国产一级片91| 国外成人福利视频| 日韩高清av一区二区三区| 一区二区视频免费看| 视频精品一区二区| 国产日韩二区| 97caopor国产在线视频| 日本韩国精品一区二区在线观看| 美国黄色一级视频| 婷婷激情图片久久| 国产精品久久久久久久久久小说 | 日本不卡一区二区三区视频| 免费黄色网址在线观看| 欧美日韩在线视频一区| 91成人在线观看喷潮蘑菇| 久久在线视频| 国产精品日韩在线| 免费a级毛片在线观看| 亚洲一区二区欧美日韩| 在线播放黄色av| 99久精品视频在线观看视频| 国产精品久久9| 男同在线观看| 一本一本大道香蕉久在线精品 | 国产欧美日韩精品一区| 国产精品自拍片| 国产精品白丝一区二区三区| 色与欲影视天天看综合网| 91中文字幕在线视频| 欧美国产一区二区在线观看| 国产日韩成人内射视频| 免费观看久久av| 欧美中文字幕视频| 青青视频在线观| 日韩人体视频一二区| 深爱五月激情网| 久久久999| 日本一区二区三区免费观看 | 国产精品va| 91影院未满十八岁禁止入内| 中文国产字幕在线观看| 91精品国产综合久久香蕉麻豆| 久久爱一区二区| 国产综合色在线视频区| 麻豆md0077饥渴少妇| 亚洲91网站| 午夜精品久久久久久久久久久久| 蜜臀久久精品久久久久| 亚洲国产精品久久久男人的天堂 | 亚洲免费视频二区| 国产日产欧美一区二区三区| 日日噜噜噜噜久久久精品毛片| 欧美在线观看视频一区| 国产精品视频一区二区高潮| 免费av在线网站| 日韩视频免费观看高清完整版在线观看 | 在线观看成人免费| 亚洲精品一二三**| 国外成人在线视频| 日本不卡免费播放| 欧美熟乱第一页| 久久中文免费视频| 成人av网站在线观看| aaaaaa亚洲| 天天综合网网欲色| 国产精品亚洲一区| 最新欧美电影| 久久久成人av| 熟妇人妻中文av无码| 在线欧美日韩国产| 成人免费视频网站入口::| 99久久免费精品高清特色大片| 国产熟人av一二三区| 久久久久久久久99精品大| 国产欧美日韩综合精品二区| 日韩久久一区二区三区| 久久成人免费视频| 深夜福利免费在线观看| 91麻豆精品国产91久久久久久 | 日韩精品黄色| 欧美一区二区三区影视| 国产美女激情视频| 1区2区3区国产精品| 男男做爰猛烈叫床爽爽小说| 美女视频网站久久| 美女日批免费视频| 91精品秘密在线观看| 精品国产_亚洲人成在线| 日韩一区中文| 欧美最猛性xxxxx(亚洲精品)| 一本一道波多野毛片中文在线| 精品国产亚洲在线| 中文字幕乱码人妻二区三区| 亚洲风情在线资源站| 91无套直看片红桃在线观看| 成人黄页毛片网站| 天堂在线中文在线| 久久av一区| 一本久道高清无码视频| 日韩免费视频| 蜜桃av色综合| 高潮按摩久久久久久av免费| 国产日韩在线一区| 校园春色亚洲色图| 88国产精品欧美一区二区三区| 国产剧情在线| 最近中文字幕mv在线一区二区三区四区| 日本激情一区二区三区| 欧美丰满一区二区免费视频| 在线免费观看av网址| 精品国产户外野外| 精品少妇theporn| 1024亚洲合集| 国产农村妇女精品一区| av中文字幕在线不卡| 人妻激情偷乱视频一区二区三区| 免费成人美女在线观看| 国产a级一级片| 99综合精品| 无码人妻精品一区二区蜜桃网站| 国产高清一区二区| 伊人久久99| 久久国产精品亚洲人一区二区三区| 欧美成人在线免费观看| 欧美男人操女人视频| 成人三级在线| 亚洲天堂av资源在线观看| 亚洲xxxx18| 国产电影一区二区| 91沈先生在线观看| 99久久这里有精品| 国产日韩精品电影| 欧美三级电影网址| 国产精品中文在线| 播放一区二区| 国产精品你懂得| 日韩专区视频| 亚洲自拍另类欧美丝袜| 日韩精品视频中文字幕| 91在线免费网站| 亚洲欧洲国产精品一区| 国产成人女人毛片视频在线| 国产福利资源一区| 精品不卡一区二区三区| 亚洲丝袜啪啪| 日韩av一区二区三区在线| 欧美日韩高清| 一区二区三区四区免费视频| **女人18毛片一区二区| 女女百合国产免费网站| 狠狠色狠狠色综合日日tαg| 草草视频在线免费观看| 国产视频欧美| 亚洲五月天综合| 精品综合久久久久久8888| 亚洲一级片免费观看| 国产不卡视频在线播放| 三叶草欧洲码在线| 国产欧美日韩麻豆91| 老司机成人免费视频| 亚洲韩国一区二区三区| 天堂中文在线网| 欧美亚洲国产一区在线观看网站| 国产精品伦理一区| 精品福利一区二区三区| 欧美精品a∨在线观看不卡| 日韩最新在线视频| 成人爽a毛片免费啪啪动漫| 欧美一级片在线播放| 黄色日韩网站| 国产精品v欧美精品v日韩| 香蕉久久精品日日躁夜夜躁| 亚洲乱码一区二区三区| 欧美激情性爽国产精品17p| 99色精品视频| 蜜桃免费网站一区二区三区| 精品人妻人人做人人爽夜夜爽| 久久亚洲精品小早川怜子| 欧洲性xxxx| 亚洲国产精品自拍| 中文天堂在线资源| 精品乱码亚洲一区二区不卡| 搞黄视频在线观看| 性色av一区二区咪爱| 99久久精品一区二区成人| 成人在线免费网站| 精品国产一区二区三区久久久樱花| 91精品一区二区三区四区| 亚洲一区二区三区四区五区午夜 | 日韩成人免费av| 激情伦成人综合小说| 无码一区二区三区视频| 青青视频在线播放| 国产精品原创巨作av| 国产精品美女高潮无套| 午夜视黄欧洲亚洲| 国产三级在线观看视频| 亚洲天堂男人的天堂| 国产三级伦理在线| 成人免费福利在线| 亚洲调教一区| 国产一区二区三区小说| 久久99精品一区二区三区三区| 成年人网站免费看| 亚洲一区二区三区精品在线| 一本大道伊人av久久综合| 亚洲人成电影网站| av资源网在线播放| 91精品天堂| 国产精品久久久久一区二区三区厕所| 虎白女粉嫩尤物福利视频| 成人精品免费看| 丰满少妇被猛烈进入一区二区| 欧美日韩精品三区| 黄色美女网站在线观看| 欧美中文字幕在线| 久久97精品| 天堂…中文在线最新版在线| 国产馆精品极品| 日本福利片在线观看| 欧美精品日韩精品| 99re热久久这里只有精品34| 国产91在线视频| 蜜桃国内精品久久久久软件9| 一二三四视频社区在线| 成人性视频网站| 免费在线观看日韩| 欧美成人官网二区| 日本色护士高潮视频在线观看| 亚洲曰本av电影| 亚洲国产老妈| 麻豆传媒在线看| 亚洲黄色免费网站| 亚洲成人一二三区| 欧美激情第99页| 精品人人人人| 精品国产一二三四区| 91女人视频在线观看| 美女又爽又黄免费视频| 日韩电影在线观看中文字幕| 国模套图日韩精品一区二区| 你懂的网址一区二区三区| 亚洲女优在线| 欧美日韩高清丝袜| 欧美午夜精品一区| 激情在线小视频| 95av在线视频| 99riav国产精品| 自拍偷拍视频亚洲| 欧美日韩色综合| 超碰在线caoporen| 国产精品12| 久久一区激情| 99久久久免费精品 | 人妻无码一区二区三区久久99 | 99欧美精品| 自拍另类欧美| 丁香婷婷综合色啪| 男人午夜免费视频| 最近2019中文字幕在线高清| 视频一区在线| 一女被多男玩喷潮视频| 欧美国产欧美综合| 国产av无码专区亚洲av麻豆| 97精品久久久| 日韩a一区二区| 久久久久久无码精品人妻一区二区| 亚洲高清中文字幕| 国产三级视频在线播放线观看| 国产精品主播视频| 亚洲一本视频| 怡红院一区二区三区| 欧美一区二区在线免费观看| 成入视频在线观看| 亚洲图片在线观看| av日韩在线网站| 啪啪小视频网站| 久久6精品影院| 精品视频亚洲| 亚洲女则毛耸耸bbw| 欧美图区在线视频| heyzo在线欧美播放|