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

Flume架構與源碼分析-核心組件分析-2

開發 開發工具
從以上部分我們可以看出,不管是Source還是Sink都依賴Channel,那么啟動時應該先啟動Channel然后再啟動Source或Sink即可。

[[177366]]

4、整體流程

從以上部分我們可以看出,不管是Source還是Sink都依賴Channel,那么啟動時應該先啟動Channel然后再啟動Source或Sink即可。

Flume有兩種啟動方式:使用EmbeddedAgent內嵌在Java應用中或使用Application單獨啟動一個進程,此處我們已Application分析為主。

首先進入org.apache.flume.node.Application的main方法啟動:

Java代碼

  1. //1、設置默認值啟動參數、參數是否必須的    
  2. Options options = new Options();    
  3. Option option = new Option("n""name"true"the name of this agent");    
  4. option.setRequired(true);    
  5. options.addOption(option);    
  6.     
  7. option = new Option("f""conf-file"true,    
  8. "specify a config file (required if -z missing)");    
  9. option.setRequired(false);    
  10. options.addOption(option);    
  11.     
  12. //2、接著解析命令行參數    
  13. CommandLineParser parser = new GnuParser();    
  14. CommandLine commandLine = parser.parse(options, args);    
  15.     
  16. String agentName = commandLine.getOptionValue('n');    
  17. boolean reload = !commandLine.hasOption("no-reload-conf");    
  18.     
  19. if (commandLine.hasOption('z') || commandLine.hasOption("zkConnString")) {    
  20.   isZkConfigured = true;    
  21. }    
  22.     
  23. if (isZkConfigured) {    
  24.     //3、如果是通過ZooKeeper配置,則使用ZooKeeper參數啟動,此處忽略,我們以配置文件講解    
  25. else {    
  26.   //4、打開配置文件,如果不存在則快速失敗    
  27.   File configurationFile = new File(commandLine.getOptionValue('f'));    
  28.   if (!configurationFile.exists()) {    
  29.          throw new ParseException(    
  30.         "The specified configuration file does not exist: " + path);    
  31.   }    
  32.   List<LifecycleAware> components = Lists.newArrayList();    
  33.     
  34.   if (reload) { //5、如果需要定期reload配置文件,則走如下方式    
  35.     //5.1、此處使用Guava提供的事件總線    
  36.     EventBus eventBus = new EventBus(agentName + "-event-bus");    
  37.     //5.2、讀取配置文件,使用定期輪訓拉起策略,默認30s拉取一次    
  38.     PollingPropertiesFileConfigurationProvider configurationProvider =    
  39.         new PollingPropertiesFileConfigurationProvider(    
  40.           agentName, configurationFile, eventBus, 30);    
  41.     components.add(configurationProvider);    
  42.     application = new Application(components); //5.3、向Application注冊組件    
  43.     //5.4、向事件總線注冊本應用,EventBus會自動注冊Application中使用@Subscribe聲明的方法    
  44.     eventBus.register(application);    
  45.     
  46.   } else { //5、配置文件不支持定期reload    
  47.     PropertiesFileConfigurationProvider configurationProvider =    
  48.         new PropertiesFileConfigurationProvider(    
  49.           agentName, configurationFile);    
  50.     application = new Application();    
  51.     //6.2、直接使用配置文件初始化Flume組件    
  52.     application.handleConfigurationEvent(configurationProvider    
  53.       .getConfiguration());    
  54.   }    
  55. }    
  56. //7、啟動Flume應用    
  57. application.start();    
  58.     
  59. //8、注冊虛擬機關閉鉤子,當虛擬機關閉時調用Application的stop方法進行終止    
  60. final Application appReference = application;    
  61. Runtime.getRuntime().addShutdownHook(new Thread("agent-shutdown-hook") {    
  62.   @Override    
  63.   public void run() {    
  64.     appReference.stop();    
  65.   }    
  66. });    

以上流程只提取了核心代碼中的一部分,比如ZK的實現直接忽略了,而Flume啟動大體流程如下:

1、讀取命令行參數;

2、讀取配置文件;

3、根據是否需要reload使用不同的策略初始化Flume;如果需要reload,則使用Guava的事件總線實現,Application的handleConfigurationEvent是事件訂閱者,PollingPropertiesFileConfigurationProvider是事件發布者,其會定期輪訓檢查文件是否變更,如果變更則重新讀取配置文件,發布配置文件事件變更,而handleConfigurationEvent會收到該配置變更重新進行初始化;

4、啟動Application,并注冊虛擬機關閉鉤子。

handleConfigurationEvent方法比較簡單,首先調用了stopAllComponents停止所有組件,接著調用startAllComponents使用配置文件初始化所有組件:

Java代碼

  1. @Subscribe    
  2. public synchronized void handleConfigurationEvent(MaterializedConfiguration conf) {    
  3.   stopAllComponents();    
  4.   startAllComponents(conf);    
  5. }     

MaterializedConfiguration存儲Flume運行時需要的組件:Source、Channel、Sink、SourceRunner、SinkRunner等,其是通過ConfigurationProvider進行初始化獲取,比如PollingPropertiesFileConfigurationProvider會讀取配置文件然后進行組件的初始化。

對于startAllComponents實現大體如下:

Java代碼

  1. //1、首先啟動Channel    
  2. supervisor.supervise(Channels,    
  3.       new SupervisorPolicy.AlwaysRestartPolicy(), LifecycleState.START);    
  4. //2、確保所有Channel是否都已啟動    
  5. for(Channel ch: materializedConfiguration.getChannels().values()){    
  6.   while(ch.getLifecycleState() != LifecycleState.START    
  7.       && !supervisor.isComponentInErrorState(ch)){    
  8.     try {    
  9.       Thread.sleep(500);    
  10.     } catch (InterruptedException e) {    
  11.         Throwables.propagate(e);    
  12.     }    
  13.   }    
  14. }    
  15. //3、啟動SinkRunner    
  16. supervisor.supervise(SinkRunners,      
  17. new SupervisorPolicy.AlwaysRestartPolicy(), LifecycleState.START);    
  18. //4、啟動SourceRunner    
  19. supervisor.supervise(SourceRunner,    
  20. new SupervisorPolicy.AlwaysRestartPolicy(), LifecycleState.START);    
  21. //5、初始化監控服務    
  22. this.loadMonitoring();    

從如下代碼中可以看到,首先要準備好Channel,因為Source和Sink會操作它,對于Channel如果初始化失敗則整個流程是失敗的;然后啟動SinkRunner,先準備好消費者;接著啟動SourceRunner開始進行采集日志。此處我們發現有兩個單獨的組件LifecycleSupervisor和MonitorService,一個是組件守護哨兵,一個是監控服務。守護哨兵對這些組件進行守護,假設出問題了默認策略是自動重啟這些組件。

對于stopAllComponents實現大體如下:

Java代碼

  1. //1、首先停止SourceRunner    
  2. supervisor.unsupervise(SourceRunners);    
  3. //2、接著停止SinkRunner    
  4. supervisor.unsupervise(SinkRunners);    
  5. //3、然后停止Channel    
  6. supervisor.unsupervise(Channels);    
  7. //4、***停止MonitorService    
  8. monitorServer.stop();     

此處可以看出,停止的順序是Source、Sink、Channel,即先停止生產,再停止消費,***停止管道。

Application中的start方法代碼實現如下:

Java代碼

  1. public synchronized void start() {    
  2.   for(LifecycleAware component : components) {    
  3.     supervisor.supervise(component,    
  4.         new SupervisorPolicy.AlwaysRestartPolicy(), LifecycleState.START);    
  5.   }    
  6. }     

其循環Application注冊的組件,然后守護哨兵對它進行守護,默認策略是出現問題會自動重啟組件,假設我們支持reload配置文件,則之前啟動Application時注冊過PollingPropertiesFileConfigurationProvider組件,即該組件會被守護哨兵守護著,出現問題默認策略自動重啟。

而Application關閉執行了如下動作:

Java代碼

  1. public synchronized void stop() {    
  2.   supervisor.stop();    
  3.   if(monitorServer != null) {    
  4.     monitorServer.stop();    
  5.   }    
  6. }     
  7.   

即關閉守護哨兵和監控服務。

到此基本的Application分析結束了,我們還有很多疑問,守護哨兵怎么實現的。

整體流程可以總結為:

1、首先初始化命令行配置;

2、接著讀取配置文件;

3、根據是否需要reload初始化配置文件中的組件;如果需要reload會使用Guava事件總線進行發布訂閱變化;

4、接著創建Application,創建守護哨兵,并先停止所有組件,接著啟動所有組件;啟動順序:Channel、SinkRunner、SourceRunner,并把這些組件注冊給守護哨兵、初始化監控服務;停止順序:SourceRunner、SinkRunner、Channel;

5、如果配置文件需要定期reload,則需要注冊Polling***ConfigurationProvider到守護哨兵;

6、***注冊虛擬機關閉鉤子,停止守護哨兵和監控服務。

輪訓實現的SourceRunner 和SinkRunner會創建一個線程進行工作,之前已經介紹了其工作方式。接下來我們看下守護哨兵的實現。

首先創建LifecycleSupervisor:

Java代碼

  1. //1、用于存放被守護的組件    
  2. supervisedProcesses = new HashMap<LifecycleAware, Supervisoree>();    
  3. //2、用于存放正在被監控的組件    
  4. monitorFutures = new HashMap<LifecycleAware, ScheduledFuture<?>>();    
  5. //3、創建監控服務線程池    
  6. monitorService = new ScheduledThreadPoolExecutor(10,    
  7.     new ThreadFactoryBuilder().setNameFormat(    
  8.         "lifecycleSupervisor-" + Thread.currentThread().getId() + "-%d")    
  9.         .build());    
  10. monitorService.setMaximumPoolSize(20);    
  11. monitorService.setKeepAliveTime(30, TimeUnit.SECONDS);    
  12. //4、定期清理被取消的組件    
  13. purger = new Purger();    
  14. //4.1、默認不進行清理    
  15. needToPurge = false;     

LifecycleSupervisor啟動時會進行如下操作:

Java代碼

  1. public synchronized void start() {    
  2.   monitorService.scheduleWithFixedDelay(purger, 2, 2, TimeUnit.HOURS);    
  3.   lifecycleState = LifecycleState.START;    
  4. }     

首先每隔兩個小時執行清理組件,然后改變狀態為啟動。而LifecycleSupervisor停止時直接停止了監控服務,然后更新守護組件狀態為STOP:

Java代碼

  1. //1、首先停止守護監控服務    
  2. if (monitorService != null) {    
  3.   monitorService.shutdown();    
  4.   try {    
  5.     monitorService.awaitTermination(10, TimeUnit.SECONDS);    
  6.   } catch (InterruptedException e) {    
  7.     logger.error("Interrupted while waiting for monitor service to stop");    
  8.   }    
  9. }    
  10. //2、更新所有守護組件狀態為STOP,并調用組件的stop方法進行停止    
  11. for (final Entry<LifecycleAware, Supervisoree> entry : supervisedProcesses.entrySet()) {    
  12.   if (entry.getKey().getLifecycleState().equals(LifecycleState.START)) {    
  13.     entry.getValue().status.desiredState = LifecycleState.STOP;    
  14.     entry.getKey().stop();    
  15.   }    
  16. }    
  17.  
  18. //3、更新本組件狀態    
  19. if (lifecycleState.equals(LifecycleState.START)) {    
  20.   lifecycleState = LifecycleState.STOP;    
  21. }     
  22. //4、***的清理    
  23.  
  24. supervisedProcesses.clear();     
  25. monitorFutures.clear();     

接下來就是調用supervise進行組件守護了:

Java代碼

  1.  if(this.monitorService.isShutdown() || this.monitorService.isTerminated()    
  2.   || this.monitorService.isTerminating()){    
  3.     //1、如果哨兵已停止則拋出異常,不再接收任何組件進行守護    
  4.   }    
  5.   //2、初始化守護組件    
  6.   Supervisoree process = new Supervisoree();    
  7.   process.status = new Status();    
  8.   //2.1、默認策略是失敗重啟    
  9.   process.policy = policy;    
  10.   //2.2、初始化組件默認狀態,大多數組件默認為START    
  11.   process.status.desiredState = desiredState;    
  12.   process.status.error = false;    
  13.   //3、組件監控器,用于定時獲取組件的***狀態,或者重新啟動組件    
  14.   MonitorRunnable monitorRunnable = new MonitorRunnable();    
  15.   monitorRunnable.lifecycleAware = lifecycleAware;    
  16.   monitorRunnable.supervisoree = process;    
  17.   monitorRunnable.monitorService = monitorService;    
  18.     
  19.   supervisedProcesses.put(lifecycleAware, process);    
  20.   //4、定期的去執行組件監控器,獲取組件***狀態,或者重新啟動組件    
  21.   ScheduledFuture<?> future = monitorService.scheduleWithFixedDelay(    
  22.       monitorRunnable, 0, 3, TimeUnit.SECONDS);    
  23.   monitorFutures.put(lifecycleAware, future);    
  24. }    

