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

Spring Boot異步請求和異步調用,一文搞定!

開發 后端
可以先釋放容器分配給請求的線程與相關資源,減輕系統負擔,釋放了容器所分配線程的請求,其響應將被延后,可以在耗時處理完成(例如長時間的運算)時再對客戶端進行響應。

一、Spring Boot中異步請求的使用

1、異步請求與同步請求

特點:

可以先釋放容器分配給請求的線程與相關資源,減輕系統負擔,釋放了容器所分配線程的請求,其響應將被延后,可以在耗時處理完成(例如長時間的運算)時再對客戶端進行響應。

一句話:增加了服務器對客戶端請求的吞吐量(實際生產上我們用的比較少,如果并發請求量很大的情況下,我們會通過nginx把請求負載到集群服務的各個節點上來分攤請求壓力,當然還可以通過消息隊列來做請求的緩沖)。

2、異步請求的實現

方式一:Servlet方式實現異步請求 

  1. @RequestMapping(value = "/email/servletReq"method = GET 
  2.   public void servletReq (HttpServletRequest request, HttpServletResponse response) {  
  3.       AsyncContext asyncContext = request.startAsync();  
  4.       //設置監聽器:可設置其開始、完成、異常、超時等事件的回調處理  
  5.       asyncContext.addListener(new AsyncListener() {  
  6.           @Override  
  7.           public void onTimeout(AsyncEvent event) throws IOException {  
  8.               System.out.println("超時了...");  
  9.               //做一些超時后的相關操作...  
  10.           }  
  11.           @Override  
  12.           public void onStartAsync(AsyncEvent event) throws IOException {  
  13.               System.out.println("線程開始");  
  14.           }  
  15.           @Override  
  16.           public void onError(AsyncEvent event) throws IOException {  
  17.               System.out.println("發生錯誤:"+event.getThrowable());  
  18.           }  
  19.           @Override 
  20.            public void onComplete(AsyncEvent event) throws IOException {  
  21.               System.out.println("執行完成");  
  22.               //這里可以做一些清理資源的操作...  
  23.           }  
  24.       });  
  25.       //設置超時時間  
  26.       asyncContext.setTimeout(20000);  
  27.       asyncContext.start(new Runnable() {  
  28.           @Override  
  29.           public void run() {  
  30.               try {  
  31.                   Thread.sleep(10000);  
  32.                   System.out.println("內部線程:" + Thread.currentThread().getName());  
  33.                   asyncContext.getResponse().setCharacterEncoding("utf-8");  
  34.                   asyncContext.getResponse().setContentType("text/html;charset=UTF-8");  
  35.                   asyncContext.getResponse().getWriter().println("這是異步的請求返回");  
  36.               } catch (Exception e) {  
  37.                   System.out.println("異常:"+e);  
  38.               }  
  39.               //異步請求完成通知  
  40.               //此時整個請求才完成  
  41.               asyncContext.complete();  
  42.           }  
  43.       }); 
  44.        //此時之類 request的線程連接已經釋放了  
  45.       System.out.println("主線程:" + Thread.currentThread().getName());  
  46.   } 

方式二:使用很簡單,直接返回的參數包裹一層callable即可,可以繼承WebMvcConfigurerAdapter類來設置默認線程池和超時處理 

  1. @RequestMapping(value = "/email/callableReq"method = GET 
  2.   @ResponseBody  
  3.   public Callable<String> callableReq () {  
  4.       System.out.println("外部線程:" + Thread.currentThread().getName());  
  5.       return new Callable<String>() {  
  6.           @Override  
  7.           public String call() throws Exception {  
  8.               Thread.sleep(10000);  
  9.               System.out.println("內部線程:" + Thread.currentThread().getName());  
  10.               return "callable!";  
  11.           }  
  12.       };  
  13.   }  
  14.   @Configuration  
  15.   public class RequestAsyncPoolConfig extends WebMvcConfigurerAdapter {  
  16.   @Resource  
  17.   private ThreadPoolTaskExecutor myThreadPoolTaskExecutor;  
  18.   @Override  
  19.   public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {  
  20.       //處理 callable超時  
  21.       configurer.setDefaultTimeout(60*1000);  
  22.       configurer.setTaskExecutor(myThreadPoolTaskExecutor);  
  23.       configurer.registerCallableInterceptors(timeoutCallableProcessingInterceptor()); 
  24.   }  
  25.   @Bean  
  26.   public TimeoutCallableProcessingInterceptor timeoutCallableProcessingInterceptor() {  
  27.       return new TimeoutCallableProcessingInterceptor();  
  28.   }  

方式三:和方式二差不多,在Callable外包一層,給WebAsyncTask設置一個超時回調,即可實現超時處理 

  1. @RequestMapping(value = "/email/webAsyncReq"method = GET 
  2.     @ResponseBody  
  3.     public WebAsyncTask<String> webAsyncReq () {  
  4.         System.out.println("外部線程:" + Thread.currentThread().getName());  
  5.         Callable<String> result = () -> {  
  6.             System.out.println("內部線程開始:" + Thread.currentThread().getName());  
  7.             try {  
  8.                 TimeUnit.SECONDS.sleep(4);  
  9.             } catch (Exception e) {  
  10.                 // TODO: handle exception  
  11.             }  
  12.             logger.info("副線程返回");  
  13.             System.out.println("內部線程返回:" + Thread.currentThread().getName());  
  14.             return "success";  
  15.         };  
  16.         WebAsyncTask<String> wat = new WebAsyncTask<String>(3000L, result);  
  17.         wat.onTimeout(new Callable<String>() {  
  18.             @Override  
  19.             public String call() throws Exception {  
  20.                 // TODO Auto-generated method stub  
  21.                 return "超時";  
  22.             }  
  23.         });  
  24.         return wat;  
  25.     } 

方式四:DeferredResult可以處理一些相對復雜一些的業務邏輯,最主要還是可以在另一個線程里面進行業務處理及返回,即可在兩個完全不相干的線程間的通信。

  1. @RequestMapping(value = "/email/deferredResultReq"method = GET 
  2.     @ResponseBody  
  3.     public DeferredResult<String> deferredResultReq () {  
  4.         System.out.println("外部線程:" + Thread.currentThread().getName());  
  5.         //設置超時時間  
  6.         DeferredResult<String> result = new DeferredResult<String>(60*1000L);  
  7.         //處理超時事件 采用委托機制  
  8.         result.onTimeout(new Runnable() {  
  9.             @Override  
  10.             public void run() {  
  11.                 System.out.println("DeferredResult超時");  
  12.                 result.setResult("超時了!");  
  13.             }  
  14.         });  
  15.         result.onCompletion(new Runnable() {  
  16.             @Override  
  17.             public void run() {  
  18.                 //完成后  
  19.                 System.out.println("調用完成");  
  20.             }  
  21.         });  
  22.         myThreadPoolTaskExecutor.execute(new Runnable() {  
  23.             @Override  
  24.             public void run() {  
  25.                 //處理業務邏輯  
  26.                 System.out.println("內部線程:" + Thread.currentThread().getName());  
  27.                 //返回結果  
  28.                 result.setResult("DeferredResult!!");  
  29.             }  
  30.         });  
  31.        return result;  
  32.     } 

二、Spring Boot中異步調用的使用

1、介紹

異步請求的處理。除了異步請求,一般上我們用的比較多的應該是異步調用。通常在開發過程中,會遇到一個方法是和實際業務無關的,沒有緊密性的。比如記錄日志信息等業務。這個時候正常就是啟一個新線程去做一些業務處理,讓主線程異步的執行其他業務。

2、使用方式(基于spring下)

需要在啟動類加入@EnableAsync使異步調用@Async注解生效

在需要異步執行的方法上加入此注解即可@Async("threadPool"),threadPool為自定義線程池。

代碼略。。。就倆標簽,自己試一把就可以了

3、注意事項

在默認情況下,未設置TaskExecutor時,默認是使用SimpleAsyncTaskExecutor這個線程池,但此線程不是真正意義上的線程池,因為線程不重用,每次調用都會創建一個新的線程。可通過控制臺日志輸出可以看出,每次輸出線程名都是遞增的。所以最好我們來自定義一個線程池。

調用的異步方法,不能為同一個類的方法(包括同一個類的內部類),簡單來說,因為Spring在啟動掃描時會為其創建一個代理類,而同類調用時,還是調用本身的代理類的,所以和平常調用是一樣的。

其他的注解如@Cache等也是一樣的道理,說白了,就是Spring的代理機制造成的。所以在開發中,最好把異步服務單獨抽出一個類來管理。下面會重點講述。。

4、什么情況下會導致@Async異步方法會失效?

調用同一個類下注有@Async異步方法:

在spring中像@Async和@Transactional、cache等注解本質使用的是動態代理,其實Spring容器在初始化的時候Spring容器會將含有AOP注解的類對象“替換”為代理對象(簡單這么理解),那么注解失效的原因就很明顯了,就是因為調用方法的是對象本身而不是代理對象,因為沒有經過Spring容器,那么解決方法也會沿著這個思路來解決。

調用的是靜態(static )方法

調用(private)私有化方法

5、解決4中問題1的方式(其它2,3兩個問題自己注意下就可以了)

將要異步執行的方法單獨抽取成一個類,原理就是當你把執行異步的方法單獨抽取成一個類的時候,這個類肯定是被Spring管理的,其他Spring組件需要調用的時候肯定會注入進去,這時候實際上注入進去的就是代理類了。

其實我們的注入對象都是從Spring容器中給當前Spring組件進行成員變量的賦值,由于某些類使用了AOP注解,那么實際上在Spring容器中實際存在的是它的代理對象。那么我們就可以通過上下文獲取自己的代理對象調用異步方法。 

  1. @Controller  
  2. @RequestMapping("/app")  
  3. public class EmailController {  
  4.     //獲取ApplicationContext對象方式有多種,這種最簡單,其它的大家自行了解一下  
  5.     @Autowired  
  6.     private ApplicationContext applicationContext;  
  7.     @RequestMapping(value = "/email/asyncCall"method = GET 
  8.     @ResponseBody  
  9.     public Map<String, Object> asyncCall () {  
  10.         Map<String, Object> resMap = new HashMap<String, Object>();  
  11.         try{  
  12.             //這樣調用同類下的異步方法是不起作用的  
  13.             //this.testAsyncTask();  
  14.             //通過上下文獲取自己的代理對象調用異步方法  
  15.             EmailController emailController = (EmailController)applicationContext.getBean(EmailController.class);  
  16.             emailController.testAsyncTask();  
  17.             resMap.put("code",200);  
  18.         }catch (Exception e) {  
  19.             resMap.put("code",400);  
  20.             logger.error("error!",e);  
  21.         }  
  22.         return resMap;  
  23.     }   
  24.     //注意一定是public,且是非static方法  
  25.     @Async  
  26.     public void testAsyncTask() throws InterruptedException {  
  27.         Thread.sleep(10000);  
  28.         System.out.println("異步任務執行完成!");  
  29.     }  

開啟cglib代理,手動獲取Spring代理類,從而調用同類下的異步方法。首先,在啟動類上加上@EnableAspectJAutoProxy(exposeProxy = true)注解。代碼實現,如下: 

  1. @Service  
  2. @Transactional(value = "transactionManager"readOnly = falsepropagation = Propagation.REQUIRED, rollbackFor = Throwable.class)  
  3. public class EmailService {  
  4.     @Autowired  
  5.     private ApplicationContext applicationContext;  
  6.     @Async  
  7.     public void testSyncTask() throws InterruptedException {  
  8.         Thread.sleep(10000);  
  9.         System.out.println("異步任務執行完成!");  
  10.     }  
  11.     public void asyncCallTwo() throws InterruptedException {  
  12.         //this.testSyncTask();  
  13. //        EmailService emailService = (EmailService)applicationContext.getBean(EmailService.class);  
  14. //        emailService.testSyncTask();  
  15.         boolean isAop = AopUtils.isAopProxy(EmailController.class);//是否是代理對象;  
  16.         boolean isCglib = AopUtils.isCglibProxy(EmailController.class);  //是否是CGLIB方式的代理對象;  
  17.         boolean isJdk = AopUtils.isJdkDynamicProxy(EmailController.class);  //是否是JDK動態代理方式的代理對象;  
  18.         //以下才是重點!!!  
  19.         EmailService emailService = (EmailService)applicationContext.getBean(EmailService.class);  
  20.         EmailService proxy = (EmailService) AopContext.currentProxy();  
  21.         System.out.println(emailService == proxy ? true : false);  
  22.         proxy.testSyncTask();  
  23.         System.out.println("end!!!");  
  24.     }  

三、異步請求與異步調用的區別

兩者的使用場景不同,異步請求用來解決并發請求對服務器造成的壓力,從而提高對請求的吞吐量;而異步調用是用來做一些非主線流程且不需要實時計算和響應的任務,比如同步日志到kafka中做日志分析等。

異步請求是會一直等待response相應的,需要返回結果給客戶端的;而異步調用我們往往會馬上返回給客戶端響應,完成這次整個的請求,至于異步調用的任務后臺自己慢慢跑就行,客戶端不會關心。

四、總結

異步請求和異步調用的使用到這里基本就差不多了,有問題還希望大家多多指出。這邊文章提到了動態代理,而spring中Aop的實現原理就是動態代理,后續會對動態代理做詳細解讀,還望多多支持哈~ 

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2024-07-31 15:57:41

2024-10-15 10:28:43

2025-04-07 08:20:00

ORMPython代碼

2024-08-12 10:13:01

2021-02-17 09:09:15

異步請求

2018-06-21 14:46:03

Spring Boot異步調用

2009-11-09 10:50:30

WCF異步調用

2009-12-21 14:10:26

WCF異步調用

2021-09-15 06:55:34

異步LinqC#

2022-09-27 12:01:56

Spring異步調用方式

2009-10-20 16:48:30

C#委托

2009-11-06 15:54:15

WCF異步調用

2009-07-01 13:58:00

JavaScript異

2021-09-18 16:10:48

Spring BootJava微服務

2011-03-02 08:57:22

jQueryJavaScript

2012-10-29 10:59:27

Windows 8

2021-03-29 09:26:44

SpringBoot異步調用@Async

2010-01-11 17:24:19

VB.NET異步調用

2009-12-07 14:26:47

WCF異步調用

2009-12-07 14:35:42

WCF異步調用
點贊
收藏

51CTO技術棧公眾號

亚洲春色综合另类校园电影| 欧美一级黄色录像| 国产精品一区二区欧美| 日本最新中文字幕| 亚洲欧洲av| 欧美午夜精品一区| 日韩在线观看a| 加勒比一区二区三区在线| 日一区二区三区| 久久九九亚洲综合| 星空大象在线观看免费播放| 欧美精选视频一区二区| 综合久久国产九一剧情麻豆| 日本高清不卡视频| 深夜福利91大全| 亚洲成人精品在线播放| 在线女人免费视频| 亚洲免费三区一区二区| 免费成人看片网址| 国产成人免费看一级大黄| 99成人免费视频| 日韩在线资源网| 一区二区视频观看| 麻豆精品久久| 色综合久久88色综合天天| 人人妻人人澡人人爽精品欧美一区 | 岛国精品一区| 欧美福利一区二区| 国产精品日韩av| 国产一区二区三区奇米久涩| 免费黄色一级大片| 99精品视频免费观看| 日韩在线视频网站| 国产精品久久免费观看| 欧美一级二级三级视频| 日韩女同互慰一区二区| 中文字幕第88页| 日韩高清成人| 色婷婷av一区二区| 日本成年人网址| 91福利在线免费| 亚洲影视资源网| www.69av| 性欧美猛交videos| 亚洲人123区| 9999在线观看| 日本在线观看免费| 中文字幕一区在线观看| 午夜精品一区二区三区四区| 国产午夜在线视频| 国产日韩视频一区二区三区| 久久久亚洲综合网站| 熟妇高潮一区二区高潮| 成人黄色一级视频| 国产精品久久亚洲| 色欲av永久无码精品无码蜜桃| 国产成人av电影在线| 国产91视觉| 欧美一级做性受免费大片免费| 国产成人在线免费观看| 国产成人av一区二区三区| 亚洲av无码乱码国产麻豆| 国产精品一区久久久久| 久久久久久久网| 欧美第一淫aaasss性| 岛国毛片在线观看| 国产一区日韩欧美| 97国产精品久久| 69视频免费在线观看| 午夜亚洲性色视频| 国产精品黄视频| 一级片一区二区三区| 国产自产v一区二区三区c| 亚洲在线免费看| 亚洲精品久久久蜜桃动漫| 99视频一区二区| 欧美亚州在线观看| 亚洲xxxxxx| 一区二区三区高清| 无码播放一区二区三区| 四虎影视4hu4虎成人| 欧美日韩卡一卡二| 国产乱淫av麻豆国产免费| 日韩av影院| 伊人伊成久久人综合网站 | 91久久综合| 久久国产综合精品| 日本成人黄色片| 一级特黄aaa大片在线观看| 国产在线不卡一卡二卡三卡四卡| www.久久艹| 激情在线视频| 最新国产精品久久精品| 成人毛片一区二区| 粉嫩91精品久久久久久久99蜜桃| 欧美一区二区日韩一区二区| 人妻在线日韩免费视频| 欧美在线电影| 久久久亚洲影院| 又骚又黄的视频| 99视频精品免费视频| 杨幂一区欧美专区| 欧美男男激情videos| 91国产免费观看| 香蕉久久久久久av成人| 欧美先锋资源| 九九热在线精品视频| 精品久久久久久久久久久久久久久久| 国内精品免费在线观看| 视频在线一区二区| 91网站免费看| 国产原创中文av| 91视视频在线观看入口直接观看www | 亚洲中文字幕无码中文字| 欧美黄色a视频| 亚洲精品一区在线观看香蕉| 美女毛片在线观看| 美洲天堂一区二卡三卡四卡视频| 久久国产精品久久精品国产| a毛片在线看免费观看| 色94色欧美sute亚洲13| 国产精品久久久久久在线观看| 日韩系列欧美系列| 国产91精品青草社区| 性做久久久久久久| 1000精品久久久久久久久| www.国产区| 秋霞蜜臀av久久电影网免费| 欧美激情2020午夜免费观看| ,亚洲人成毛片在线播放| 91社区在线播放| 男女日批视频在线观看| 国产一区二区| 国产成人精品一区二区三区视频 | 国产精品久久精品日日| 男女av免费观看| 红杏一区二区三区| 久精品免费视频| 国产理论视频在线观看| 中文字幕欧美国产| 欧美少妇性生活视频| 欧美久久精品| 992tv在线成人免费观看| 高h调教冰块play男男双性文| 亚洲蜜臀av乱码久久精品蜜桃| 在线免费av播放| 欧美一区二区三| 国产欧美一区二区三区久久| 99re在线视频| 欧美日韩国产一区二区三区地区| 亚洲一区视频在线播放| 美女精品网站| 三级三级久久三级久久18| 日韩高清中文字幕一区二区| 亚洲欧美日韩中文在线| 国产精品第5页| 国产亚洲婷婷免费| 亚洲国产日产av| 成人免费观看在线| aaa国产精品视频| 午夜精品久久久久久久白皮肤| 亚洲h视频在线观看| 亚洲一区二区三区爽爽爽爽爽| 国产国语老龄妇女a片| 日韩天堂av| 欧美精品免费观看二区| 国产一区二区三区影视| 日韩中文字幕在线看| 国产日韩一级片| 亚洲一区二区三区四区在线观看| 呦呦视频在线观看| 天堂成人国产精品一区| 一区二区三区的久久的视频| 国产精品欧美一区二区三区不卡| 欧美精品在线免费播放| 肥臀熟女一区二区三区| 欧美日韩中文字幕在线| 亚洲自拍偷拍图| 国内精品视频一区二区三区八戒| 国产情侣第一页| 免费视频国产一区| 国产欧美日韩精品专区| 色yeye免费人成网站在线观看| 精品一区二区三区蜜桃| 91精品国产日韩91久久久久久| 日本成人免费在线观看| 国产高清精品在线| 欧美牲交a欧美牲交aⅴ免费真| 99欧美视频| 国产亚洲一区二区三区在线播放| **在线精品| 欧美理论片在线观看| 日本韩国一区| 制服丝袜在线91| 成年人免费高清视频| 国产精品伦理在线| 久久久久久久人妻无码中文字幕爆| 久久精品伊人| 少妇久久久久久被弄到高潮| 要久久爱电视剧全集完整观看 | 国产色91在线| 美女又黄又免费的视频| 日韩av一区二区三区四区| 成人小视频在线观看免费| 国产在线观看91一区二区三区| 亚洲va欧美va国产综合剧情| 成人福利av| 欧美富婆性猛交| 91青青在线视频| 99riav视频一区二区| 欧美一级二级三级蜜桃| 国产精品第5页| 亚洲成人av福利| 91导航在线观看| 99精品国产99久久久久久白柏| 亚洲欧美手机在线| 久久久久国产精品午夜一区| 欧美日韩dvd| 日韩大片在线| 你懂的视频在线一区二区| 视频免费一区二区| 成人免费视频网| 蜜桃精品在线| 69精品小视频| 国产第一页在线视频| 久久伊人精品视频| 日本www在线观看视频| 亚洲视频视频在线| 国产又爽又黄网站亚洲视频123| 日韩欧美国产系列| 国产乱人乱偷精品视频a人人澡| 日本高清无吗v一区| 青青国产在线观看| 亚洲亚洲人成综合网络| 精品国产欧美日韩不卡在线观看| 中文字幕不卡在线| 国产亚洲精品熟女国产成人| 久久综合久久99| 欧美三级中文字幕在线观看| 国产精品免费无码| 91最新地址在线播放| 怡红院一区二区| 成人动漫一区二区三区| 中文字幕永久免费| 高清不卡一二三区| 午夜免费福利影院| 99re热视频精品| 国产国语性生话播放| heyzo一本久久综合| 亚洲av成人精品一区二区三区| 国产成人av自拍| 亚洲国产精品第一页| 国产成都精品91一区二区三| 无码人妻一区二区三区在线视频| 国产一区视频导航| 丰满少妇中文字幕| 成人在线视频一区| 强迫凌虐淫辱の牝奴在线观看| 99热精品国产| 日本精品在线观看视频| 中文字幕av一区 二区| 欧美精品日韩在线| 成人免费视频在线观看| 久久久久无码国产精品不卡| 亚洲线精品一区二区三区| 日韩成人免费在线视频| 岛国av在线不卡| 特级西西444www大胆免费看| 欧美日韩电影在线播放| 正在播放亚洲1区| 欧美性受xxxx狂喷水| 精品五月天久久| 成年人在线免费观看| 精品国产自在精品国产浪潮| 日本资源在线| 欧美尤物巨大精品爽| 懂色aⅴ精品一区二区三区| 亚洲一区二区三区乱码aⅴ| 中文字幕日韩高清在线| 免费看成人午夜电影| 97视频精品| 日本丰满少妇xxxx| 日韩成人一级片| 国产黄色一区二区三区 | 女人又爽又黄免费女仆| 国产精品美女久久久久高潮| 国产一级片久久| 在线观看av一区二区| 国产不卡av在线播放| 日韩精品中文字幕在线观看| 免费观看在线黄色网| 久久久久亚洲精品| 美女色狠狠久久| 国产乱码精品一区二区三区日韩精品| 国产欧美日韩精品高清二区综合区| 先锋影音男人资源| 午夜在线视频观看日韩17c| 涩涩网站在线看| 26uuu精品一区二区在线观看| 日本一级特级毛片视频| 亚洲精品免费观看| 免费91在线视频| 中文字幕伦理免费在线视频 | 国产一区二区黑人欧美xxxx| www.在线视频| 国产精品福利网站| 加勒比色综合久久久久久久久| 亚洲欧美国产不卡| 国产一级一区二区| av影片在线播放| 国产精品欧美一区喷水| 国产又大又黄视频| 日韩女同互慰一区二区| 日本在线www| 国产精品欧美一区二区| 日韩av资源网| 喜爱夜蒲2在线| 久久成人精品无人区| 能免费看av的网站| 亚洲成人久久影院| av 一区二区三区| 色一区av在线| 国产日韩另类视频一区| 九色视频成人porny| 欧美精品国产一区二区| 中文字幕资源在线观看| 国产欧美精品一区aⅴ影院| 日韩欧美不卡视频| 精品日韩一区二区三区免费视频| 精品国产丝袜高跟鞋| 成人a级免费视频| 久久亚洲影视| 欧美三级理论片| 99在线精品视频免费观看软件 | aaaaa黄色片| 亚洲欧美日韩国产一区二区三区| 中文字幕 国产精品| 亚洲男人天堂古典| 中文字幕乱码中文乱码51精品| 韩国成人动漫在线观看| 亚洲久久一区| 亚洲一区二区三区无码久久| 午夜精品视频在线观看| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 欧美成aaa人片在线观看蜜臀| 国产高清日韩| 五月天激情图片| 国产成人av一区| 男人天堂中文字幕| 亚洲国产三级网| 午夜裸体女人视频网站在线观看| 九色综合婷婷综合| 国产精品久久久免费| 男生裸体视频网站| 日韩欧美国产激情| 黄色影院在线播放| 国产精品手机播放| 久久电影院7| 特黄特黄一级片| 亚洲一区二区三区四区五区中文| 秋霞视频一区二区| 欧美在线视频免费播放| 国产精品亚洲二区| 亚洲人视频在线| 一区二区三区色| 香港三日本三级少妇66| 国产成人亚洲综合| 香港欧美日韩三级黄色一级电影网站| 国产丝袜一区二区三区免费视频| 国产精品露脸视频| 最近中文字幕mv在线一区二区三区四区| 黄色成人小视频| 免费的一级黄色片| 91色九色蝌蚪| 在线视频 中文字幕| 欧美日韩999| 色婷婷久久久| 天天干天天操天天玩| 一区二区日韩电影| 深夜福利视频在线观看| 国产精品亚洲аv天堂网| 欧美黄色一区| 国产又爽又黄无码无遮挡在线观看| 在线观看视频91| 日本电影在线观看| 人禽交欧美网站免费| 国产最新精品免费| 男人的天堂一区| 精品国模在线视频| 免费看久久久| 污污视频在线免费| 疯狂做受xxxx高潮欧美日本| 色视频在线免费观看| 国产在线精品一区二区三区》 | 欧美日韩精品在线视频| √天堂资源地址在线官网| 国产福利一区二区三区在线观看| 日韩在线一区二区| 国产亚洲第一页| 日韩午夜在线视频|