久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot異步處理的四種實(shí)現(xiàn)方式

瀏覽:135日期:2023-03-10 15:53:40

本篇文章我們以SpringBoot中異步的使用(包括:異步調(diào)用和異步方法兩個(gè)維度)來(lái)進(jìn)行講解。

異步請(qǐng)求與同步請(qǐng)求

我們先通過(guò)一張圖來(lái)區(qū)分一下異步請(qǐng)求和同步請(qǐng)求的區(qū)別:

SpringBoot異步處理的四種實(shí)現(xiàn)方式

在上圖中有三個(gè)角色:客戶(hù)端、Web容器和業(yè)務(wù)處理線(xiàn)程。

兩個(gè)流程中客戶(hù)端對(duì)Web容器的請(qǐng)求,都是同步的。因?yàn)樗鼈冊(cè)谡?qǐng)求客戶(hù)端時(shí)都處于阻塞等待狀態(tài),并沒(méi)有進(jìn)行異步處理。

在Web容器部分,第一個(gè)流程采用同步請(qǐng)求,第二個(gè)流程采用異步回調(diào)的形式。

通過(guò)異步處理,可以先釋放容器分配給請(qǐng)求的線(xiàn)程與相關(guān)資源,減輕系統(tǒng)負(fù)擔(dān),從而增加了服務(wù)器對(duì)客戶(hù)端請(qǐng)求的吞吐量。但并發(fā)請(qǐng)求量較大時(shí),通常會(huì)通過(guò)負(fù)載均衡的方案來(lái)解決,而不是異步。

Servlet3.0中的異步

Servlet 3.0之前,Servlet采用Thread-Per-Request的方式處理請(qǐng)求,即每一次Http請(qǐng)求都由一個(gè)線(xiàn)程從頭到尾處理。當(dāng)涉及到耗時(shí)操作時(shí),性能問(wèn)題便比較明顯。

Servlet 3.0中提供了異步處理請(qǐng)求。可以先釋放容器分配給請(qǐng)求的線(xiàn)程與相關(guān)資源,減輕系統(tǒng)負(fù)擔(dān),從而增加服務(wù)的吞吐量。

Servlet 3.0的異步是通過(guò)AsyncContext對(duì)象來(lái)完成的,它可以從當(dāng)前線(xiàn)程傳給另一個(gè)線(xiàn)程,并歸還初始線(xiàn)程。新的線(xiàn)程處理完業(yè)務(wù)可以直接返回結(jié)果給客戶(hù)端。

AsyncContext對(duì)象可以從HttpServletRequest中獲取:

@RequestMapping('/async')public void async(HttpServletRequest request) { AsyncContext asyncContext = request.getAsyncContext();}

在AsyncContext中提供了獲取ServletRequest、ServletResponse和添加監(jiān)聽(tīng)(addListener)等功能:

