精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

jvid一区二区三区| 精品国产无码一区二区三区| 欧美**vk| 欧美日韩综合在线| 午夜在线视频免费观看| 日本激情视频网站| 美女网站视频久久| 久久久久久91| 69xxx免费| 99久久人爽人人添人人澡| 亚洲成人手机在线| 先锋影音日韩| 亚洲男人第一天堂| 免费高清在线视频一区·| 欧美精品成人在线| 麻豆视频免费在线播放| 国产精品中文字幕制服诱惑| 欧美日韩在线播| 少妇人妻在线视频| 精品视频在线一区二区| 成人av影院在线| 成人两性免费视频| 麻豆精品久久久久久久99蜜桃| 久久久久久久久99精品大| 精品网站999www| 欧美xxxxxbbbbb| 电影亚洲精品噜噜在线观看| 亚洲一区二区美女| 日本三日本三级少妇三级66| 国产中文在线观看| 99精品视频在线免费观看| 成人在线一区二区| 99re热视频| 国产欧美一区二区色老头| 久久影视免费观看| 亚洲色图27p| 精品日韩毛片| 日韩毛片在线看| 东京热av一区| 视频二区欧美| 欧美一级在线免费| 天堂av8在线| 久久精品资源| 欧美午夜免费电影| 色七七在线观看| 最新日韩三级| 色丁香久综合在线久综合在线观看| 黄色一级片在线看| 久久青青色综合| 一区二区三区免费观看| 黄色网络在线观看| gogo在线观看| 亚洲老妇xxxxxx| 法国空姐在线观看免费| 成年人黄视频在线观看| 亚洲欧美另类久久久精品 | 日本成人中文| 亚洲国产精品嫩草影院久久| 在线免费看黄色片| 久久久久久久久久久久久久久久久久久久 | 99re这里只有精品首页| 精品国产乱码久久久久久郑州公司| 人妻妺妺窝人体色www聚色窝| 成人白浆超碰人人人人| 久久99精品国产99久久| 噜噜噜噜噜在线视频| 日本一区二区三区视频视频| 亚洲精品一区二区三| 黄网站免费在线观看| 亚洲视频免费在线| 国产精品69久久久| 小视频免费在线观看| 在线亚洲高清视频| 激情久久综合网| 电影一区二区在线观看| 日韩电影免费观看中文字幕| 国产肥白大熟妇bbbb视频| 色综合久久一区二区三区| 久久久精品一区二区| 久久精品久久国产| 国产精品综合| 91精品视频在线看| 东京干手机福利视频| 久久综合成人精品亚洲另类欧美| 亚洲精品美女久久7777777| √天堂8在线网| 欧美日韩亚洲91| 中文字幕 日韩 欧美| 99国产精品久久一区二区三区| 国产午夜精品久久久| 韩国一级黄色录像| 亚洲美洲欧洲综合国产一区| 国产精品久久久久久久app| a级片在线播放| 97精品国产露脸对白| 亚洲日本japanese丝袜| wwww亚洲| 精品视频123区在线观看| 成人一区二区三区仙踪林| 九九热精品视频在线观看| 久久伊人精品天天| 潘金莲一级淫片aaaaaa播放| 国产精品一二三在| 欧美高清视频一区| 亚洲精品白浆| 欧美日免费三级在线| 给我免费观看片在线电影的| 国产高清久久| 清纯唯美日韩制服另类| 国产高清精品软件丝瓜软件| 国产日韩三级在线| 日韩av高清在线看片| 日韩毛片网站| 伊人av综合网| 国产在线观看黄色| 国产91丝袜在线播放0| 中文字幕中文字幕在线中心一区| 中文字幕在线高清| 欧美v国产在线一区二区三区| 美女网站视频色| 久久久夜夜夜| 国产日韩精品推荐| 国产秀色在线www免费观看| 色视频一区二区| 第四色在线视频| 欧美成人高清| 91免费国产网站| 在线视频三区| 欧美亚一区二区| 精品少妇人妻一区二区黑料社区 | 亚洲欧美在线看| 国产精品一区二区欧美| jizz在线观看视频| 懂色av影视一区二区三区| 国产成人美女视频| 成人直播大秀| 国产精品99免视看9| 四虎在线视频| 欧美日韩亚洲一区二区| 日韩精品人妻中文字幕有码| 欧美 日韩 国产一区二区在线视频 | 国产在线观看h| 亚洲免费网址| 欧美激情www| 波多野结衣久久精品| 精品中文视频在线| 四虎成人永久免费视频| 久久综合色天天久久综合图片| 18禁网站免费无遮挡无码中文| 国产+成+人+亚洲欧洲在线| 欧美成在线视频| 亚洲成人第一区| 亚洲综合在线观看视频| 91精产国品一二三| 伊人成人网在线看| 精品一区二区三区免费毛片| 卡通欧美亚洲| 在线播放国产精品| 波多野结衣在线观看一区| 中文字幕久久午夜不卡| 天天操天天干天天做| 最新国产精品| 国产无套精品一区二区| 中文字幕这里只有精品| 中文欧美日本在线资源| 91午夜交换视频| 一区二区三区日韩欧美| 波多野结衣影院| 久久亚洲视频| 在线一区日本视频| 香蕉免费一区二区三区在线观看| 久久久免费高清电视剧观看| 男人的天堂在线免费视频| 欧美色精品在线视频| 国产一二三四区| proumb性欧美在线观看| 国产男女激情视频| 亚洲高清影视| 精品一区2区三区| 色噜噜成人av在线| 欧美精品久久久久久久| 麻豆导航在线观看| 欧美一级欧美三级在线观看| av大片免费观看| 国产精品免费av| 特级特黄刘亦菲aaa级| 日韩专区在线视频| 日韩成人午夜影院| 一本色道久久综合亚洲精品酒店| 国产自摸综合网| 国产污视频在线播放| 中文字幕一区二区精品| 无码国产伦一区二区三区视频 | 日韩欧美精品中文字幕| 国产精品suv一区二区88| 成人成人成人在线视频| 日韩在线一区视频| 在线亚洲免费| 亚洲小视频在线播放| 国产不卡一二三区| 91在线观看网站| 韩日一区二区| 91av视频在线观看| 最新av在线播放| 亚洲一级一级97网| 人妻一区二区三区免费| 欧美日韩精品电影| 麻豆精品久久久久久久99蜜桃| 亚洲综合精品自拍| 91在线在线观看| 高清视频在线观看三级| zzjj国产精品一区二区| 欧美午夜黄色| 精品国产髙清在线看国产毛片| 涩涩视频在线观看| 欧美小视频在线观看| 久久久综合久久| 亚洲视频一二三区| 91社区视频在线观看| 久久久综合九色合综国产精品| 国产成人av片| 国产麻豆精品在线| 超碰人人草人人| 久久9热精品视频| 国产精品乱码久久久久| 亚洲尤物在线| 青青青免费在线| 亚洲无毛电影| 国产制服91一区二区三区制服| 久久精品国产大片免费观看| 日韩精品一区二区三区外面 | 久久婷婷国产麻豆91| 亚洲日本丝袜连裤袜办公室| 青青操在线播放| 国产精品免费视频观看| 久久精品三级视频| 欧美国产精品中文字幕| 97在线观看免费视频| 久久久电影一区二区三区| 国产伦精品一区二区三区妓女| 波多野结衣中文字幕一区二区三区| 中文字幕一二三区| 国产成人午夜精品影院观看视频 | 中文字幕激情视频| 色先锋aa成人| 国产免费a视频| 欧美午夜在线一二页| 中文字字幕在线观看| 欧美日本国产视频| 国产女人18毛片水18精| 欧美性猛交一区二区三区精品| 中文字幕久久网| 欧美理论电影在线| 国产jzjzjz丝袜老师水多| 日韩欧美国产综合一区| 亚洲精品久久久久久久久久久久久久| 精品成人在线观看| 香蕉av在线播放| 亚洲视频在线免费观看| 91精品国产91久久久久游泳池 | 国产在线精品一区二区三区不卡| 久久6免费视频| 国产传媒一区在线| 日本一级片在线播放| 91老司机福利 在线| 毛片aaaaaa| 亚洲欧洲www| 国产精品第九页| 日韩欧美国产视频| 91麻豆国产视频| 欧美成人国产一区二区| 日韩专区一区二区| 日韩中文字幕不卡视频| 中文字幕中文字幕在线十八区 | 国产精品久久久久天堂| 青青草激情视频| 精品成人av一区| 中国一级片黄色一级片黄| 91麻豆精品国产91久久久使用方法 | 亚洲精品电影网在线观看| 国产三级视频在线看| 伦理中文字幕亚洲| 性欧美又大又长又硬| 国产精品自在线| 久久亚洲黄色| 亚洲精品成人自拍| 亚洲啪啪91| 天天干天天草天天| av爱爱亚洲一区| 人人澡人人澡人人看| 精品日韩美女的视频高清| 一级黄色片在线观看| 亚洲国产日韩欧美在线图片| 日本中文字幕电影在线免费观看| 久久久久久成人精品| 精品久久福利| 九九久久99| 自拍视频亚洲| 91看片在线免费观看| av午夜一区麻豆| 国产精品 欧美激情| 91久久奴性调教| 免费观看国产精品| 日韩网站在线观看| 中文字幕在线视频久| 国产91精品一区二区绿帽| 日韩理论电影| 成年人视频网站免费观看| 国产高清在线精品| 亚欧精品视频一区二区三区| 欧美日韩另类视频| 成人毛片视频免费看| 中文字幕v亚洲ⅴv天堂| 亚洲欧美se| 国产精品免费在线| 一个色综合网| 天天干天天操天天做| 国产调教视频一区| 国产精品视频久久久久久久| 精品奇米国产一区二区三区| 黄色免费在线观看| 国产精品女视频| 精品国产视频| 国产福利视频在线播放| 99国产精品国产精品久久| 久草视频免费在线播放| 日韩一区二区三区免费观看| 免费在线你懂的| 91精品免费久久久久久久久| 精品高清久久| av无码精品一区二区三区| 久久青草欧美一区二区三区| 日本视频免费在线| 亚洲国产精品久久久| av有码在线观看| 国产精品久久久对白| 国产一区欧美| 成人免费看片载| 亚洲国产精品欧美一二99| 亚洲欧美高清视频| 欧美精品xxx| 加勒比色老久久爱综合网| 蜜臀av色欲a片无码精品一区| 国产69精品久久99不卡| 久久精品视频久久| 亚洲经典中文字幕| 免费h在线看| 欧美精品v日韩精品v国产精品| 久久久成人网| 色婷婷国产精品免| 91精品国产综合久久福利| 成人福利在线观看视频| 国产精品久久久久久久小唯西川| 亚洲国产1区| 成人免费av片| 欧美在线啊v一区| 老司机午夜在线视频| 99re资源| 国产欧美日本| 91狠狠综合久久久久久| 欧美丰满美乳xxx高潮www| 三级福利片在线观看| 精品国产乱码久久久久久88av| 性色av一区二区怡红| 91香蕉国产视频| 欧美一区二区三区日韩| 99爱在线观看| 日本午夜一区二区三区| 国产一区在线观看视频| 国产污视频在线看| 亚洲色图15p| 精品91福利视频| 国产视频一视频二| 国产精品无圣光一区二区| 国产99视频在线| 欧洲亚洲免费在线| 91久久电影| 亚洲最大免费视频| 欧美午夜片在线观看| 好吊日av在线| 午夜精品一区二区三区在线观看| 国产在线精品一区二区夜色| 日韩精品视频在线| 91亚洲精品| 97碰在线视频| 欧美国产欧美亚州国产日韩mv天天看完整 | 蜜桃传媒在线观看免费进入 | 91精品国产自产拍在线观看蜜| 无码av免费精品一区二区三区| 色94色欧美sute亚洲线路一久| 黄色网在线免费观看| 久久国产精品久久精品国产| 久久国产精品第一页| 九一国产在线观看| 久久视频精品在线| 亚洲精品国产动漫| 中文字幕1区2区| 欧美揉bbbbb揉bbbbb| 日韩激情电影免费看| 91免费网站视频|