如果不需要守護了,則需要調用unsupervise:

Java代碼

  1. public synchronized void unsupervise(LifecycleAware lifecycleAware) {    
  2.   synchronized (lifecycleAware) {    
  3.     Supervisoree supervisoree = supervisedProcesses.get(lifecycleAware);    
  4.     //1.1、設置守護組件的狀態為被丟棄    
  5.     supervisoree.status.discard = true;    
  6.     //1.2、設置組件盼望的***生命周期狀態為STOP    
  7.     this.setDesiredState(lifecycleAware, LifecycleState.STOP);    
  8.     //1.3、停止組件    
  9.     lifecycleAware.stop();    
  10.   }    
  11.   //2、從守護組件中移除    
  12.   supervisedProcesses.remove(lifecycleAware);    
  13.   //3、取消定時監控組件服務    
  14.   monitorFutures.get(lifecycleAware).cancel(false);    
  15.   //3.1、通知Purger需要進行清理,Purger會定期的移除cancel的組件    
  16.   needToPurge = true;    
  17.   monitorFutures.remove(lifecycleAware);    
  18. }    

接下來我們再看下MonitorRunnable的實現,其負責進行組件狀態遷移或組件故障恢復:

Java代碼

  1. public synchronized void unsupervise(LifecycleAware lifecycleAware) {    
  2.   synchronized (lifecycleAware) {    
  3.     Supervisoree supervisoree = supervisedProcesses.get(lifecycleAware);    
  4.     //1.1、設置守護組件的狀態為被丟棄    
  5.     supervisoree.status.discard = true;    
  6.     //1.2、設置組件盼望的***生命周期狀態為STOP    
  7.     this.setDesiredState(lifecycleAware, LifecycleState.STOP);    
  8.     //1.3、停止組件    
  9.     lifecycleAware.stop();    
  10.   }    
  11.   //2、從守護組件中移除    
  12.   supervisedProcesses.remove(lifecycleAware);    
  13.   //3、取消定時監控組件服務    
  14.   monitorFutures.get(lifecycleAware).cancel(false);    
  15.   //3.1、通知Purger需要進行清理,Purger會定期的移除cancel的組件    
  16.   needToPurge = true;    
  17.   monitorFutures.remove(lifecycleAware);    
  18. }    
  19. 接下來我們再看下MonitorRunnable的實現,其負責進行組件狀態遷移或組件故障恢復:  
  20. Java代碼    
  21. public void run() {    
  22.   long now = System.currentTimeMillis();    
  23.   try {    
  24.     if (supervisoree.status.firstSeen == null) {    
  25.         supervisoree.status.firstSeen = now; //1、記錄***次狀態查看時間    
  26.     }    
  27.     supervisoree.status.lastSeen = now; //2、記錄***一次狀態查看時間    
  28.     synchronized (lifecycleAware) {    
  29.         //3、如果守護組件被丟棄或出錯了,則直接返回    
  30.         if (supervisoree.status.discard || supervisoree.status.error) {    
  31.           return;    
  32.         }    
  33.         //4、更新***一次查看到的狀態    
  34.         supervisoree.status.lastSeenState = lifecycleAware.getLifecycleState();    
  35.         //5、如果組件的狀態和守護組件看到的狀態不一致,則以守護組件的狀態為準,然后進行初始化    
  36.         if (!lifecycleAware.getLifecycleState().equals(    
  37.             supervisoree.status.desiredState)) {    
  38.           switch (supervisoree.status.desiredState) {     
  39.             case START: //6、如果是啟動狀態,則啟動組件    
  40.              try {    
  41.                 lifecycleAware.start();    
  42.               } catch (Throwable e) {    
  43.                 if (e instanceof Error) {    
  44.                   supervisoree.status.desiredState = LifecycleState.STOP;    
  45.                   try {    
  46.                     lifecycleAware.stop();    
  47.                   } catch (Throwable e1) {    
  48.                     supervisoree.status.error = true;    
  49.                     if (e1 instanceof Error) {    
  50.                       throw (Error) e1;    
  51.                     }    
  52.                   }    
  53.                 }    
  54.                 supervisoree.status.failures++;    
  55.               }    
  56.               break;    
  57.             case STOP: //7、如果是停止狀態,則停止組件    
  58.               try {    
  59.                 lifecycleAware.stop();    
  60.               } catch (Throwable e) {    
  61.                 if (e instanceof Error) {    
  62.                   throw (Error) e;    
  63.                 }    
  64.                 supervisoree.status.failures++;    
  65.               }    
  66.               break;    
  67.             default:    
  68.           }    
  69.     } catch(Throwable t) {    
  70.     }    
  71.   }    
  72. }    

如上代碼進行了一些簡化,整體邏輯即定時去采集組件的狀態,如果發現守護組件和組件的狀態不一致,則可能需要進行啟動或停止。即守護監視器可以用來保證組件如能失敗后自動啟動。默認策略是總是失敗后重啟,還有一種策略是只啟動一次。

【本文是51CTO專欄作者張開濤的原創文章,作者微信公眾號:開濤的博客,id:kaitao-1234567】

責任編輯:武曉燕 來源: 開濤的博客
相關推薦

2016-11-25 13:26:50

Flume架構源碼

2016-11-25 13:14:50

Flume架構源碼

2016-11-29 16:59:46

Flume架構源碼

2022-06-07 10:33:29

Camera組件鴻蒙

2015-04-24 09:33:11

Cloud Found組件分析PaaS

2021-09-05 07:35:58

lifecycleAndroid組件原理

2011-04-29 13:40:37

MongoDBCommand

2022-01-05 08:53:13

Spring原理分析MVC

2016-10-21 13:03:18

androidhandlerlooper

2021-09-08 10:47:33

Flink執行流程

2009-12-31 15:55:06

ADO.NET結構

2025-01-13 00:13:59

VSCode架構依賴注入

2015-08-11 15:52:52

大數據數據分析

2022-07-17 06:51:22

Vite 3.0前端

2019-10-08 10:01:22

Kafka應用場景架構

2009-06-10 13:19:21

J2EE核心APIJ2EE核心組件

2017-05-04 22:30:17

Zuul過濾器微服務

2011-05-26 10:05:48

MongoDB

2014-08-26 11:11:57

AsyncHttpCl源碼分析

2011-03-15 11:33:18

iptables
點贊
收藏

51CTO技術棧公眾號

日韩一级黄色大片| 99精品久久免费看蜜臀剧情介绍| 中文字幕精品久久久久| 手机在线视频一区| 国产777精品精品热热热一区二区| 91色porny在线视频| 国产精品情侣自拍| 久久一区二区三| 国产欧美日韩| 日韩一区二区免费高清| 日本一本二本在线观看| 成人免费看片| 久久这里都是精品| 亚洲综合在线小说| 加勒比在线一区| 欧美日本二区| 综合久久五月天| 亚洲av成人片色在线观看高潮 | 国产精品久久久久久久免费看| 欧美高清不卡| 在线视频精品一| 欧美熟妇精品一区二区蜜桃视频| 精品三级在线| 色狠狠一区二区三区香蕉| 日本精品福利视频| 日韩av中文| 久久久午夜精品| 国产伦精品一区二区三区四区视频| 中文字幕精品一区二| 亚洲精选在线| 欧美激情伊人电影| 少妇高潮在线观看| 欧美亚洲国产一区| 国产视频亚洲视频| 国产精品无码电影| 成人高潮视频| 欧美www视频| 国产乱叫456| 青青草国产一区二区三区| 欧美视频在线看| 国产精品无码人妻一区二区在线| 成人短视频在线观看| 国产精品情趣视频| 视频在线99re| 国产一区精品| 久久久www成人免费毛片麻豆 | 国语自产精品视频在线看一大j8| 欧美三级黄色大片| 99久久.com| 中文字幕亚洲色图| avhd101老司机| 国产综合久久久| 亚洲一级一级97网| 成人激情五月天| re久久精品视频| 中文字幕一区二区精品| 中文字幕免费在线看线人动作大片| 丝袜连裤袜欧美激情日韩| 亚洲精品美女在线| 四虎永久免费影院| 九九亚洲视频| 在线成人中文字幕| 小向美奈子av| 影音先锋日韩在线| 欧美激情奇米色| 国产精品美女视频| a级黄色片网站| 最新黄网在线观看| 亚洲成av人影院| 精品国产免费av| 丝袜美腿一区| 欧美日本一区二区三区四区| 99中文字幕在线| 日韩精品一区二区三区中文| 亚洲高清久久久久久| 女~淫辱の触手3d动漫| 欧美日韩在线播放视频| 久久精品视频在线观看| 久久久美女视频| 午夜亚洲精品| 国产欧美精品一区二区| a级片免费观看| 99精品一区二区三区| 欧美不卡福利| 在线观看黄av| 亚洲一卡二卡三卡四卡无卡久久| 大伊香蕉精品视频在线| 欧美成人免费电影| 日韩一区二区免费视频| 黄色录像a级片| 欧美肉体xxxx裸体137大胆| 不卡中文字幕av| 91视频免费网址| 蜜桃视频免费观看一区| 波多野结衣一区二区三区在线观看| 亚洲欧洲国产综合| 亚洲天堂成人在线观看| 国产精品裸体瑜伽视频| 亚洲不卡系列| 精品国产麻豆免费人成网站| 自拍偷拍中文字幕| 欧美一区二区三区久久精品| 欧美中文在线免费| 精品人妻一区二区三区浪潮在线| 91一区二区在线| www.午夜色| 亚洲第一二三四区| 精品国内二区三区| 亚洲最大成人综合网| 伊人久久亚洲美女图片| 国产日韩av在线播放| 人人妻人人澡人人爽久久av| 国产精品伦一区二区三级视频| 国产黄色片免费在线观看| 国产一区二区三区四区五区3d| 亚洲高清一区二| 杨钰莹一级淫片aaaaaa播放| 性欧美长视频| 国产精品区一区二区三在线播放| 日本韩国在线视频爽| 欧美视频一区二区三区…| 无码人妻一区二区三区在线视频| 精品国产一区二区三区| 91av福利视频| 亚洲欧美黄色片| 亚洲三级电影网站| 深夜黄色小视频| 国产一区二区三区探花| 欧美亚洲国产另类| 色呦呦中文字幕| 亚洲制服欧美中文字幕中文字幕| 九九热免费在线观看| 欧美亚洲激情| 国产成人在线精品| 精品欧美不卡一区二区在线观看| 亚洲最好看的视频| 在线播放国产精品| 无码视频在线观看| 久久久综合视频| 日韩中文字幕三区| 青青久久av| 91av成人在线| 日韩精品视频无播放器在线看 | 91视频一区二区| bt天堂新版中文在线地址| 成人国产精品一区二区网站| 在线成人免费网站| 中文字幕第三页| 国产女主播在线一区二区| av网站在线观看不卡| 欧美男人操女人视频| 97久久精品人人澡人人爽缅北| 亚洲国产福利视频| 夜夜嗨av一区二区三区网页 | 久久激情视频免费观看| 国产一区二区网站| 亚洲色图在线看| 在线观看免费看片| 国产一区观看| 国产在线精品一区二区中文| 多野结衣av一区| 亚洲精品视频中文字幕| 午夜精品久久久久久久蜜桃| 久久久不卡影院| 97超碰人人爽| 国产一区二区三区四区三区四| 国产精品久久久久久久久久直播| 不卡专区在线| 亚洲午夜久久久影院| 中国一级特黄视频| 亚洲欧美日韩精品久久久久| 天天爽夜夜爽视频| 国产日韩一区二区三区在线播放 | 人人狠狠综合久久亚洲婷| 国产日韩欧美日韩| 色图在线观看| 日韩精品中文字幕有码专区| 一区二区三区麻豆| 亚洲男帅同性gay1069| 野战少妇38p| 日韩精品一卡二卡三卡四卡无卡 | 一区在线免费| 欧美亚洲另类久久综合| 自拍偷拍亚洲图片| 97国产精品免费视频| 国产日本在线视频| 日韩精品一区二区三区四区视频| 亚洲精品视频在线观看免费视频| 久久精品男人天堂av| 亚洲一区二区三区四区精品| 国产亚洲高清视频| 致1999电视剧免费观看策驰影院| 一本一道久久a久久| 欧美中文字幕在线视频| 国产婷婷视频在线| 精品视频久久久久久久| 国产精品毛片一区视频播| 午夜欧美在线一二页| 欧美自拍偷拍网| a级高清视频欧美日韩| 孩娇小videos精品| 夜久久久久久| av动漫在线免费观看| 成人一级毛片| 精品无人乱码一区二区三区的优势 | 91亚洲国产高清| 国外成人免费视频| 国产麻豆一区二区三区| 国产成人一区二| 爱看av在线入口| 日韩中文字幕亚洲| 免费在线国产| 亚洲第一视频网站| 国产毛片毛片毛片毛片| 欧美性受xxxx| 中文字幕精品三级久久久| 亚洲精选免费视频| 女人黄色一级片| 99精品热视频| 久久久久亚洲无码| 国产成人综合自拍| 亚洲va在线va天堂va偷拍| 久久一区二区三区超碰国产精品| 路边理发店露脸熟妇泻火| 色综合色综合| 手机成人在线| 国产一区毛片| 日本公妇乱淫免费视频一区三区| 日韩丝袜视频| 好吊妞www.84com只有这里才有精品 | 你懂的一区二区| 中文字幕人成一区| 欧美肉体xxxx裸体137大胆| 免费国产一区二区| 亚州综合一区| 快播亚洲色图| 久久成人高清| 任我爽在线视频精品一| 日韩欧美影院| 欧美日韩精品免费在线观看视频| 精品亚洲自拍| 久久久久成人精品免费播放动漫| 国产图片一区| 懂色一区二区三区av片| 午夜日韩影院| 国产精品久久精品国产| 国产区精品视频在线观看豆花| 99国产盗摄| 国产日韩三级| 欧美aaaaa喷水| 国产亚洲一区二区三区不卡| 日韩av电影免费在线| 国产精品探花在线观看| 日韩色妇久久av| 999国产精品永久免费视频app| 一区二区三区四区欧美日韩| 日韩在线不卡| 艳母动漫在线观看| 欧美视频成人| 91专区在线观看| 丝袜美腿亚洲一区二区图片| 国产精品天天av精麻传媒| 蜜臀av一区二区在线免费观看 | 7799精品视频天天看| 色菇凉天天综合网| 亚洲无码久久久久| 欧美一区二区二区| 老牛影视av牛牛影视av| 日韩乱码在线视频| 91在线直播| 欧美精品精品精品精品免费| 午夜影院在线播放| 国产98色在线| 欧美经典一区| 久久久久久久久一区| 日韩精品不卡一区二区| 伊人再见免费在线观看高清版 | 亚洲精品无码久久久久久| 日韩—二三区免费观看av| 欧美第一页浮力影院| 国产精品自拍一区| 色天使在线视频| 国产精品久久久久久久岛一牛影视| 五月天婷婷色综合| 日韩欧美一区二区三区| 亚洲一级片免费看| 精品电影一区二区三区| 国产在线视频你懂得| 精品久久久91| 天堂av中文在线观看| 91精品国产综合久久香蕉922| 亚洲午夜精品| 午夜精品一区二区在线观看 | 亚洲精品亚洲人成在线| 在线观看日韩羞羞视频| 亚洲欧洲综合| 久久婷婷国产91天堂综合精品| 国产成人免费视频网站高清观看视频| 中文字幕日韩三级片| 亚洲欧洲性图库| 国产精品人人人人| 日韩午夜激情电影| 国产美女性感在线观看懂色av| 欧美激情高清视频| 成人免费毛片嘿嘿连载视频…| 97久久人人超碰caoprom欧美| 国产成人精品三级高清久久91| 天天做天天躁天天躁| 男人操女人的视频在线观看欧美 | 国产精品毛片av| 一区二区三区在线观看www| 亚洲一区图片| 永久免费未满蜜桃| 亚洲男人都懂的| 91theporn国产在线观看| 亚洲美女视频网| 国产理论电影在线| 亚洲精品免费一区二区三区| 欧美特黄一级大片| 国内自拍在线观看| 成人黄色大片在线观看| 国产性xxxx| 欧美精品777| av在线播放免费| 国产成人精品久久二区二区| 米奇精品关键词| 久久精品xxx| 国产成人免费在线观看不卡| 国产尤物在线播放| 欧美人妖巨大在线| 久久亚洲图片| 北京富婆泄欲对白| 樱桃视频在线观看一区| 91 中文字幕| 日韩在线观看成人| 岛国精品在线| 翔田千里亚洲一二三区| 视频一区欧美日韩| 中文字幕xxx| 色婷婷久久99综合精品jk白丝| 香蕉久久一区二区三区| 久久午夜精品| 欧洲精品视频在线| 激情综合色综合久久| 亚洲色图日韩精品| 欧美日韩一卡二卡| 午夜视频在线免费观看| 国产精品视频最多的网站| 日韩av密桃| 福利片一区二区三区| 1024亚洲合集| 国产日韩欧美中文字幕| 麻豆一区二区在线观看| 国模大尺度视频一区二区| 女同性恋一区二区| 国产ts人妖一区二区| 日本熟妇毛耸耸xxxxxx| 日韩成人av一区| 97成人资源| 日韩免费av电影| 久久99精品国产91久久来源| 一级片一级片一级片| 日韩美女视频在线| av资源在线播放| 清纯唯美一区二区三区| 美国十次了思思久久精品导航 | 神马久久av| 手机在线看福利| 亚洲欧美激情一区二区| 亚洲女人18毛片水真多| 45www国产精品网站| 欧美日韩有码| 年下总裁被打光屁股sp| 欧美日韩在线观看视频| 99reav在线| 成人情视频高清免费观看电影| 国产精品一区亚洲| 日本精品久久久久中文| 日韩欧美国产精品| 午夜精品成人av| 成年人免费观看的视频| 成人av网站大全| 中文字幕第一页在线播放| 欧美高清视频在线| 国产一卡不卡| 中文字幕乱码在线人视频| 色综合欧美在线视频区| 国产人成网在线播放va免费| 国产欧美在线一区二区| 免费成人在线观看| 青娱乐在线视频免费观看| 亚洲欧美第一页| 网站一区二区| 亚州精品一二三区| 精品国产31久久久久久| 国产写真视频在线观看| 欧美激情专区| 国产91露脸合集magnet| 中文字幕日日夜夜| 69av成年福利视频|