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

欧美一区二区三区| 成人免费a视频| 麻豆一二三区精品蜜桃| 亚洲制服丝袜在线| 欧美凹凸一区二区三区视频| 在线观看色网站| 欧美午夜一区| 日韩精品在线私人| 在线免费观看av网| 多野结衣av一区| 国产精品毛片无遮挡高清| 国产91免费视频| 国产一卡二卡三卡| 亚洲午夜伦理| 日韩亚洲精品视频| 日本69式三人交| 欧美性aaa| 欧美日韩性生活视频| 最新av在线免费观看| 欧美孕妇孕交| 成人精品视频.| 国产主播喷水一区二区| 日韩不卡在线播放| 午夜欧美视频| 精品国产一区二区三区四区在线观看| 亚洲国产果冻传媒av在线观看| 4438五月综合| 欧日韩精品视频| 久久久一本二本三本| 动漫一区在线| 国产精品拍天天在线| 久久66热这里只有精品| 国产小视频一区| 精品亚洲porn| 国产精品视频精品| 欧美一级淫片免费视频黄| 在线国产日韩| 久久999免费视频| 国产免费一区二区三区四区| 精品日产免费二区日产免费二区| 日韩av影视综合网| 成人在线观看一区二区| 日韩高清在线观看一区二区| 欧美日韩另类一区| av污在线观看| 视频精品导航| 欧美吻胸吃奶大尺度电影 | 91久久精品网| 久久婷婷国产精品| 原纱央莉成人av片| 日韩欧美国产网站| 国产成人a亚洲精v品无码| 超碰资源在线| 精品二区三区线观看| 亚洲熟妇无码一区二区三区导航| 欧洲精品二区| 亚洲成人黄色影院| 国产在线播放观看| 女海盗2成人h版中文字幕| 午夜视频一区二区| 久久精品国产精品亚洲色婷婷| 国产剧情av在线播放| 午夜精品久久久久久久| 色综合久久久久无码专区| 日韩伦理福利| 在线观看视频91| 亚洲 激情 在线| www欧美在线观看| 欧美一区二区视频在线观看2022| 午夜免费视频网站| 成人在线视频中文字幕| 亚洲精品99久久久久| 毛茸茸多毛bbb毛多视频| 国产伦精品一区二区三区千人斩| 一区二区三区美女xx视频| 久久久久麻豆v国产| 欧美精选一区| 青青草原一区二区| 国产九色91回来了| 国产乱理伦片在线观看夜一区| 国产 高清 精品 在线 a| 无码国产精品一区二区色情男同| 久久九九99视频| 自拍另类欧美| a毛片不卡免费看片| 日韩欧美中文字幕在线播放| www.99r| 日韩中文字幕在线一区| 亚洲精品videossex少妇| 91视频免费在观看| 欧美91大片| 欧美在线免费视频| 国产视频www| 99久久婷婷国产精品综合| 日韩欧美亚洲日产国| av黄色在线| 色香蕉久久蜜桃| 久久久久久国产精品日本| 爽爽窝窝午夜精品一区二区| 日韩有码在线播放| 日韩美女黄色片| 久久精品国产77777蜜臀| 国产精品久久久久久久天堂第1集| 国产资源在线看| 一区二区三区视频在线看| 十八禁视频网站在线观看| 国产亚洲观看| 亚洲午夜久久久久久久| 久久久一二三区| 日本不卡123| 国产在线播放一区二区| 免费人成在线观看播放视频| 精品久久久久久中文字幕一区奶水| 午夜精品在线免费观看| 成人资源在线| 日韩中文字幕不卡视频| 伊人手机在线视频| 成人免费观看视频| 一本久道久久综合| 无码小电影在线观看网站免费| 3atv在线一区二区三区| 国产精品久久久久无码av色戒| 欧美1区3d| 国产视频999| 黄色软件在线观看| 婷婷成人激情在线网| 久久成年人网站| 国内成人精品| 7777精品视频| 亚洲国产精品久久久久久久| 国产精品美女久久久久高潮| 日韩avxxx| 亚洲精品不卡在线观看| 色偷偷88888欧美精品久久久| 精品国产xxx| 99久久久国产精品| 男人天堂手机在线视频| 精品国模一区二区三区欧美| 中国人与牲禽动交精品| 极品国产91在线网站| www.日韩在线| 被灌满精子的波多野结衣| 蜜桃精品视频| 欧美成人中文字幕在线| 国产又粗又猛视频| 国产精品欧美综合在线| 午夜免费看视频| 成人激情诱惑| 国产精品网站入口| fc2在线中文字幕| 欧洲人成人精品| 白白色免费视频| 日韩精品一级二级| 日本福利一区二区三区| 丁香六月综合| 国产亚洲欧美日韩美女| 久久久久久久亚洲| 国产欧美一区二区精品性色超碰| 男人女人黄一级| 日本一区二区在线看| 国产精品久久久久久久久男| 午夜在线视频播放| 制服丝袜成人动漫| 欧美又粗又大又长| 成a人片亚洲日本久久| 亚洲精品无码国产| 日韩欧美天堂| 国产精品av网站| 91在线视频| 欧美一级久久久| 国产午夜精品一区二区理论影院| youjizz久久| 成人av一级片| 成人羞羞视频在线看网址| 国产美女扒开尿口久久久| 岛国中文字幕在线| 亚洲成人久久网| 日本中文字幕在线观看视频| 国产精品久久久久毛片软件| 日本高清免费在线视频| 亚洲精品系列| 亚洲 日韩 国产第一区| 国产亚洲字幕| 78色国产精品| 1769在线观看| 精品国产乱码久久久久久牛牛| 中文字幕亚洲高清| 国产精品久久久久一区二区三区 | 日韩中文字幕在线视频| 国产成人精品av在线观| 午夜免费久久看| 内射毛片内射国产夫妻| 国产精品一二三在| 国产亚洲综合视频| 国产韩日影视精品| 国严精品久久久久久亚洲影视| 四虎4545www国产精品| 欧美区在线播放| 黄色小视频在线观看| 日韩免费看网站| 一二三区免费视频| 一区二区在线观看免费视频播放| 欧美多人猛交狂配| 国产一区二区按摩在线观看| 免费av观看网址| 91精品秘密在线观看| 麻豆av一区二区三区| 动漫一区二区三区| 国产精品第三页| 极品视频在线| 久久国产精品影片| 成人免费在线视频网| 亚洲国产精品久久久久秋霞蜜臀| 亚洲视频一区在线播放| 欧美日韩国产中文精品字幕自在自线 | 欧美精品一二三四区| 亚洲激情综合网| 色欲狠狠躁天天躁无码中文字幕| 成人av资源在线观看| 亚洲第一天堂久久| 日一区二区三区| 免费观看国产精品视频| 综合国产精品| 翔田千里亚洲一二三区| 九九热精品视频在线观看| 9a蜜桃久久久久久免费| 深夜日韩欧美| 国产精品久久久久久久久免费看| 涩涩涩视频在线观看| 久久久久久久一区二区三区| a视频在线播放| 日韩中文字幕在线| 北条麻妃在线| 亚洲性视频网站| 深夜福利视频在线免费观看| 日韩美女一区二区三区四区| 99国产精品欲| 欧美一个色资源| 99久久久无码国产精品免费| 欧美日韩精品一区二区三区蜜桃| 免费av中文字幕| 欧洲视频一区二区| 中文字幕欧美在线观看| 欧洲精品中文字幕| 中文区中文字幕免费看| 色国产综合视频| 波多野结衣电车| 色8久久人人97超碰香蕉987| 精品无码一区二区三区的天堂| 色8久久精品久久久久久蜜| 激情视频网站在线观看| 一本大道久久a久久综合婷婷 | 国产亚洲永久域名| 黄色影院一级片| 久久av最新网址| 黑人糟蹋人妻hd中文字幕| 日精品一区二区三区| 日本男人操女人| 热久久免费视频| 可以看污的网站| 国产一区二区三区四区在线观看| 在线a免费观看| 成人免费视频播放| 欧美亚一区二区三区| 国产午夜亚洲精品不卡| 色屁屁草草影院ccyy.com| 国产精品美女一区二区| 日韩欧美综合视频| 亚洲小说欧美激情另类| 国产成人愉拍精品久久| 色综合欧美在线| 亚洲影院一区二区三区| 欧美一级久久久久久久大片| 人妻一区二区三区四区| 亚洲欧美激情另类校园| 午夜视频在线| 欧美精品精品精品精品免费| 理论片午夜视频在线观看| 国产精品久久久久9999| 成人午夜888| 黄色99视频| 日韩精品看片| 丰满少妇大力进入| 久久午夜精品| 国产乱叫456| 99久久久国产精品免费蜜臀| 1024在线看片| 亚洲小说欧美激情另类| 99re热视频| 精品日韩av一区二区| 免费福利在线视频| 欧美大尺度在线观看| 日韩伦理在线一区| 91免费在线视频网站| 日韩欧美天堂| 国产精品久久久影院| 久久综合九色| 国产无套精品一区二区三区| 久久久久久久一区| 欧美日韩在线观看免费| 欧洲av在线精品| 少妇高潮久久久| 久久精品青青大伊人av| 日韩精品av| 不卡视频一区| 国产韩日影视精品| 999精品网站| 成人国产一区二区三区精品| 天堂网中文在线观看| 精品久久久久久久中文字幕| 国产人妻精品一区二区三| 亚洲天堂视频在线观看| 黄色污污视频在线观看| 成人激情免费在线| 免费短视频成人日韩| 18黄暴禁片在线观看| 国产一区不卡视频| www.99热| 欧洲亚洲国产日韩| 深夜福利在线视频| 久久免费视频在线观看| 精品一级视频| 一区二区三区电影| 日韩av一区二区三区四区| 亚洲成人av免费在线观看| 亚洲精品成人在线| 国产人妖一区二区| 日韩视频免费观看| 国产精品亚洲成在人线| 欧美亚洲国产免费| 亚洲欧美激情诱惑| 中文字幕一区二区三区乱码不卡| 怡红院av一区二区三区| 国产视频手机在线| 俺也去精品视频在线观看| 亚洲电影有码| 水蜜桃亚洲一二三四在线| 久久综合影视| 久久久久亚洲av成人无码电影| 黄色一区二区三区| 色噜噜在线播放| 久久久久久午夜| 精品久久对白| 国产免费黄视频| 91最新地址在线播放| 日韩毛片在线播放| 日韩高清有码在线| 亚洲精品永久免费视频| 久久久综合香蕉尹人综合网| 亚洲少妇诱惑| 亚洲蜜桃精久久久久久久久久久久| 亚洲第一搞黄网站| 亚洲色大成网站www| 欧美亚洲国产日韩2020| 亚洲成aⅴ人片久久青草影院| 黄www在线观看| 国产午夜精品美女毛片视频| 天天干天天插天天射| 中文字幕日韩高清| 亚洲精品伊人| 热久久最新网址| 国产91精品露脸国语对白| 日韩免费观看一区二区| 日韩精品在线影院| 欧美日一区二区三区| 黄色高清视频网站| 懂色av一区二区三区免费观看| 日本一本高清视频| 亚洲无av在线中文字幕| 欧美一级做a| 粉嫩av一区二区三区天美传媒| 成人午夜大片免费观看| 欧美不卡视频在线观看| 亚洲天堂成人在线| 一区在线不卡| 国产精品无码人妻一区二区在线| 久久夜色精品一区| 亚洲无码久久久久| 欧美激情按摩在线| 亚洲精品456| 毛片毛片毛片毛| 亚洲国产sm捆绑调教视频| 免费资源在线观看| 成人国产亚洲精品a区天堂华泰| 精品福利av| 欧美人妻一区二区三区| 日韩一区二区在线观看视频 | 日韩精品视频一区二区| 色婷婷久久久综合中文字幕| 麻豆网在线观看| 国产女主播一区二区三区| 蜜臀国产一区二区三区在线播放| 国产一区二区视频在线观看免费| 亚洲国产日韩欧美在线图片| www.一区| 国自产拍偷拍精品啪啪一区二区| 国产精品视频一二三区| 亚洲免费一级片| 国产精品手机播放| 日韩视频一区|