public interface AsyncContext { ServletRequest getRequest(); ServletResponse getResponse(); void addListener(AsyncListener var1); void setTimeout(long var1); // 省略其他方法}

不僅可以通過(guò)AsyncContext獲取Request和Response等信息,還可以設(shè)置異步處理超時(shí)時(shí)間。通常,超時(shí)時(shí)間(單位毫秒)是需要設(shè)置的,不然無(wú)限等下去不就與同步處理一樣了。

通過(guò)AsyncContext的addListener還可以添加監(jiān)聽(tīng)事件,用來(lái)處理異步線(xiàn)程的開(kāi)始、完成、異常、超時(shí)等事件回調(diào)。

addListener方法的參數(shù)AsyncListener的源碼如下:

public interface AsyncListener extends EventListener { // 異步執(zhí)行完畢時(shí)調(diào)用 void onComplete(AsyncEvent var1) throws IOException; // 異步線(xiàn)程執(zhí)行超時(shí)調(diào)用 void onTimeout(AsyncEvent var1) throws IOException; // 異步線(xiàn)程出錯(cuò)時(shí)調(diào)用 void onError(AsyncEvent var1) throws IOException; // 異步線(xiàn)程開(kāi)始時(shí)調(diào)用 void onStartAsync(AsyncEvent var1) throws IOException;}

通常,異常或超時(shí)時(shí)返回調(diào)用方錯(cuò)誤信息,而異常時(shí)會(huì)處理一些清理和關(guān)閉操作或記錄異常日志等。

基于Servlet方式實(shí)現(xiàn)異步請(qǐng)求

下面直接看一個(gè)基于Servlet方式的異步請(qǐng)求示例:

@GetMapping(value = '/email/send')public void servletReq(HttpServletRequest request) { AsyncContext asyncContext = request.startAsync(); // 設(shè)置監(jiān)聽(tīng)器:可設(shè)置其開(kāi)始、完成、異常、超時(shí)等事件的回調(diào)處理 asyncContext.addListener(new AsyncListener() {@Overridepublic void onTimeout(AsyncEvent event) { System.out.println('處理超時(shí)了...');}@Overridepublic void onStartAsync(AsyncEvent event) { System.out.println('線(xiàn)程開(kāi)始執(zhí)行');}@Overridepublic void onError(AsyncEvent event) { System.out.println('執(zhí)行過(guò)程中發(fā)生錯(cuò)誤:' + event.getThrowable().getMessage());}@Overridepublic void onComplete(AsyncEvent event) { System.out.println('執(zhí)行完成,釋放資源');} }); //設(shè)置超時(shí)時(shí)間 asyncContext.setTimeout(6000); asyncContext.start(new Runnable() {@Overridepublic void run() { try {Thread.sleep(5000);System.out.println('內(nèi)部線(xiàn)程:' + Thread.currentThread().getName());asyncContext.getResponse().getWriter().println('async processing'); } catch (Exception e) {System.out.println('異步處理發(fā)生異常:' + e.getMessage()); } // 異步請(qǐng)求完成通知,整個(gè)請(qǐng)求完成 asyncContext.complete();} }); //此時(shí)request的線(xiàn)程連接已經(jīng)釋放了 System.out.println('主線(xiàn)程:' + Thread.currentThread().getName());}

啟動(dòng)項(xiàng)目,訪(fǎng)問(wèn)對(duì)應(yīng)的URL,打印日志如下:

主線(xiàn)程:http-nio-8080-exec-4內(nèi)部線(xiàn)程:http-nio-8080-exec-5執(zhí)行完成,釋放資源

可以看出,上述代碼先執(zhí)行完了主線(xiàn)程,也就是程序的最后一行代碼的日志打印,然后才是內(nèi)部線(xiàn)程的執(zhí)行。內(nèi)部線(xiàn)程執(zhí)行完成,AsyncContext的onComplete方法被調(diào)用。

如果通過(guò)瀏覽器訪(fǎng)問(wèn)對(duì)應(yīng)的URL,還可以看到該方法的返回值“async processing”。說(shuō)明內(nèi)部線(xiàn)程的結(jié)果同樣正常的返回到客戶(hù)端了。

基于Spring實(shí)現(xiàn)異步請(qǐng)求

基于Spring可以通過(guò)Callable、DeferredResult或者WebAsyncTask等方式實(shí)現(xiàn)異步請(qǐng)求。

基于Callable實(shí)現(xiàn)

對(duì)于一次請(qǐng)求(/email),基于Callable的處理流程如下:

1、Spring MVC開(kāi)啟副線(xiàn)程處理業(yè)務(wù)(將Callable提交到TaskExecutor);

2、DispatcherServlet和所有的Filter退出Web容器的線(xiàn)程,但是response保持打開(kāi)狀態(tài);

3、Callable返回結(jié)果,SpringMVC將原始請(qǐng)求重新派發(fā)給容器(再重新請(qǐng)求一次/email),恢復(fù)之前的處理;

4、DispatcherServlet重新被調(diào)用,將結(jié)果返回給用戶(hù);

代碼實(shí)現(xiàn)示例如下:

@GetMapping('/email')public Callable<String> order() { System.out.println('主線(xiàn)程開(kāi)始:' + Thread.currentThread().getName()); Callable<String> result = () -> {System.out.println('副線(xiàn)程開(kāi)始:' + Thread.currentThread().getName());Thread.sleep(1000);System.out.println('副線(xiàn)程返回:' + Thread.currentThread().getName());return 'success'; }; System.out.println('主線(xiàn)程返回:' + Thread.currentThread().getName()); return result;}

訪(fǎng)問(wèn)對(duì)應(yīng)URL,控制臺(tái)輸入日志如下:

主線(xiàn)程開(kāi)始:http-nio-8080-exec-1主線(xiàn)程返回:http-nio-8080-exec-1副線(xiàn)程開(kāi)始:task-1副線(xiàn)程返回:task-1

通過(guò)日志可以看出,主線(xiàn)程已經(jīng)完成了,副線(xiàn)程才進(jìn)行執(zhí)行。同時(shí),URL返回結(jié)果“success”。這也說(shuō)明一個(gè)問(wèn)題,服務(wù)器端的異步處理對(duì)客戶(hù)端來(lái)說(shuō)是不可見(jiàn)的。

Callable默認(rèn)使用SimpleAsyncTaskExecutor類(lèi)來(lái)執(zhí)行,這個(gè)類(lèi)非常簡(jiǎn)單而且沒(méi)有重用線(xiàn)程。在實(shí)踐中,需要使用AsyncTaskExecutor類(lèi)來(lái)對(duì)線(xiàn)程進(jìn)行配置。

這里通過(guò)實(shí)現(xiàn)WebMvcConfigurer接口來(lái)完成線(xiàn)程池的配置。

@Configurationpublic class WebConfig implements WebMvcConfigurer { @Resource private ThreadPoolTaskExecutor myThreadPoolTaskExecutor; /** * 配置線(xiàn)程池 */ @Bean(name = 'asyncPoolTaskExecutor') public ThreadPoolTaskExecutor getAsyncThreadPoolTaskExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();taskExecutor.setCorePoolSize(2);taskExecutor.setMaxPoolSize(10);taskExecutor.setQueueCapacity(25);taskExecutor.setKeepAliveSeconds(200);taskExecutor.setThreadNamePrefix('thread-pool-');// 線(xiàn)程池對(duì)拒絕任務(wù)(無(wú)線(xiàn)程可用)的處理策略,目前只支持AbortPolicy、CallerRunsPolicy;默認(rèn)為后者taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.initialize();return taskExecutor; } @Override public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {// 處理callable超時(shí)configurer.setDefaultTimeout(60 * 1000);configurer.setTaskExecutor(myThreadPoolTaskExecutor);configurer.registerCallableInterceptors(timeoutCallableProcessingInterceptor()); } @Bean public TimeoutCallableProcessingInterceptor timeoutCallableProcessingInterceptor() {return new TimeoutCallableProcessingInterceptor(); }}

為了驗(yàn)證打印的線(xiàn)程,我們將實(shí)例代碼中的System.out.println替換成日志輸出,會(huì)發(fā)現(xiàn)在使用線(xiàn)程池之前,打印日志如下:

2021-02-21 09:45:37.144 INFO 8312 --- [nio-8080-exec-1] c.s.learn.controller.AsynController : 主線(xiàn)程開(kāi)始:http-nio-8080-exec-12021-02-21 09:45:37.144 INFO 8312 --- [nio-8080-exec-1] c.s.learn.controller.AsynController : 主線(xiàn)程返回:http-nio-8080-exec-12021-02-21 09:45:37.148 INFO 8312 --- [ task-1] c.s.learn.controller.AsynController : 副線(xiàn)程開(kāi)始:task-12021-02-21 09:45:38.153 INFO 8312 --- [ task-1] c.s.learn.controller.AsynController : 副線(xiàn)程返回:task-1

線(xiàn)程名稱(chēng)為“task-1”。讓線(xiàn)程池生效之后,打印日志如下:

2021-02-21 09:50:28.950 INFO 8339 --- [nio-8080-exec-1] c.s.learn.controller.AsynController : 主線(xiàn)程開(kāi)始:http-nio-8080-exec-12021-02-21 09:50:28.951 INFO 8339 --- [nio-8080-exec-1] c.s.learn.controller.AsynController : 主線(xiàn)程返回:http-nio-8080-exec-12021-02-21 09:50:28.955 INFO 8339 --- [ thread-pool-1] c.s.learn.controller.AsynController : 副線(xiàn)程開(kāi)始:thread-pool-12021-02-21 09:50:29.956 INFO 8339 --- [ thread-pool-1] c.s.learn.controller.AsynController : 副線(xiàn)程返回:thread-pool-1

線(xiàn)程名稱(chēng)為“thread-pool-1”,其中前面的“thread-pool”正是我們配置的線(xiàn)程池前綴。

除了線(xiàn)程池的配置,還可以配置統(tǒng)一異常處理,這里就不再演示了。

基于WebAsyncTask實(shí)現(xiàn)

Spring提供的WebAsyncTask是對(duì)Callable的包裝,提供了更強(qiáng)大的功能,比如:處理超時(shí)回調(diào)、錯(cuò)誤回調(diào)、完成回調(diào)等。

@GetMapping('/webAsyncTask')public WebAsyncTask<String> webAsyncTask() { log.info('外部線(xiàn)程:' + Thread.currentThread().getName()); WebAsyncTask<String> result = new WebAsyncTask<>(60 * 1000L, new Callable<String>() {@Overridepublic String call() { log.info('內(nèi)部線(xiàn)程:' + Thread.currentThread().getName()); return 'success';} }); result.onTimeout(new Callable<String>() {@Overridepublic String call() { log.info('timeout callback'); return 'timeout callback';} }); result.onCompletion(new Runnable() {@Overridepublic void run() { log.info('finish callback');} }); return result;}

訪(fǎng)問(wèn)對(duì)應(yīng)請(qǐng)求,打印日志:

2021-02-21 10:22:33.028 INFO 8547 --- [nio-8080-exec-1] c.s.learn.controller.AsynController : 外部線(xiàn)程:http-nio-8080-exec-12021-02-21 10:22:33.033 INFO 8547 --- [ thread-pool-1] c.s.learn.controller.AsynController : 內(nèi)部線(xiàn)程:thread-pool-12021-02-21 10:22:33.055 INFO 8547 --- [nio-8080-exec-2] c.s.learn.controller.AsynController : finish callback

基于DeferredResult實(shí)現(xiàn)

DeferredResult使用方式與Callable類(lèi)似,但在返回結(jié)果時(shí)不一樣,它返回的時(shí)實(shí)際結(jié)果可能沒(méi)有生成,實(shí)際的結(jié)果可能會(huì)在另外的線(xiàn)程里面設(shè)置到DeferredResult中去。

DeferredResult的這個(gè)特性對(duì)實(shí)現(xiàn)服務(wù)端推技術(shù)、訂單過(guò)期時(shí)間處理、長(zhǎng)輪詢(xún)、模擬MQ的功能等高級(jí)應(yīng)用非常重要。

關(guān)于DeferredResult的使用先來(lái)看一下官方的例子和說(shuō)明:

@RequestMapping('/quotes')@ResponseBodypublic DeferredResult<String> quotes() { DeferredResult<String> deferredResult = new DeferredResult<String>(); // Save the deferredResult in in-memory queue ... return deferredResult;}// In some other thread...deferredResult.setResult(data);

上述示例中我們可以發(fā)現(xiàn)DeferredResult的調(diào)用并不一定在Spring MVC當(dāng)中,它可以是別的線(xiàn)程。官方的解釋也是如此:

In this case the return value will also be produced from a separate thread. However, that thread is not known to Spring MVC. For example the result may be produced in response to some external event such as a JMS message, a scheduled task, etc.

也就是說(shuō),DeferredResult返回的結(jié)果也可能是由MQ、定時(shí)任務(wù)或其他線(xiàn)程觸發(fā)。來(lái)個(gè)實(shí)例:

@Controller@RequestMapping('/async/controller')public class AsyncHelloController { private List<DeferredResult<String>> deferredResultList = new ArrayList<>(); @ResponseBody @GetMapping('/hello') public DeferredResult<String> helloGet() throws Exception {DeferredResult<String> deferredResult = new DeferredResult<>();//先存起來(lái),等待觸發(fā)deferredResultList.add(deferredResult);return deferredResult; } @ResponseBody @GetMapping('/setHelloToAll') public void helloSet() throws Exception {// 讓所有hold住的請(qǐng)求給與響應(yīng)deferredResultList.forEach(d -> d.setResult('say hello to all')); }}

第一個(gè)請(qǐng)求/hello,會(huì)先將deferredResult存起來(lái),前端頁(yè)面是一直等待(轉(zhuǎn)圈)狀態(tài)。直到發(fā)第二個(gè)請(qǐng)求:setHelloToAll,所有的相關(guān)頁(yè)面才會(huì)有響應(yīng)。

整個(gè)執(zhí)行流程如下:

controller返回一個(gè)DeferredResult,把它保存到內(nèi)存里或者List里面(供后續(xù)訪(fǎng)問(wèn)); Spring MVC調(diào)用request.startAsync(),開(kāi)啟異步處理;與此同時(shí)將DispatcherServlet里的攔截器、Filter等等都馬上退出主線(xiàn)程,但是response仍然保持打開(kāi)的狀態(tài); 應(yīng)用通過(guò)另外一個(gè)線(xiàn)程(可能是MQ消息、定時(shí)任務(wù)等)給DeferredResult#setResult值。然后SpringMVC會(huì)把這個(gè)請(qǐng)求再次派發(fā)給servlet容器; DispatcherServlet再次被調(diào)用,然后處理后續(xù)的標(biāo)準(zhǔn)流程;

通過(guò)上述流程可以發(fā)現(xiàn):利用DeferredResult可實(shí)現(xiàn)一些長(zhǎng)連接的功能,比如當(dāng)某個(gè)操作是異步時(shí),可以先保存對(duì)應(yīng)的DeferredResult對(duì)象,當(dāng)異步通知回來(lái)時(shí),再找到這個(gè)DeferredResult對(duì)象,在setResult處理結(jié)果即可。從而提高性能。

SpringBoot中的異步實(shí)現(xiàn)

在SpringBoot中將一個(gè)方法聲明為異步方法非常簡(jiǎn)單,只需兩個(gè)注解即可@EnableAsync和@Async。其中@EnableAsync用于開(kāi)啟SpringBoot支持異步的功能,用在SpringBoot的啟動(dòng)類(lèi)上。@Async用于方法上,標(biāo)記該方法為異步處理方法。

需要注意的是@Async并不支持用于被@Configuration注解的類(lèi)的方法上。同一個(gè)類(lèi)中,一個(gè)方法調(diào)用另外一個(gè)有@Async的方法,注解也是不會(huì)生效的。

@EnableAsync的使用示例:

@SpringBootApplication@EnableAsyncpublic class App { public static void main(String[] args) {SpringApplication.run(App.class, args); }}

@Async的使用示例:

@Servicepublic class SyncService { @Async public void asyncEvent() {// 業(yè)務(wù)處理 }}

@Async注解的使用與Callable有類(lèi)似之處,在默認(rèn)情況下使用的都是SimpleAsyncTaskExecutor線(xiàn)程池,可參考Callable中的方式來(lái)自定義線(xiàn)程池。

下面通過(guò)一個(gè)實(shí)例來(lái)驗(yàn)證一下,啟動(dòng)類(lèi)上使用@EnableAsync,然后定義Controller類(lèi):

@RestControllerpublic class IndexController { @Resource private UserService userService; @RequestMapping('/async') public String async(){System.out.println('--IndexController--1');userService.sendSms();System.out.println('--IndexController--4');return 'success'; }}

定義Service及異步方法:

@Servicepublic class UserService { @Async public void sendSms(){System.out.println('--sendSms--2');IntStream.range(0, 5).forEach(d -> { try {Thread.sleep(1000); } catch (InterruptedException e) {e.printStackTrace(); }});System.out.println('--sendSms--3'); }}

如果先注釋掉@EnableAsync和@Async注解,即正常情況下的業(yè)務(wù)請(qǐng)求,打印日志為:

--IndexController--1--sendSms--2--sendSms--3--IndexController--4

使用@EnableAsync和@Async注解時(shí),打印日志如下:

--IndexController--1--IndexController--4--sendSms--2--sendSms--3

通過(guò)日志的對(duì)比我們可以看出,使用了@Async的方法,會(huì)被當(dāng)成一個(gè)子線(xiàn)程。所以,整個(gè)sendSms方法會(huì)在主線(xiàn)程執(zhí)行完了之后執(zhí)行。

這樣的效果是不是跟我們上面使用的其他形式的異步異曲同工?所以在文章最開(kāi)始已經(jīng)說(shuō)到,網(wǎng)絡(luò)上所謂的“異步調(diào)用與異步請(qǐng)求的區(qū)別”是并不存儲(chǔ)在的,本質(zhì)上都是一回事,只不過(guò)實(shí)現(xiàn)形式不同而已。這里所提到異步方法,也就是將方法進(jìn)行異步處理而已。

@Async、WebAsyncTask、Callable、DeferredResult的區(qū)別

所在的包不同:

@Async:org.springframework.scheduling.annotation; WebAsyncTask:org.springframework.web.context.request.async; Callable:java.util.concurrent; DeferredResult:org.springframework.web.context.request.async;

通過(guò)所在的包,我們應(yīng)該隱隱約約感到一些區(qū)別,比如@Async是位于scheduling包中,而WebAsyncTask和DeferredResult是用于Web(Spring MVC)的,而Callable是用于concurrent(并發(fā))處理的。

對(duì)于Callable,通常用于Controller方法的異步請(qǐng)求,當(dāng)然也可以用于替換Runable的方式。在方法的返回上與正常的方法有所區(qū)別:

// 普通方法public String aMethod(){}// 對(duì)照Callable方法public Callable<String> aMethod(){}

而WebAsyncTask是對(duì)Callable的封裝,提供了一些事件回調(diào)的處理,本質(zhì)上區(qū)別不大。

DeferredResult使用方式與Callable類(lèi)似,重點(diǎn)在于跨線(xiàn)程之間的通信。

@Async也是替換Runable的一種方式,可以代替我們自己創(chuàng)建線(xiàn)程。而且適用的范圍更廣,并不局限于Controller層,而可以是任何層的方法上。

當(dāng)然,大家也可以從返回結(jié)果,異常處理等角度來(lái)分析一下,這里就不再展開(kāi)了。

小結(jié)

經(jīng)過(guò)上述的一步步分析,大家應(yīng)該對(duì)于Servlet3.0及Spring中對(duì)異步處理有所了解。當(dāng)了解了這些基礎(chǔ)理論,實(shí)戰(zhàn)實(shí)例,使用方法及注意事項(xiàng)之后,想必更能夠?qū)W(wǎng)絡(luò)上的相關(guān)知識(shí)能夠進(jìn)一步的去偽存真。

到此這篇關(guān)于SpringBoot異步處理的四種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)SpringBoot異步內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 9l蝌蚪porny中文自拍 | 精品国产一级片 | 久久9热| 久久久www | 亚洲二区在线 | 亚洲不卡视频在线观看 | av色伊人久久综合一区二区 | 久久久久国产精品视频 | 日本欧美国产 | 一级片在线观看 | 日日夜夜精品免费视频 | 欧美一级一区 | 狠狠色狠狠色合久久伊人 | 国产在线看片 | 最新日韩一区 | 在线欧美亚洲 | 国产精品毛片一区二区三区 | 狠狠视频 | 日韩中文字幕国产 | 午夜成人免费视频 | 免费在线一区二区三区 | 国产精品成av人在线视午夜片 | 久久99操| 日韩在线精品 | 久久久精品国产 | www.精品 | 中文字幕一区二区三区四区 | 一区二区三区在线播放视频 | 欧美日韩中文字幕 | 欧美精品入口蜜桃 | 一区二区不卡 | 亚洲乱码一区二区三区在线观看 | 日韩电影一区二区三区 | 国产精品国色综合久久 | 91在线免费观看 | 日本 欧美 三级 高清 视频 | 午夜国产精品视频 | 羞羞视频在线观看免费 | 国产高清一区 | 欧美日韩视频 | 久久黄色 | 久久精品国产免费 | 一区二区三区高清 | 91精品国产高清自在线观看 | 国产高清一区 | 亚洲日本韩国在线观看 | 日本久久精品视频 | av一区二区三区四区 | 亚洲一区二区精品视频 | 日韩精品一区二区三区 | 99久久99久久精品 | 中文字幕欧美日韩 | 激情综合久久 | 亚洲午夜精品久久久久久app | 亚洲经典视频在线观看 | 久久精品国产99精品国产亚洲性色 | 久久综合91 | 91看片淫黄大片一级在线观看 | 中文字幕亚洲精品 | 欧美成年网站 | 黄色免费av| 国产精品国产三级国产aⅴ中文 | 一区二区中文字幕 | 亚洲欧美在线免费观看 | 亚洲这里只有精品 | 国产精品毛片 | 99精品一区二区三区 | 亚洲综合中文网 | 国产a级大片 | 精品国产乱码久久久久久1区二区 | 91精品国产综合久久久蜜臀粉嫩 | 91精品视频在线播放 | 国产精品99久久久久久久vr | 成人在线片 | 欧美日韩中文在线 | 精品乱码久久久 | 久久久影视| 久久久久久久一区二区 | 精品乱码久久久 | 亚洲欧美一区二区三区在线 | 亚洲成人在线视频观看 | 91伊人 | 精品国产99 | 国产精品美女久久 | 黄色a视频 | 嫩草影院永久入口 | 一区二区三区 在线 | 91在线播 | 亚洲欧美中文字幕 | 最新日韩免费 | 在线成人av观看 | 超碰天天| 波多野结衣电影一区 | 久久夜夜 | 日韩精品www | 日韩不卡一区二区三区 | 欧美日韩在线免费观看 | 国产成人一级毛片 | 91精品久久 | 欧美精品一二三 | 国产精品99久久免费观看 | 欧美精品网站 | 国产三区在线观看视频 | 免费观看黄色大片 | 中文字幕欧美激情 | 一区二区三区不卡视频 | 欧美一级特黄aaaaaaa视频片 | 91在线免费看| 久久久日韩精品一区二区三区 | 人人草人人 | 国产欧美一区二区精品性色 | 日韩无 | 国产成人一区二区 | 亚洲欧美一区二区精品中文字幕 | 蜜桃av一区| 成人在线精品 | 91精品国产91久久久久久吃药 | 99久久99久久精品国产片果冻 | 欧美aaa视频 | 一本大道综合伊人精品热热 | 韩日在线视频 | 在线99视频 | 国产偷自视频区视频 | 亚洲国产精品久久人人爱 | 蜜桃精品久久久久久久免费影院 | 久色成人 | 一级一级国产片 | 国产精品久久久久久久免费大片 | 久久久久久中文字幕 | 一级a性色生活片久久毛片波多野 | 粉嫩高清一区二区三区精品视频 | 国产成人精品久久 | 国产一区二区三区四区五区 | 国产精品一区欧美 | 日韩欧美中文在线 | 中文字幕乱码一区二区三区 | 欧美精品99 | 91精品啪aⅴ在线观看国产 | 国产精品国产精品国产专区不片 | 九九久久影视 | 欧美综合婷婷 | 青青草人人 | 一区二区三区免费 | 久久久久一区二区 | 久久爱综合网 | 久久精品二区 | 精品欧美日韩 | 国产美女www爽爽爽免费视频 | 中文字幕在线观看一区二区三区 | 国产一区二区三区四区在线观看 | 人人爽视频| 免费的一级毛片 | 精品在线一区二区三区 | 夜夜超碰 | 欧美亚洲免费 | 亚洲日本韩国在线观看 | 少妇一区二区三区 | av网站免费在线观看 | 精品国产31久久久久久 | a级在线观看 | 久久久精品国产 | 日本精品视频在线观看 | 亚洲最新中文字幕 | 9999国产精品欧美久久久久久 | 免费黄色在线看 | 精品www| 欧美盗摄 | 91精彩视频在线观看 | www.久久久.com | 天天夜碰日日摸日日澡 | 中文字幕亚洲一区二区三区 | 天天久久| 久久69精品久久久久久久电影好 | 一级毛片在线免费看 | 91精品国产综合久久久久久丝袜 | av天空 | 国产精品99久久久久久大便 | 欧美日韩中文 | 天天操天天色天天 | 精品国产乱码久久久久久1区2区 | 国产精品一区二区久久久 | 国产高潮呻吟久久渣男片 | 日韩高清中文字幕 | 国产精品免费av | 夜夜操av | 日韩精品久久久 | 激情久久久 | 在线视频这里只有精品 | 中文字幕视频在线观看 | 久久精品一区二区三区四区 | 国产精品美女视频免费观看软件 | 黄色a视频 | 久久夜色精品国产 | 亚洲免费精品 | 综合一区二区三区 | 国产黄色大片 | 日韩一区在线播放 | 亚洲第一精品在线 | 在线视频第一页 | 日韩精品在线观看视频 | 亚洲毛片在线观看 | 岛国av免费 | 国产欧美精品一区二区色综合 | 亚洲综合视频 | 欧美一区二区三区在线观看视频 | 伊人av在线 | 日本久久久久久 | 国产成人精品一区二区三区视频 | 91碰碰| 91精品国产91久久久久久吃药 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 欧美大片免费高清观看 | 亚洲 精品 综合 精品 自拍 | 99视频在线免费观看 | 久久porn| 91资源在线 | 久久99深爱久久99精品 | 欧美激情精品 | 精品欧美黑人一区二区三区 | 成人黄色在线观看 | 天天操,夜夜操 | 91视频免费看 | 岛国免费av | 精品久久网| 91亚洲国产成人久久精品网站 | 欧美久久一区二区三区 | 日本福利视频免费观看 | 亚洲男人天堂网 | 日韩一区二区不卡 | 日韩极品在线 | 日韩精品视频在线观看免费 | 亚洲视频在线观看免费 | 日韩精品免费在线视频 | 亚洲欧美在线免费观看 | 不卡一区 | 国产a视频| 久久成人国产视频 | 久久精品久久久久久 | 日韩精品一区二区三区第95 | 欧美三级视频 | 久久影音先锋 | 国产成人中文字幕 | 亚洲a级 | 亚洲精品一区二三区不卡 | 亚洲成人av | 亚洲精品久久 | 免费黄色电影在线观看 | 99视频在线 | 特级丰满少妇一级aaaa爱毛片 | 国产精品一区二 | 91视频黄色 | 久久99深爱久久99精品 | 97国产在线 | 黄色一级电影 | 91免费国产 | 韩国一区二区视频 | 成人在线不卡 | 国产91麻豆视频 | 日韩欧美中文在线 | 国产成人精品亚洲日本在线观看 | 成人欧美 | 成人高清视频在线观看 | 91免费看片| 日韩小视频网站 | 91精品国产综合久久久久久漫画 | 在线观看亚洲视频 | 久草精品视频在线播放 | 久草视频在线看 | 国产视频亚洲精品 | 欧美午夜在线观看 | 精品一区二区三区蜜桃 | 亚洲精品乱码久久久久久久久 | 精品久久久久久久久久久 | 久久精品 | 久久草视频 | 午夜激情在线播放 | 精品国产不卡一区二区三区 | 欧美日韩在线观看一区二区 | 欧美在线免费 | 亚洲九九 | 在线不卡一区 | 久久久久国产一区二区三区 | 999热在线| 国产精品永久免费 | 视频在线一区 | 福利电影在线 | 国产日韩精品一区二区 | 四虎黄色网 | 欧美日韩在线免费 | 国产77777| 亚洲精品久久久久久一区二区 | 久久久久一区二区三区 | 视频专区一区二区 | 色偷偷噜噜噜亚洲男人 | 三区中文字幕 | 国产高清不卡 | 色接久久 | 日韩在线视频中文字幕 | 一级毛片免费观看 | 成人精品一区二区三区中文字幕 | 黄色的视频免费 | 久久精品一区 | 精品久久久久久久久久久久 | 久久久久久a女人 | 亚洲性生活免费视频 | 毛片a在线 | 黄色网页大全 | 毛片真人毛毛片毛片 | 99免费观看| 欧美一区二区精品 | 欧美精品一区二区三区在线 | 久久精品一级 | 狠狠狠干| 一二三区在线 | 久久中文字幕一区 | 亚洲视频在线观看一区二区三区 | 91影院在线观看 | 日韩欧美在线视频播放 | 成人欧美一区二区三区在线播放 | 成人在线国产 | 免费啪啪网站 | 中文字幕日韩在线 | 国产精品久久久久久久久久东京 | 四色成人av永久网址 | 91精品国产日韩91久久久久久 | 久在线观看 | 成人欧美一区二区三区在线观看 | 天天操天天插 | 君岛美绪一区二区三区在线视频 | 国产午夜久久 | 二区视频 | 毛片免费在线观看 | 一级在线看 | 波多野结衣一区在线观看 | 中文字幕成人 | 久久久久国产 | 在线视频 亚洲 | 国产精品久久久久久吹潮 | 国产日韩欧美综合 | 午夜久久久久 | 久久久久久亚洲 | 免费二区 | 伊人网在线视频观看 | 亚洲日本欧美日韩高观看 | 久久久久国产一区二区三区 | 97国产精品 | 国变精品美女久久久久av爽 | 亚洲视频成人 | 91在线精品视频 | 日韩视频在线观看 | 欧美精品免费在线 | www.色涩涩.com网站 | 亚洲国产一区视频 | 日日夜夜天天 | 最新久久精品 | 国产精品欧美一区二区三区 | 中文字幕大全 | 国产精品久久久久久一区二区三区 | 国产免费av网站 | 中文字幕av亚洲精品一部二部 | 久久精品亚洲精品 | 亚洲精品一区中文字幕乱码 | 一区二区三区视频免费在线观看 | 精品久久久久久久久久久久久久 | 国产精品久久久久一区二区三区 | 免费成人激情视频 | 久久韩国 | 国产1区| 一级黄色片看看 | 亚洲第一区在线 | 久久精品 | 日本三级在线观看中文字 | 国产伦精品一区二区三区四区视频 | 久久国产视频精品 | 日本色站 | 久久mm | 久久久久久免费视频 | 色一级| 欧美日韩久久久 | 国产精品三级久久久久久电影 | 国产小视频在线播放 | 国产成人在线看 | 欧美日韩综合视频 | 狠狠视频 | 免费久久99精品国产婷婷六月 | 欧美亚洲免费 | 欧美视频一区 | 五月天电影网 | 日韩精品99久久久久中文字幕 | 欧美久久久久久久 | 国产免费av网站 | 中文精品久久久 | 毛片免费视频 | 91精品国产高清久久久久久久久 | 国产福利精品一区 | 欧美色综合 | 日本五月婷婷 | 成人黄色在线视频 | 欧美成人精品一区二区三区在线看 | 午夜高清视频 | 亚洲v日韩v综合v精品v | 另类久久| 欧美国产91 | 亚洲精品一区二区三区 | 免费av电影网站 | 一区二区免费在线观看 | 成人免费毛片aaaaaa片 | 99精品视频免费 | 伊人国产精品 | 亚洲国产精品综合久久久 | 激情综合色综合久久综合 | 国产婷婷色一区二区三区 | 国产成人精品久久二区二区91 | 中文 日韩 欧美 | 国产精品国产精品国产专区不片 | 午夜激情视频在线观看 | 国产www精品 | 黄色视频a级毛片 | 国产高清中文字幕 | 激情综合色综合久久综合 | 亚洲中午字幕 | 日韩成人精品视频在线观看 | 丝袜美腿一区二区三区 | 精品免费国产 | 91精品国产高清一区二区三区 | 成人午夜免费视频 | 亚洲男人的天堂网站 | 亚洲精品视频一区 | 久久四色 | 亚洲高清在线 | 国产亚洲精品久久久久久久 | 国产干干干 | 日本精品一区 | 99精品视频一区二区三区 | 中文字幕亚洲一区 | 亚洲精品免费在线观看 | 日韩91| 成人精品| www.精品| 久久99深爱久久99精品 | 99热首页 | 亚洲免费在线视频 | 正在播放国产精品 | 国产精品69久久久久水密桃 | 国产草草视频 | 国产欧美精品区一区二区三区 | 91.com在线观看 | 国产精品久久久久久久久久久久久 | 亚洲精选久久 | 日韩国伦理久久一区 | 日本一区二区三区四区视频 | 日韩不卡在线 | 色婷婷久久| 一区二区久久 | 欧美中文日韩 | 国产中文在线 | www.久久99 | 日日干夜夜操 | 午夜精品影院 | 亚洲成人精品视频 | www嫩草| 成人精品一区二区三区电影黑人 | 一区二区成人在线 | 国产91在线免费观看 | 国产精品久久久久久吹潮 | 日韩精品免费在线观看 | 日韩手机在线 | 午夜成人免费电影 | 精品入口麻豆88视频 | 亚洲 中文 欧美 日韩 在线观看 | 色婷婷在线视频观看 | 精品福利在线 | 日韩中文字幕在线观看 | 99国产精品99久久久久久 | 射久久 | 五月天中文字幕 | 美女午夜视频 | 九九精品视频在线观看 | 爱爱视频网站 | 国产成人福利在线 | 久久精品 | 欧美日韩国产一区二区三区 | 日韩精品 电影一区 亚洲 | 午夜免费高清视频 | 精品国产乱码久久久久久久 | 亚洲aⅴ网站 | www国产一区 | 中文字幕在线观看 | 色天天综合久久久久综合片 | 精品国产三级 | 黄色一级片免费 | 久久精品一区二区三区四区 | 成人午夜性a一级毛片免费看 | 青青草综合在线 | 国产在视频一区二区三区吞精 | 国产999精品久久久久久麻豆 | 亚洲精品一区二区另类图片 | 亚洲免费视频在线观看 | 国内精品一区二区 | 久草成人| 日韩一区二区在线播放 | 国产精品久久久久影院色老大 | 在线视频a | 国产欧美在线观看 | 午夜电影网址 | 日日干夜夜干 | 97av在线 | 6080yy精品一区二区三区 | 国产日韩欧美在线 | 99视频精品在线 | 久久久精 | 亚洲成人毛片 | 国产精品欧美日韩 | 成人小视频在线看 | 久久男人的天堂 | 免费黄色欧美 | 一区二区亚洲 | 爱爱网av| 国产精品一区久久久久 | 精品国产髙清在线看国产毛片 | 青草青草久热精品视频在线观看 | 五月在线视频 | 欧美xxxx做受欧美 | 久久不卡 | 精品久久久av | 国产一级片在线播放 | 搞黄免费视频 | 色婷婷基地 | 国产不卡免费视频 | 日本美女一区二区 | 一级黄色毛片免费 | 成人免费视频网站在线看 | 欧美成人黑人xx视频免费观看 | 国产91视频一区二区 | 国产成人精品一区二区 | 毛片国产 | 污视频在线免费观看 | 欧美一区二区三区在线视频 | 国产精品69毛片高清亚洲 | 激情小视频在线观看 | av在线一区二区三区 | 欧洲一区二区三区 | 尹人成人 | 亚洲女人天堂成人av在线 | 成人亚洲视频在线观看 | 国产自在现线2019 | 欧美精品三区 | 一区二区不卡 | 国产成人 综合 亚洲 | 欧美一区二区三区四区视频 | 五月免费视频 | 中文字幕精品一区久久久久 | 91在线视频观看 | 在线观看免费视频日韩 | 在线观看精品视频网站 | 亚洲a级 | 最新日韩av | 欧美在线亚洲 | av影片在线播放 | 欧美黑人一级爽快片淫片高清 | 亚洲精品一区二区三区 | 国产精品久久精品 | 精品一区二区三区在线观看视频 | 国产精品中文字幕在线 | av看片网| 国产综合精品一区二区三区 | 欧美日韩亚洲高清 | 久久精品成人一区二区三区蜜臀 | 日韩精品www | 精品在线一区二区 | 欧美电影一区 | 91视频网址 | 亚洲国产精品精华液网站 | 99re视频在线观看 | 欧美日韩国产一区二区三区 | 国产精品国产精品国产专区不片 | 蜜桃av人人夜夜澡人人爽 | 亚洲高清在线 | 欧美综合区 | 一区二区三区免费在线观看 | 国产99久久精品一区二区永久免费 | 夜本色| www国产亚洲精品久久网站 | 91精品国产91久久久久久黑人 | 国产真实乱全部视频 | www久久久久久久 | 福利在线看| 999在线观看精品免费不卡网站 | 一区二区三区播放 | 99精品久久久| 日本男人的天堂 | 青青久久久 | 国产精品久久久久精 | 国产一级特黄aaa大片 | 日韩欧美国产精品综合嫩v 高清av网站 | 久久久艹| 亚洲欧美日韩在线一区 | 亚洲精品久久一区二区三区 | 国产精品一区二区在线观看 | 欧美自拍视频一区 | 国产精品视频久久 | 亚洲成成品网站 | 超级碰在线 | 亚洲免费av在线 | 亚洲精品久久久久久国产精华液 | 亚洲精品视频在线观看免费 | 日韩欧美精品一区二区三区 | 欧洲另类二三四区 | 欧美精品1区2区3区 欧美视频在线一区 | 色综合天天综合网国产成人网 | 亚洲视频综合 | www视频在线观看 | 国产一区二区三区精品久久久 | 国产精品一区二区久久久 | 久久99精品视频在线观看 |