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

Nacos或者Config是怎么實現配置熱刷新的?

開發 前端
文中大致介紹實現技術的關鍵點,以及如何模仿造個簡易輪子(造輪子很重要,只有自己想著造輪子,才會問出很多原理問題),具體源碼細節,請拿著文中的關鍵詞自行google,然后跟著debug即可。
本文轉載自微信公眾號「Java大廠面試官」,作者laker。轉載本文請聯系Java大廠面試官公眾號。 laker  
  • 前言
  • 問題1. 如何實現配置熱刷新
    • 1. @RefreshScope原理
    • 2. ContextRefresher.refresh()
    • 3. RefreshScope.refreshAll()
    • 4. 模擬造輪子
  • 問題2. Nacos客戶端如何實時監聽到Nacos服務端配置更新了
    • 1. Apollo 實現方式
    • 2. 什么是DeferredResult
    • 3. 模擬造輪子
  • 總結

前言

文中大致介紹實現技術的關鍵點,以及如何模仿造個簡易輪子(造輪子很重要,只有自己想著造輪子,才會問出很多原理問題),具體源碼細節,請拿著文中的關鍵詞自行google,然后跟著debug即可。

問題1. 如何實現配置熱刷新重點 Nacos原理:

  • 1.在需要熱刷新的Bean上使用Spring Cloud原生注解 @RefreshScope
  • 2.當有配置更新的時候調用contextRefresher.refresh()

代碼如下:

  1. @RestController 
  2. @RequestMapping("/config"
  3. @RefreshScope // 重點 
  4. public class ConfigController { 
  5.     @Value("${laker.name}") // 待刷新的屬性 
  6.     private String lakerName; 
  7.     @RequestMapping("/get"
  8.     public String get() { 
  9.         return lakerName; 
  10.     } 
  11.  ... 

1. @RefreshScope原理

@RefreshScope位于spring-cloud-context,源碼注釋如下:

可將@Bean定義放入org.springframework.cloud.context.scope.refresh.RefreshScope中。用這種方式注解的Bean可以在運行時刷新,并且使用它們的任何組件都將在下一個方法調用前獲得一個新實例,該實例將完全初始化并注入所有依賴項。

要清楚RefreshScope,先要了解Scope

Scope(org.springframework.beans.factory.config.Scope)是Spring 2.0開始就有的核心的概念

RefreshScope(org.springframework.cloud.context.scope.refresh), 即@Scope("refresh")是spring cloud提供的一種特殊的scope實現,用來實現配置、實例熱加載。

類似的有:

  • RequestScope:是從當前web request中獲取實例的實例
  • SessionScope:是從Session中獲取實例的實例
  • ThreadScope:是從ThreadLocal中獲取的實例

RefreshScope是從內建緩存中獲取的。

2. ContextRefresher.refresh()

當有配置更新的時候,觸發ContextRefresher.refresh

RefreshScope 刷新過程

入口在ContextRefresher.refresh

  1. public synchronized Set<String> refresh() { 
  2. ①  Map<String, Object> before = extract(this.context.getEnvironment().getPropertySources()); 
  3. ②  updateEnvironment(); 
  4. ④  Set<String> keys = changes(before, ③extract(this.context.getEnvironment().getPropertySources())).keySet(); 
  5. ⑤  this.context.publishEvent(new EnvironmentChangeEvent(this.context, keys)); 
  6. ⑥       this.scope.refreshAll(); 

①提取標準參數(SYSTEM,JNDI,SERVLET)之外所有參數變量

②把原來的Environment里的參數放到一個新建的Spring Context容器下重新加載,完事之后關閉新容器(重點:可以去debug跟蹤下,實際上是重啟了個SpringApplication)

③提起更新過的參數(排除標準參數)

④比較出變更項

⑤發布環境變更事件

⑥RefreshScope用新的環境參數重新生成Bean,重新生成的過程很簡單,清除refreshscope緩存幷銷毀Bean,下次就會重新從BeanFactory獲取一個新的實例(該實例使用新的配置)

3. RefreshScope.refreshAll()

RefreshScope.refreshAll方法實現,即上面的第⑥步調用:

  1. public void refreshAll() { 
  2.   super.destroy(); 
  3.   this.context.publishEvent(new RefreshScopeRefreshedEvent()); 

RefreshScope類中有一個成員變量 cache,用于緩存所有已經生成的 Bean,在調用 get 方法時嘗試從緩存加載,如果沒有的話就生成一個新對象放入緩存,并通過 getBean 初始化其對應的 Bean:

  1. public Object get(String name, ObjectFactory<?> objectFactory) { 
  2.  BeanLifecycleWrapper value = this.cache.put(name, new BeanLifecycleWrapper(name, objectFactory)); 
  3.  this.locks.putIfAbsent(name, new ReentrantReadWriteLock()); 
  4.  try { 
  5.   return value.getBean(); 
  6.  } 
  7.  catch (RuntimeException e) { 
  8.   this.errors.put(name, e); 
  9.   throw e; 
  10.  } 

所以在銷毀時只需要將整個緩存清空,下次獲取對象時自然就可以重新生成新的對象,也就自然綁定了新的屬性:

  1. public void destroy() { 
  2.  List<Throwable> errors = new ArrayList<Throwable>(); 
  3.  Collection<BeanLifecycleWrapper> wrappers = this.cache.clear(); 
  4.  for (BeanLifecycleWrapper wrapper : wrappers) { 
  5.   try { 
  6.    Lock lock = this.locks.get(wrapper.getName()).writeLock(); 
  7.    lock.lock(); 
  8.    try { 
  9.     wrapper.destroy(); 
  10.    } 
  11.    finally { 
  12.     lock.unlock(); 
  13.    } 
  14.   } 
  15.   catch (RuntimeException e) { 
  16.    errors.add(e); 
  17.   } 
  18.  } 
  19.  if (!errors.isEmpty()) { 
  20.   throw wrapIfNecessary(errors.get(0)); 
  21.  } 
  22.  this.errors.clear(); 

清空緩存后,下次訪問對象時就會重新創建新的對象并放入緩存了。

而在清空緩存后,它還會發出一個 RefreshScopeRefreshedEvent 事件,在某些 Spring Cloud 的組件中會監聽這個事件并作出一些反饋。

4. 模擬造輪子

這里我們就可以模擬造個熱更新的輪子了;

代碼以及配置如下:

  • 項目依賴spring-cloud-context
  1. <dependency> 
  2.   <groupId>org.springframework.cloud</groupId> 
  3.   <artifactId>spring-cloud-context</artifactId> 
  4. </dependency> 
  • 配置bean
  1. @Component 
  2. @RefreshScope 
  3. public class User { 
  4.     @Value("${laker.name}"
  5.     private String name
  6.     ... 
  • 刷新接口以及查看接口
  1. @RestController 
  2. @RequestMapping("/config"
  3. public class ConfigController { 
  4.     @Autowired 
  5.     User user
  6.     @Autowired 
  7.     ContextRefresher contextRefresher; 
  8.     @RequestMapping("/get"
  9.     public String get() { 
  10.         return user.getName(); 
  11.     } 
  12.     @RequestMapping("/refresh"
  13.     public String[] refresh() { 
  14.         Set<String> keys = contextRefresher.refresh(); 
  15.         return keys.toArray(new String[keys.size()]); 
  16.     } 
  • application.yml
  1. laker: 
  2.   name: laker 

操作流程如下:

1.瀏覽器http://localhost:8080/config/get - 瀏覽器結果:laker

2.修改application.yml里面內容為:

  1. laker: 
  2.   name: lakerupdate 

3.瀏覽器http://localhost:8080/config/refresh - 瀏覽器結果:laker.name

4.瀏覽器http://localhost:8080/config/get - 瀏覽器結果:lakerupdate(未重新啟動,實現了配置更新)

問題2. Nacos客戶端如何實時監聽到Nacos服務端配置更新了

這里可以去看下Nacos源碼,使用的是長輪詢,什么是長輪詢以及其其他替代協議?

  • RocketMQ
  • Nacos
  • Apollo
  • Kafka

自己花了幾個小時去看Nacos長輪詢源碼,太多了不太好理解,有興趣的自行google。一般我們都是基于Spring Boot的后臺了,各種google后,發現Apollo實現較為簡單,所以直接拿Apollo的代碼借鑒。

1. Apollo 實現方式

實現方式如下:

  1. 客戶端會發起一個Http請求到Config Service的notifications/v2接口,也就是NotificationControllerV2,參見RemoteConfigLongPollService
  2. NotificationControllerV2不會立即返回結果,而是通過Spring DeferredResult把請求掛起
  3. 如果在60秒內沒有該客戶端關心的配置發布,那么會返回Http狀態碼304給客戶端
  4. 如果有該客戶端關心的配置發布,NotificationControllerV2會調用DeferredResult的setResult方法,傳入有配置變化的namespace信息,同時該請求會立即返回。客戶端從返回的結果中獲取到配置變化的namespace后,會立即請求Config Service獲取該namespace的最新配置。

解讀下:

  • 關鍵詞DeferredResult,使用這個特性來實現長輪詢
  • 超時返回的時候,是返回的狀態碼Http Code 304

釋義:自從上次請求后,請求的網頁未修改過。服務器返回此響應時,不會返回網頁內容,進而節省帶寬和開銷。

2. 什么是DeferredResult

異步支持是在Servlet 3.0中引入的,簡單來說,它允許在請求接收器線程之外的另一個線程中處理HTTP請求。

從Spring 3.2開始可用的DeferredResult有助于將長時間運行的計算從http-worker線程卸載到單獨的線程。

盡管另一個線程將占用一些資源來進行計算,但不會阻止工作線程,并且可以處理傳入的客戶端請求。

異步請求處理模型非常有用,因為它有助于在高負載期間很好地擴展應用程序,尤其是對于IO密集型操作。

DeferredResult是對異步Servlet的封裝

具體可以參考我在CSDN寫的Spring Boot 使用DeferredResult實現長輪詢

這里借助互聯網上的一個圖就更清晰些。

Servlet異步流程圖

 

接收到request請求之后,由tomcat工作線程從HttpServletRequest中獲得一個異步上下文AsyncContext對象,然后由tomcat工作線程把AsyncContext對象傳遞給業務處理線程,同時tomcat工作線程歸還到工作線程池,這一步就是異步開始。在業務處理線程中完成業務邏輯的處理,生成response返回給客戶端。

3. 模擬造輪子

這里我們通過使用 Spring Boot 來簡單的模擬一下如何通過 Spring Boot DeferredResult 來實現長輪詢服務推送的。

代碼如下,僅供參考:

  1. /** 
  2.  * 模擬Config Service通知客戶端的長輪詢實現原理 
  3.  */ 
  4. @RestController 
  5. @RequestMapping("/config"
  6. public class LakerConfigController { 
  7.     private final Logger logger = LoggerFactory.getLogger(this.getClass()); 
  8.     //guava中的Multimap,多值map,對map的增強,一個key可以保持多個value 
  9.     private Multimap<String, DeferredResult<String>> watchRequests = Multimaps.synchronizedSetMultimap(HashMultimap.create()); 
  10.     /** 
  11.      * 模擬長輪詢 
  12.      */ 
  13.     @RequestMapping(value = "/get/{dataId}"
  14.     public DeferredResult<String> watch(@PathVariable("dataId") String dataId) { 
  15.         logger.info("Request received"); 
  16.         ResponseEntity<String> 
  17.                 NOT_MODIFIED_RESPONSE = new ResponseEntity<>(HttpStatus.NOT_MODIFIED); 
  18.         // 超時時間30s 返回 304 狀態碼告訴客戶端當前命名空間的配置文件并沒有更新 
  19.         DeferredResult<String> deferredResult = new DeferredResult<>(30 * 1000L, NOT_MODIFIED_RESPONSE); 
  20.         //當deferredResult完成時(不論是超時還是異常還是正常完成),移除watchRequests中相應的watch key 
  21.         deferredResult.onCompletion(() -> { 
  22.             logger.info("remove key:" + dataId); 
  23.             watchRequests.remove(dataId, deferredResult); 
  24.         }); 
  25.         deferredResult.onTimeout(() -> { 
  26.             logger.info("onTimeout()"); 
  27.         }); 
  28.         watchRequests.put(dataId, deferredResult); 
  29.         logger.info("Servlet thread released"); 
  30.         return deferredResult; 
  31.     } 
  32.     /** 
  33.      * 模擬發布配置 
  34.      */ 
  35.     @RequestMapping(value = "/update/{dataId}"
  36.     public Object publishConfig(@PathVariable("dataId") String dataId) { 
  37.         if (watchRequests.containsKey(dataId)) { 
  38.             Collection<DeferredResult<String>> deferredResults = watchRequests.get(dataId); 
  39.             Long time = System.currentTimeMillis(); 
  40.             //通知所有watch這個namespace變更的長輪訓配置變更結果 
  41.             for (DeferredResult<String> deferredResult : deferredResults) { 
  42.                 //deferredResult一旦執行了setResult()方法,就說明DeferredResult正常完成了,會立即把結果返回給客戶端 
  43.                 deferredResult.setResult(dataId + " changed:" + time); 
  44.             } 
  45.         } 
  46.         return "success"
  47.     } 

操作流程如下:

為了簡便我用瀏覽器模擬,實際用Java Http Client,例如:okhttp、Apache http client等

正常流程:

  • client1瀏覽器http://localhost:8080/config/get/laker,阻塞中ing
  • client2瀏覽器http://localhost:8080/config/update/laker,返回success
  • client1瀏覽器http://localhost:8080/config/get/laker,返回laker changed:1611022736865

超時流程:

  • client1瀏覽器http://localhost:8080/config/get/laker,阻塞中ing
  • 30s后
  • client1瀏覽器,返回http code 304

在這里插入圖片描述

 

總結

  • Nacos使用長輪詢解決了實時監聽遠端配置變更
  • Nacos使用spring-cloud-context的@RefreshScope和ContextRefresher.refresh實現了配置熱刷新

參考:

 

  • https://ctripcorp.github.io/apollo/#/zh/README
  • https://blog.csdn.net/liuccc1/article/details/87002916
  • https://blog.csdn.net/wangxindong11/article/details/78591396
  • https://blog.csdn.net/u012410733/article/details/107119457
  • https://www.cnblogs.com/javastack/p/12049139.html

 

責任編輯:武曉燕 來源: Java大廠面試官
相關推薦

2022-06-15 16:35:02

配置共享Nacos

2021-09-22 05:55:18

Eslint disble算法

2023-09-12 13:12:23

服務器系統

2021-07-02 22:23:50

Nacos配置模型

2025-07-30 07:34:58

2023-02-12 21:47:47

NacosRabbitMQ消費者

2022-11-21 10:49:29

Nacos配置加密

2024-05-27 09:52:00

Nacos加密配置

2024-05-31 09:31:00

2021-08-03 08:35:36

Vuex數據熱更新

2024-09-18 13:49:42

2009-02-17 18:52:06

網絡虛擬化路由系統數據中心

2021-08-30 22:38:47

VscodeMarkdown預覽

2021-06-29 07:04:38

Nacos服務配置

2012-03-28 22:16:54

蘋果

2022-06-13 09:58:06

NacosSpring

2021-08-23 06:59:22

Nacos負載均衡客戶端

2021-06-10 06:57:39

Nacos配置模塊

2021-08-09 07:58:36

Nacos 服務注冊源碼分析

2021-09-07 09:18:18

Kubernetes負載均衡服務發現
點贊
收藏

51CTO技術棧公眾號

69堂成人精品免费视频| 99这里只有精品| 久久韩剧网电视剧| 久久久久久久久久影视| 2022成人影院| 最新日韩av在线| 国产三区二区一区久久| 精品国产青草久久久久96| 国产精品xvideos88| 精品国产乱码久久久久久免费| 久久精品99国产| 色av手机在线| 国产亚洲一二三区| 电影午夜精品一区二区三区| 中文字幕欧美人妻精品| 亚洲国产黄色| 久久成年人视频| 亚洲自拍偷拍图| 精品少妇3p| 制服丝袜亚洲播放| wwwwxxxx日韩| 一级毛片久久久| 亚洲丶国产丶欧美一区二区三区| 一区二区三区在线观看www| 天堂av中文在线资源库| 国产高清不卡一区| 国产精品视频区1| 欧美一级特黄视频| 国产精品chinese| 三级精品视频久久久久| 免费黄色在线视频| 一区二区三区亚洲变态调教大结局| 欧美日韩和欧美的一区二区| 成人在线激情网| 免费毛片b在线观看| 亚洲一区二区三区在线看| 亚洲激情一区二区三区| 九色在线播放| 91久色porny| 国产在线欧美日韩| 欧美 日韩 国产 成人 在线 91| 精品一区二区三区在线视频| 国产精品美女999| 日韩精品在线一区二区三区| 久久午夜精品一区二区| 欧美在线一级va免费观看| 亚洲视频免费播放| 亚洲久久一区| 欧美一级成年大片在线观看| 国产成人一区二区三区影院在线| 激情av一区| 久久露脸国产精品| 国产又大又黑又粗免费视频| 最新成人av网站| 97在线视频免费观看| 久久午夜鲁丝片午夜精品| 国产精品啊啊啊| 国内揄拍国内精品少妇国语| 久久久午夜影院| 亚洲欧美一二三区| 成人免费网站www网站高清| 五月激情综合婷婷| 一本久道高清无码视频| 丁香花在线影院| 亚洲第一av色| 黄色免费观看视频网站| 亚洲人体视频| 欧美在线影院一区二区| 日韩va在线观看| 日韩精品一级| 亚洲黄一区二区| 人妻体内射精一区二区| 欧美一级本道电影免费专区| 日韩亚洲一区二区| 妺妺窝人体色www在线下载| 一区在线视频| 国产精品 欧美在线| 中文字幕一级片| 国产馆精品极品| 国产欧美欧洲| gogogo高清在线观看免费完整版| 日韩理论片中文av| 免费一级特黄特色毛片久久看| 亚洲国产欧美日本视频| 欧美精品乱码久久久久久| 又黄又爽又色的视频| 久久久久久久久久久久久久久久久久久久| 亚洲欧美精品在线| 爱爱视频免费在线观看| 妖精视频成人观看www| 国产精品高潮在线| 高h放荡受浪受bl| 久久精品视频免费| 日韩a级黄色片| 欧美××××黑人××性爽| 欧美一区二区三区不卡| 亚洲国产天堂av| 欧美色综合网| 国产精品福利网| 人妻精品一区一区三区蜜桃91| 中文一区一区三区高中清不卡| 97免费视频观看| www.26天天久久天堂| 精品国产伦一区二区三区免费 | 免费在线观看黄网站| 青青草97国产精品免费观看无弹窗版 | 国产成人免费av在线| 视频一区视频二区视频三区视频四区国产 | 中文永久免费观看| jvid福利写真一区二区三区| 在线观看日本一区| 国产欧美一区二区三区精品酒店| 制服丝袜一区二区三区| 亚洲黄色免费视频| av不卡在线| 国产精品一区二| 1stkiss在线漫画| 欧美午夜精品久久久久久超碰 | 污网站在线免费| 中文字幕伦av一区二区邻居| 国产做受69高潮| 99久久婷婷国产一区二区三区| 国产情人综合久久777777| 国产无限制自拍| 日本一区二区三区播放| 丝袜美腿精品国产二区| 成年人晚上看的视频| aaa欧美日韩| 久久亚洲精品无码va白人极品| 成人短视频软件网站大全app| 在线播放日韩精品| 7799精品视频天天看| 久久午夜电影网| 日韩免费一级视频| 国产伦理久久久久久妇女| 欧美黄色性视频| 精品久久无码中文字幕| 日韩码欧中文字| 一级做a免费视频| 999国产精品999久久久久久| 国产欧美欧洲在线观看| 成年人视频在线观看免费| 在线观看网站黄不卡| 中文字幕 自拍| 日韩国产欧美视频| 亚洲草草视频| 欧美亚洲二区| 久久香蕉国产线看观看av| 99热这里只有精品5| 亚洲激情图片一区| 久久久久99人妻一区二区三区| 欧美私人啪啪vps| 国产精品theporn88| a国产在线视频| 国产视频精品在线| 久久午夜鲁丝片| 国产精品国产三级国产普通话蜜臀 | 欧美aaaaaaaa| 久久精品国产亚洲精品| 性色av蜜臀av| 午夜精品久久久久| 91视频免费观看网站| 日韩不卡在线观看日韩不卡视频| 亚洲免费在线精品一区| 9999在线精品视频| 欧美肥婆姓交大片| 亚洲 国产 欧美 日韩| 色素色在线综合| 天堂网av2018| 国产成人av电影在线播放| 欧美极品欧美精品欧美| 国产欧美日韩精品一区二区免费 | 中文字幕日韩一区| 精品人妻二区中文字幕| 久久久噜噜噜| 丰满女人性猛交| 国产伦精品一区二区三区免费优势| 日本精品久久久久影院| 三区四区在线视频| 精品国产伦理网| 波多野结衣一本一道| 亚洲男人的天堂一区二区| 欧美成人三级伦在线观看| 秋霞电影一区二区| 日韩国产小视频| 精品免费视频| 翡翠波斯猫1977年美国| 一区二区视频免费完整版观看| 久久成人精品一区二区三区| 视频一区二区在线播放| 91麻豆精品国产综合久久久久久| 日韩av免费网址| 中文字幕亚洲欧美在线不卡| 精品视频站长推荐| 韩国三级电影一区二区| 国产欧美在线一区| 亚洲国产老妈| 日韩中文一区二区三区| 国产精品zjzjzj在线观看| 国产精品一区=区| 少妇视频在线观看| 色综合91久久精品中文字幕 | 性欧美videossex精品| 韩日精品视频| 亚洲图片欧洲图片日韩av| 欧美freesex8一10精品| 91在线观看免费网站| 日韩大尺度黄色| 高清一区二区三区日本久| 国产福利小视频在线| 亚洲高清一区二| 国产亲伦免费视频播放| 日本福利一区二区| 中文字幕日韩一级| 亚洲综合区在线| 欧美性x x x| 欧美激情一二三区| 日本一区二区三区网站| 成人精品鲁一区一区二区| 色天使在线观看| 日本亚洲视频在线| 激情综合网婷婷| 一本色道久久综合一区| 国产精品日韩三级| 午夜亚洲福利| 黄色网络在线观看| 亚洲破处大片| dy888午夜| 午夜精品一区二区三区国产| 亚洲欧美综合一区| 欧美丝袜丝交足nylons172| 欧美成人一区二区在线| 日韩av不卡一区| 狠狠色综合色区| 欧美亚洲色图校园春色| 国产女人水真多18毛片18精品| 国产精品毛片久久久| 成人18视频| 高潮按摩久久久久久av免费| 国产精品swag| 牛牛影视久久网| 久久国产一区二区| 伊人久久大香线蕉综合网站 | 亚洲精品小说| 免费成人进口网站| 欧美在线不卡| 久久亚洲国产成人精品无码区| 欧美日韩综合| 男的插女的下面视频| 在线日韩视频| 黄色网页免费在线观看| 久久国产日本精品| 日本免费观看网站| 激情五月婷婷综合| 佐山爱在线视频| 成人国产在线观看| 亚洲av片不卡无码久久| 国产免费观看久久| 一二三四在线观看视频| 亚洲欧美另类久久久精品 | 91高清在线观看| 91麻豆国产在线| 欧美电影精品一区二区| 色欲av永久无码精品无码蜜桃| 亚洲人成免费电影| aaa在线免费观看| 久久亚洲成人精品| 俺来俺也去www色在线观看| 5252色成人免费视频| 一区在线影院| 5g国产欧美日韩视频| 另类ts人妖一区二区三区| 日产精品一线二线三线芒果| 色小子综合网| 国产精品无码人妻一区二区在线| 三级欧美韩日大片在线看| 日韩在线一区视频| 成人不卡免费av| 亚洲精品视频网址| 一区二区三区在线视频播放| 五月婷婷色丁香| 欧美日韩三级视频| 少妇喷水在线观看| 中文字幕亚洲一区在线观看 | 亚洲地区一二三色| 一本色道久久综合无码人妻| 精品久久一区二区| 在线免费黄色| 97久久国产精品| 91成人福利社区| 久久精品二区| 久久久久久影院| 久久久噜噜噜www成人网| 国产综合色产在线精品| 黄色在线观看av| 有码一区二区三区| 日本丰满少妇做爰爽爽| 精品久久国产97色综合| 9色在线观看| 欧美一区在线直播| 日韩精品一区国产| 亚洲成人在线视频网站| 亚洲三级毛片| 日本少妇一区二区三区| 国产视频一区二区在线| 日韩黄色三级视频| 欧美一区二区三区思思人| 欧美zzoo| 5566成人精品视频免费| 亚洲一二三区视频| 亚洲午夜在线观看| 免费亚洲一区| 国产成人av无码精品| 亚洲色图.com| 一级特黄aaaaaa大片| 亚洲精品国产电影| 毛片在线导航| 亚洲专区在线视频| 欧美r级电影| 日韩一级理论片| 久久夜色精品国产欧美乱极品| 国产一级视频在线观看| 6080亚洲精品一区二区| 在线观看黄av| 国产精品日韩精品| 亚洲婷婷伊人| 成人在线免费在线观看| 成人高清免费观看| 久久精品国产亚洲AV无码麻豆| 91精品国产一区二区三区蜜臀 | 日韩av不卡在线| 久久婷婷国产| 欧美二区在线视频| 91亚洲精品久久久蜜桃| 中文字幕在线观看免费视频| 亚洲高清不卡av| 蜜桃av在线| 精品视频第一区| 久久不射中文字幕| 精品成人av一区二区三区| 午夜成人在线视频| 亚洲AV第二区国产精品| 国产91ⅴ在线精品免费观看| 青青操综合网| 欧美日韩在线免费播放| 欧美极品另类videosde| 中文字幕av影视| 久久精品电影网| 日韩中文一区二区| 久久99久久99精品| aaa国产一区| 日韩黄色一级视频| 色视频www在线播放国产成人| 四虎精品在线观看| 久久免费一级片| 高清在线观看日韩| 国产大片aaa| 日韩精品中文字幕视频在线| 毛片无码国产| 免费观看黄色大片| 国产99久久久国产精品| 在线观看黄网站| 中文字幕精品网| 免费一级欧美在线大片 | 美日韩一区二区三区| 国产高清视频免费在线观看| 欧美成人一区二区三区片免费| 丰满诱人av在线播放| 蜜桃日韩视频| 久久福利视频一区二区| 青青草原免费观看| 国产丝袜一区视频在线观看 | 精品高清视频| 日韩精品每日更新| 黑鬼狂亚洲人videos| 亚洲国产成人在线播放| 日韩制服诱惑| 台湾无码一区二区| 国产亚洲精品福利| av中文字幕播放| 欧日韩在线观看| 91精品综合| 成人免费av片| 欧美一区二区三区四区高清| 亚洲精品动漫| 中国老女人av| 久久久精品蜜桃| 国产福利资源在线| 国产精品白嫩美女在线观看| 欧美+日本+国产+在线a∨观看| 法国伦理少妇愉情| 日韩一区二区精品| 精品欧美日韩精品| 97超碰在线人人| 中文字幕制服丝袜成人av| 性感美女一级片| 99r国产精品视频| 男女男精品视频| 国产精品xxxx喷水欧美| 九九热这里只有精品6|