日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dubbo超时重试和异常处理

發布時間:2024/4/17 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dubbo超时重试和异常处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

dubbo超時重試和異常處理

?

參考:

https://www.cnblogs.com/ASPNET2008/p/7292472.html

https://www.tuicool.com/articles/YfA3Ub

https://www.cnblogs.com/binyue/p/5380322.html

https://blog.csdn.net/mj158518/article/details/51228649

?

?

dubbo源碼分析:超時原理以及應用場景

本篇主要記錄dubbo中關于超時的常見問題,實現原理,解決的問題以及如何在服務降級中體現作用等。

超時問題

為了檢查對dubbo超時的理解,嘗試回答如下幾個問題,如果回答不上來或者不確定那么說明此處需要再多研究研究。

我只是針對個人的理解提問題,并不代表我理解的就是全面深入的,但我的問題如果也回答不了,那至少說明理解的確是不夠細的。

  • 超時是針對消費端還是服務端?
  • 超時在哪設置?
  • 超時設置的優先級是什么?
  • 超時的實現原理是什么?
  • 超時解決的是什么問題?

問題解答

RPC場景

本文所有問題均以下圖做為業務場景,一個web api做為前端請求,product service是產品服務,其中調用comment service(評論服務)獲取產品相關評論,comment service從持久層中加載數據。

超時是針對消費端還是服務端?

  • 如果是爭對消費端,那么當消費端發起一次請求后,如果在規定時間內未得到服務端的響應則直接返回超時異常,但服務端的代碼依然在執行。

  • 如果是爭取服務端,那么當消費端發起一次請求后,一直等待服務端的響應,服務端在方法執行到指定時間后如果未執行完,此時返回一個超時異常給到消費端。

dubbo的超時是爭對客戶端的,由于是一種NIO模式,消費端發起請求后得到一個ResponseFuture,然后消費端一直輪詢這個ResponseFuture直至超時或者收到服務端的返回結果。雖然超時了,但僅僅是消費端不再等待服務端的反饋并不代表此時服務端也停止了執行。

按上圖的業務場景,看看生成的日志:

product service:報超時錯誤,因為comment service 加載數據需要5S,但接口只等1S?。

Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout. start time: 2017-08-05 18:14:52.751, end time: 2017-08-05 18:14:53.764, client elapsed: 6 ms, server elapsed: 1006 ms, timeout: 1000 ms, request: Request [id=0, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=getCommentsByProductId, parameterTypes=[class java.lang.Long], arguments=[1], attachments={traceId=6299543007105572864, spanId=6299543007105572864, input=259, path=com.jim.framework.dubbo.core.service.CommentService, interface=com.jim.framework.dubbo.core.service.CommentService, version=0.0.0}]], channel: /192.168.10.222:53204 -> /192.168.10.222:7777at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:107) ~[dubbo-2.5.3.jar:2.5.3]at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:84) ~[dubbo-2.5.3.jar:2.5.3]at com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:96) ~[dubbo-2.5.3.jar:2.5.3]... 42 common frames omitted

comment service : 并沒有異常,而是慢慢悠悠的執行自己的邏輯:

2017-08-05 18:14:52.760 INFO 846 --- [2:7777-thread-5] c.j.f.d.p.service.CommentServiceImpl : getComments start:Sat Aug 05 18:14:52 CST 2017 2017-08-05 18:14:57.760 INFO 846 --- [2:7777-thread-5] c.j.f.d.p.service.CommentServiceImpl : getComments end:Sat Aug 05 18:14:57 CST 2017

從日志來看,超時影響的是消費端,與服務端沒有直接關系。

超時在哪設置?

消費端

  • 全局控制
<dubbo:consumer timeout="1000"></dubbo:consumer>
  • 接口控制
  • 方法控制

服務端

  • 全局控制
<dubbo:provider timeout="1000"></dubbo:provider>
  • 接口控制
  • 方法控制

可以看到dubbo針對超時做了比較精細化的支持,無論是消費端還是服務端,無論是接口級別還是方法級別都有支持。

超時設置的優先級是什么?

上面有提到dubbo支持多種場景下設置超時時間,也說過超時是針對消費端的。那么既然超時是針對消費端,為什么服務端也可以設置超時呢?

這其實是一種策略,其實服務端的超時配置是消費端的缺省配置,即如果服務端設置了超時,任務消費端可以不設置超時時間,簡化了配置。

另外針對控制的粒度,dubbo支持了接口級別也支持方法級別,可以根據不同的實際情況精確控制每個方法的超時時間。所以最終的優先順序為:客戶端方法級>服務端方法級>客戶端接口級>服務端接口級>客戶端全局>服務端全局

超時的實現原理是什么?

之前有簡單提到過,?dubbo默認采用了netty做為網絡組件,它屬于一種NIO的模式。消費端發起遠程請求后,線程不會阻塞等待服務端的返回,而是馬上得到一個ResponseFuture,消費端通過不斷的輪詢機制判斷結果是否有返回。因為是通過輪詢,輪詢有個需要特別注要的就是避免死循環,所以為了解決這個問題就引入了超時機制,只在一定時間范圍內做輪詢,如果超時時間就返回超時異常。

源碼

ResponseFuture接口定義

public interface ResponseFuture {/*** get result.* * @return result.*/Object get() throws RemotingException;/*** get result with the specified timeout.* * @param timeoutInMillis timeout.* @return result.*/Object get(int timeoutInMillis) throws RemotingException;/*** set callback.* * @param callback*/void setCallback(ResponseCallback callback);/*** check is done.* * @return done or not.*/boolean isDone();}

ReponseFuture的實現類:DefaultFuture

只看它的get方法,可以清楚看到輪詢的機制。

public Object get(int timeout) throws RemotingException {if (timeout <= 0) {timeout = Constants.DEFAULT_TIMEOUT;}if (! isDone()) {long start = System.currentTimeMillis();lock.lock();try {while (! isDone()) {done.await(timeout, TimeUnit.MILLISECONDS);if (isDone() || System.currentTimeMillis() - start > timeout) {break;}}} catch (InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}if (! isDone()) {throw new TimeoutException(sent > 0, channel, getTimeoutMessage(false));}}return returnFromResponse();}

超時解決的是什么問題?

設置超時主要是解決什么問題?如果沒有超時機制會怎么樣?

回答上面的問題,首先要了解dubbo這類rpc產品的線程模型。下圖是我之前個人RPC學習產品的示例圖,與dubbo的線程模型大致是相同的,有興趣的可參考我的筆記:簡單RPC框架-業務線程池

我們從dubbo的源碼看下這下線程模型是怎么用的:

netty boss

主要是負責socket連接之類的工作。

netty wokers

將一個請求分給后端的某個handle去處理,比如心跳handle?,執行業務請求的 handle等。

Netty Server中可以看到上述兩個線程池是如何初始化的:

首選是open方法,可以看到一個boss一個worker線程池。

protected void doOpen() throws Throwable {NettyHelper.setNettyLoggerFactory();ExecutorService boss = Executors.newCachedThreadPool(new NamedThreadFactory("NettyServerBoss", true));ExecutorService worker = Executors.newCachedThreadPool(new NamedThreadFactory("NettyServerWorker", true));ChannelFactory channelFactory = new NioServerSocketChannelFactory(boss, worker, getUrl().getPositiveParameter(Constants.IO_THREADS_KEY, Constants.DEFAULT_IO_THREADS));bootstrap = new ServerBootstrap(channelFactory);// ...... }

再看ChannelFactory的構造函數:

public NioServerSocketChannelFactory(Executor bossExecutor, Executor workerExecutor, int workerCount) {this(bossExecutor, 1, workerExecutor, workerCount);}

可以看出,boss線程池的大小為1,worker線程池的大小也是可以配置的,默認大小是當前系統的核心數+1,也稱為IO線程。

busines(業務線程池)

為什么會有業務線程池,這里不多解釋,可以參考我上面的文章。

缺省是采用固定大小的線程池,dubbo提供了三種不同類型的線程池供用戶選擇。我們看看這個類:AllChannelHandler,它是其中一種handle,處理所有請求,它的一個作用就是調用業務線程池去執行業務代碼,其中有獲取線程池的方法:

private ExecutorService getExecutorService() {ExecutorService cexecutor = executor;if (cexecutor == null || cexecutor.isShutdown()) { cexecutor = SHARED_EXECUTOR;}return cexecutor;}

上面代碼中的變量executor來自于AllChannelHandler的父類WrappedChannelHandler,看下它的構造函數:

public WrappedChannelHandler(ChannelHandler handler, URL url) {//......executor = (ExecutorService) ExtensionLoader.getExtensionLoader(ThreadPool.class).getAdaptiveExtension().getExecutor(url);//...... }

獲取線程池來自于SPI技術,從代碼中可以看出線程池的缺省配置就是上面提到的固定大小線程池。

@SPI("fixed") public interface ThreadPool {/*** 線程池* * @param url 線程參數* @return 線程池*/@Adaptive({Constants.THREADPOOL_KEY})Executor getExecutor(URL url);}

最后看下是如何將請求丟給線程池去執行的,在AllChannelHandler中有這樣的方法:

public void received(Channel channel, Object message) throws RemotingException {ExecutorService cexecutor = getExecutorService();try {cexecutor.execute(new ChannelEventRunnable(channel, handler, ChannelState.RECEIVED, message));} catch (Throwable t) {throw new ExecutionException(message, channel, getClass() + " error when process received event .", t);}}

典型問題:拒絕服務

如果上面提到的dubbo線程池模型理解了,那么也就容易理解一個問題,當前端大量請求并發出現時,很有可以將業務線程池中的線程消費完,因為默認缺省的線程池是固定大小(我現在版本缺省線程池大小為200),此時會出現服務無法按預期響應的結果,當然由于是固定大小的線程池,當核心線程滿了后也有隊列可排,但默認是不排隊的,需要排隊需要單獨配置,我們可以從線程池的具體實現中看:

public class FixedThreadPool implements ThreadPool {public Executor getExecutor(URL url) {String name = url.getParameter(Constants.THREAD_NAME_KEY, Constants.DEFAULT_THREAD_NAME);int threads = url.getParameter(Constants.THREADS_KEY, Constants.DEFAULT_THREADS);int queues = url.getParameter(Constants.QUEUES_KEY, Constants.DEFAULT_QUEUES);return new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, queues == 0 ? new SynchronousQueue<Runnable>() : (queues < 0 ? new LinkedBlockingQueue<Runnable>() : new LinkedBlockingQueue<Runnable>(queues)),new NamedThreadFactory(name, true), new AbortPolicyWithReport(name, url));}}

上面代碼的結論是:

  • 默認線程池大小為200(不同的dubbo版本可能此值不同)
  • 默認線程池不排隊,如果需要排隊,需要指定隊列的大小

當業務線程用完后,服務端會報如下的錯誤:

Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-192.168.10.222:9999, Pool Size: 1 (active: 1, core: 1, max: 1, largest: 1), Task: 8 (completed: 7), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://192.168.10.222:9999!at com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport.rejectedExecution(AbortPolicyWithReport.java:53) ~[dubbo-2.5.3.jar:2.5.3]at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823) [na:1.8.0_121]at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369) [na:1.8.0_121]at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:65) ~[dubbo-2.5.3.jar:2.5.3]... 17 common frames omitted

通過上面的分析,對調用的服務設置超時時間,是為了避免因為某種原因導致線程被長時間占用,最終出現線程池用完返回拒絕服務的異常。

超時與服務降級

按我們文章之前的場景,web api 請求產品明細時調用product service,為了查詢產品評論product service調用comment service。如果此時由于comment service異常,響應時間增大到10S(遠大于上游服務設置的超時時間),會發生超時異常,進而導致整個獲取產品明細的接口異常,這也就是平常說的強依賴。這類強依賴是超時不能解決的,解決方案一般是兩種:

  • 調用comment service時做異常捕獲,返回空值或者返回具體的錯誤碼,消費端根據不同的錯誤碼做不同的處理。
  • 調用coment service做服務降級,比如發生異常時返回一個mock的數據,dubbo默認支持mock。

只有通過做異常捕獲或者服務降級才能確保某些不重要的依賴出問題時不影響主服務的穩定性。而超時就可以與服務降級結合起來,當消費端發生超時時自動觸發服務降級, 這樣即使我們的評論服務一直慢,但不影響獲取產品明細的主體功能,只不過會犧牲部分體驗,用戶看到的評論不是真實的,但評論相對是個邊緣功能,相比看不到產品信息要輕的多,某種程度上是可以舍棄的。

?

?

?

Dubbo超時機制導致的雪崩連接

BUG作者:?許曉

Bug?標題:?Dubbo超時機制導致的雪崩連接

Bug?影響:?Dubbo?服務提供者出現無法獲取?Dubbo?服務處理線程異常,后端?DB?爆出拿不到數據庫連接池,導致前端響應時間異常飆高,系統處理能力下降,核心基礎服務無法提供正常服務。

Bug?發現過程:

線 上,對于高并發的服務化接口應用,時常會出現Dubbo連接池爆滿情況,通常,我們理所應當的認為,這是客戶端并發連接過高所致,一方面調整連接池大小, 一方面考慮去增加服務接口的機器,當然也會考慮去優化服務接口的應用。很自然的,當我們在線上壓測一個營銷頁面(為大促服務,具備高并發)時,我們遇到了 這種情況。而通過不斷的深入研究,我發現了一個特別的情況。

場景描述:

壓力從Jmeter壓至前端web應用marketingfront,場景是批量獲取30個產品的信息。wsproductreadserver有一個批量接口,會循環從tair中獲取產品信息,若緩存不存在,則命中db。

壓測后有兩個現象:

1)?Dubbo的服務端爆出大量連接拿不到的異常,還伴隨著無法獲取數據庫連接池的情況

2)?Dubbo Consumer端有大量的Dubbo超時和重試的異常,且重試3次后,均失敗。

3)?Dubbo Consumer端的最大并發時91個

Dubbo Provider端的最大并發卻是600個,而服務端配置的dubbo最大線程數即為600。

這個時候,出于性能測試的警覺性,發現這兩個并發數極為不妥。

按照正常的請求模式,DubboConsumer和DubboProvider展示出來的并發應該是一致的。此處為何會出現服務端的并發數被放大6倍,甚至有可能不止6倍,因為服務端的dubbo連接數限制就是600。

此處開始發揮性能測試各種大膽猜想:

1)是否是因為服務端再dubboServerHandle處理請求時,開啟了多線程,而這塊兒的多線程會累計到Dubbo的連接上,dragoon采集的這個數據可以真實的反應目前應用活動的線程對系統的壓力情況;

2)壓測環境不純潔?我的小伙伴們在偷偷和我一起壓測?(這個被我生生排除了,性能測試基本環境還是要保持獨立性)

3)是否是因為超時所致?這里超時會重試3次,那么順其自然的想,并發有可能最多會被放大到3倍,3*91=273<<600....還是不止3倍?

有了猜想,就得小心求證!

首先通過和dubbo開發人員 【草谷】分析,Dubbo連接數爆滿的原因,猜想1被否決,Dubbo服務端連接池是計數DubboServerHandle個數的業務是否采用多線程無關。

通過在壓測時,Dump provider端的線程數,也證明了這個。

那么,可能還是和超時有很大關系。

再觀察wsproductreadserver接口的處理時間分布情況:

從?RT?的分布來看?。基本上?78.5%?的響應時間是超過?1s?的。那么這個接口方法的?dubbo?超時時間是?500ms?,此時?dubbo?的重試機制會帶來怎樣的?雪崩效應?呢?

如果按照上圖,雖然客戶端只有1個并發在做操作,但是由于服務端執行十分耗時,每個請求的執行RT遠遠超過了超時時間500ms,此時服務端的最大并發會有多少呢?

和服務端處理的響應時間有特比特別大的關系。服務端處理時間變長,但是如果超時,客戶端的阻塞時間卻只有可憐的500ms,超過500ms,新一輪壓力又將發起。

上圖可直接看到的并發是8個,如果服務端RT再長些,那么并發可能還會再大些!

這也是為什么從marketingfront consumer的dragoon監控來看,只有90個并發。但是到服務端,卻導致dubbo連接池爆掉的直接原因。

查看了wsproductreadserver的堆棧,600個dubboServerHandle大部分都在做數據庫的讀取和數據庫連接獲取以及tair的操作。

所以,為什么Dubbo服務端的連接池會爆掉?很有可能就是因為你的服務接口,在高并發下的大部分RT分布已經超過了你的Dubbo設置的超時時間!這將直接導致Dubbo的重試機制會不斷放大你的服務端請求并發。

所 以如果,你在線上曾經遇到過類似場景,您可以采取去除Dubbo的重試機器,并且合理的設置Dubbo的超時時間。目前國際站的服務中心,已經開始去除 Dubbo的重試機制。當然Dubbo的重試機制其實是非常好的QOS保證,它的路由機制,是會幫你把超時的請求路由到其他機器上,而不是本機嘗試,所以 dubbo的重試機器也能一定程度的保證服務的質量。但是請一定要綜合線上的訪問情況,給出綜合的評估。

------------?等等等,別著急,我們似乎又忽略了一些細節,元芳,你怎么看??------------------------

我們重新回顧剛才的業務流程架構,wsproductReadserver層有DB和tair兩級存儲。那么對于同樣接口為什么服務化的接口RT如此之差,按照前面提到的架構,包含tair緩存,怎么還會有數據庫連接獲取不到的情況?

接續深入追蹤,將問題暴露和開發討論,他們拿出tair

可以看到,客戶端提交批量查詢30個產品的產品信息。在服務端,有一個緩存模塊,緩存的key是產品的ID。當產品命中tair時,則直接返回,若不命中,那么回去db中取數,再放入緩存中。

這里可以發現一個潛在的性能問題:

客 戶端提交30個產品的查詢請求,而服務端,則通過for循環和tair交互,所以這個接口在通常情況下的性能估計也得超過60-100ms。如果不是30 個產品,而是50或者100,那么這個接口的性能將會衰減的非常厲害!(這純屬性能測試的yy,當然這個暫時還不是我們本次關注的主要原因)

那么如此的架構,請求打在db上的可能性是比較小的, 由緩存命中率來保證。從線上真實的監控數據來看,tair的命中率在70%,應該說還不錯,為什么在我們的壓測場景,DB的壓力確是如此兇殘,甚至導致db的連接池無法獲取呢?

所以性能驗證場景就呼之欲出了:

場景:?準備30個產品ID,保持不變,這樣最多只會第一次會去訪問DB,并將數據存入緩存,后面將會直接命中緩存,db就在后面喝喝茶好了!

但是從測試結果來看,有兩點可以觀察到:

1)

2)

3)

于是開始檢查這30個產品到底有哪幾個沒有存入緩存。

通 過開發Debug預發布環境代碼,最終發現,這兩個產品竟然已經被用戶移到垃圾箱了。而通過和李浩和躍波溝通SellerCoponList的業務來 看,DA推送過來的產品是存在被用戶移除的可能性。因而,每次這兩個數據的查詢,由于數據庫查詢不到記錄,tair也沒有存儲相關記錄,導致這些查詢都將 經過數據庫。數據庫壓力原因也找到了。

但是問題還沒有結束,這似乎只像是冰山表面,我們希望能夠鳥瞰整個冰山!

細細品味這個問題的最終性能表象??這是一種變向擊穿緩存的做法啊!也就是具備一定的通用性。如果接口始終傳入數據庫和緩存都不可能存在的數據,那么每次的訪問都就落到db上,導致緩存變相擊穿,這個現象很有意思!

目前有一種解決方案,就是Null Object Pattern,將數據庫不存在的記錄也記錄到緩存中,但是value為NULL,使得緩存可以有效的攔截。由于數據的超時時間是10min,所以如果數據有所改動,也可以接受。

我相信這只是一種方案,可能還會有其他方案,但是這種變向的緩存擊穿卻讓我很興奮。回過頭來,如果讓我自己去實現這樣的緩存機制,數據庫和緩存都不存在的 數據場景很容易被忽略,并且這個對于業務確實也不會有影響。在線上存在大量熱點數據情況下,這樣的機制,往往并不會暴露性能問題。巧合的是,特定的場景, 性能卻會出現很大的偏差,這考驗的既是性能測試工程師的功力,也考驗的是架構的功力!

Bug?解決辦法:

其實這過程中不僅僅有一些方法論,也有一些是性能測試經驗的功底,更重要的是產出了一些通用性的性能問題解決方案,以及部分參數和技術方案的設計對系統架構的影響。

1)對于核心的服務中心,去除dubbo超時重試機制,并重新評估設置超時時間。

2)對于存在tair或者其他中間件緩存產品,對NULL數據進行緩存,防止出現緩存的變相擊穿問題

?

?

?

Dubbo超時和重連機制

dubbo啟動時默認有重試機制和超時機制。
超時機制的規則是如果在一定的時間內,provider沒有返回,則認為本次調用失敗,
重試機制在出現調用失敗時,會再次調用。如果在配置的調用次數內都失敗,則認為此次請求異常,拋出異常。

如果出現超時,通常是業務處理太慢,可在服務提供方執行:jstack PID > jstack.log 分析線程都卡在哪個方法調用上,這里就是慢的原因。
如果不能調優性能,請將timeout設大。

某些業務場景下,如果不注意配置超時和重試,可能會引起一些異常。

1.超時設置

DUBBO消費端設置超時時間需要根據業務實際情況來設定,
如果設置的時間太短,一些復雜業務需要很長時間完成,導致在設定的超時時間內無法完成正常的業務處理。
這樣消費端達到超時時間,那么dubbo會進行重試機制,不合理的重試在一些特殊的業務場景下可能會引發很多問題,需要合理設置接口超時時間。
比如發送郵件,可能就會發出多份重復郵件,執行注冊請求時,就會插入多條重復的注冊數據。

(1)合理配置超時和重連的思路

1.對于核心的服務中心,去除dubbo超時重試機制,并重新評估設置超時時間。
2.業務處理代碼必須放在服務端,客戶端只做參數驗證和服務調用,不涉及業務流程處理

(2)Dubbo超時和重連配置示例

1 2 <!-- 服務調用超時設置為5秒,超時不重試-->? <dubbo:service?interface="com.provider.service.DemoService" ref="demoService"? retries="0" timeout="5000"/>

2.重連機制

dubbo在調用服務不成功時,默認會重試2次。
Dubbo的路由機制,會把超時的請求路由到其他機器上,而不是本機嘗試,所以 dubbo的重試機制也能一定程度的保證服務的質量。
但是如果不合理的配置重試次數,當失敗時會進行重試多次,這樣在某個時間點出現性能問題,調用方再連續重復調用,
系統請求變為正常值的retries倍,系統壓力會大增,容易引起服務雪崩,需要根據業務情況規劃好如何進行異常處理,何時進行重試。

?

?

?

?

?

淺談dubbo的ExceptionFilter異常處理

背景

我們的項目使用了dubbo進行不同系統之間的調用。 每個項目都有一個全局的異常處理,對于業務異常,我們會拋出自定義的業務異常(繼承RuntimeException)。 全局的異常處理會根據不同的異常類型進行不同的處理。 最近我們發現,某個系統調用dubbo請求,provider端(服務提供方)拋出了自定義的業務異常,但consumer端(服務消費方)拿到的并不是自定義的業務異常。 這是為什么呢?還需要從dubbo的ExceptionFilter說起。

ExceptionFilter

如果Dubbo的?provider端?拋出異常(Throwable),則會被?provider端?的ExceptionFilter攔截到,執行以下invoke方法: [java]?view plaincopy
  • /*?
  • ?*?Copyright?1999-2011?Alibaba?Group.?
  • ?*???
  • ?*?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");?
  • ?*?you?may?not?use?this?file?except?in?compliance?with?the?License.?
  • ?*?You?may?obtain?a?copy?of?the?License?at?
  • ?*???
  • ?*??????http://www.apache.org/licenses/LICENSE-2.0?
  • ?*???
  • ?*?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software?
  • ?*?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,?
  • ?*?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.?
  • ?*?See?the?License?for?the?specific?language?governing?permissions?and?
  • ?*?limitations?under?the?License.?
  • ?*/??
  • package?com.alibaba.dubbo.rpc.filter;??
  • ??
  • import?java.lang.reflect.Method;??
  • ??
  • import?com.alibaba.dubbo.common.Constants;??
  • import?com.alibaba.dubbo.common.extension.Activate;??
  • import?com.alibaba.dubbo.common.logger.Logger;??
  • import?com.alibaba.dubbo.common.logger.LoggerFactory;??
  • import?com.alibaba.dubbo.common.utils.ReflectUtils;??
  • import?com.alibaba.dubbo.common.utils.StringUtils;??
  • import?com.alibaba.dubbo.rpc.Filter;??
  • import?com.alibaba.dubbo.rpc.Invocation;??
  • import?com.alibaba.dubbo.rpc.Invoker;??
  • import?com.alibaba.dubbo.rpc.Result;??
  • import?com.alibaba.dubbo.rpc.RpcContext;??
  • import?com.alibaba.dubbo.rpc.RpcException;??
  • import?com.alibaba.dubbo.rpc.RpcResult;??
  • import?com.alibaba.dubbo.rpc.service.GenericService;??
  • ??
  • /**?
  • ?*?ExceptionInvokerFilter?
  • ?*?<p>?
  • ?*?功能:?
  • ?*?<ol>?
  • ?*?<li>不期望的異常打ERROR日志(Provider端)<br>?
  • ?*?????不期望的日志即是,沒有的接口上聲明的Unchecked異常。?
  • ?*?<li>異常不在API包中,則Wrap一層RuntimeException。<br>?
  • ?*?????RPC對于第一層異常會直接序列化傳輸(Cause異常會String化),避免異常在Client出不能反序列化問題。?
  • ?*?</ol>?
  • ?*??
  • ?*?@author?william.liangf?
  • ?*?@author?ding.lid?
  • ?*/??
  • @Activate(group?=?Constants.PROVIDER)??
  • public?class?ExceptionFilter?implements?Filter?{??
  • ??
  • ????private?final?Logger?logger;??
  • ??????
  • ????public?ExceptionFilter()?{??
  • ????????this(LoggerFactory.getLogger(ExceptionFilter.class));??
  • ????}??
  • ??????
  • ????public?ExceptionFilter(Logger?logger)?{??
  • ????????this.logger?=?logger;??
  • ????}??
  • ??????
  • ????public?Result?invoke(Invoker<?>?invoker,?Invocation?invocation)?throws?RpcException?{??
  • ????????try?{??
  • ????????????Result?result?=?invoker.invoke(invocation);??
  • ????????????if?(result.hasException()?&&?GenericService.class?!=?invoker.getInterface())?{??
  • ????????????????try?{??
  • ????????????????????Throwable?exception?=?result.getException();??
  • ??
  • ????????????????????//?如果是checked異常,直接拋出??
  • ????????????????????if?(!?(exception?instanceof?RuntimeException)?&&?(exception?instanceof?Exception))?{??
  • ????????????????????????return?result;??
  • ????????????????????}??
  • ????????????????????//?在方法簽名上有聲明,直接拋出??
  • ????????????????????try?{??
  • ????????????????????????Method?method?=?invoker.getInterface().getMethod(invocation.getMethodName(),?invocation.getParameterTypes());??
  • ????????????????????????Class<?>[]?exceptionClassses?=?method.getExceptionTypes();??
  • ????????????????????????for?(Class<?>?exceptionClass?:?exceptionClassses)?{??
  • ????????????????????????????if?(exception.getClass().equals(exceptionClass))?{??
  • ????????????????????????????????return?result;??
  • ????????????????????????????}??
  • ????????????????????????}??
  • ????????????????????}?catch?(NoSuchMethodException?e)?{??
  • ????????????????????????return?result;??
  • ????????????????????}??
  • ??
  • ????????????????????//?未在方法簽名上定義的異常,在服務器端打印ERROR日志??
  • ????????????????????logger.error("Got?unchecked?and?undeclared?exception?which?called?by?"?+?RpcContext.getContext().getRemoteHost()??
  • ????????????????????????????+?".?service:?"?+?invoker.getInterface().getName()?+?",?method:?"?+?invocation.getMethodName()??
  • ????????????????????????????+?",?exception:?"?+?exception.getClass().getName()?+?":?"?+?exception.getMessage(),?exception);??
  • ??
  • ????????????????????//?異常類和接口類在同一jar包里,直接拋出??
  • ????????????????????String?serviceFile?=?ReflectUtils.getCodeBase(invoker.getInterface());??
  • ????????????????????String?exceptionFile?=?ReflectUtils.getCodeBase(exception.getClass());??
  • ????????????????????if?(serviceFile?==?null?||?exceptionFile?==?null?||?serviceFile.equals(exceptionFile)){??
  • ????????????????????????return?result;??
  • ????????????????????}??
  • ????????????????????//?是JDK自帶的異常,直接拋出??
  • ????????????????????String?className?=?exception.getClass().getName();??
  • ????????????????????if?(className.startsWith("java.")?||?className.startsWith("javax."))?{??
  • ????????????????????????return?result;??
  • ????????????????????}??
  • ????????????????????//?是Dubbo本身的異常,直接拋出??
  • ????????????????????if?(exception?instanceof?RpcException)?{??
  • ????????????????????????return?result;??
  • ????????????????????}??
  • ??
  • ????????????????????//?否則,包裝成RuntimeException拋給客戶端??
  • ????????????????????return?new?RpcResult(new?RuntimeException(StringUtils.toString(exception)));??
  • ????????????????}?catch?(Throwable?e)?{??
  • ????????????????????logger.warn("Fail?to?ExceptionFilter?when?called?by?"?+?RpcContext.getContext().getRemoteHost()??
  • ????????????????????????????+?".?service:?"?+?invoker.getInterface().getName()?+?",?method:?"?+?invocation.getMethodName()??
  • ????????????????????????????+?",?exception:?"?+?e.getClass().getName()?+?":?"?+?e.getMessage(),?e);??
  • ????????????????????return?result;??
  • ????????????????}??
  • ????????????}??
  • ????????????return?result;??
  • ????????}?catch?(RuntimeException?e)?{??
  • ????????????logger.error("Got?unchecked?and?undeclared?exception?which?called?by?"?+?RpcContext.getContext().getRemoteHost()??
  • ????????????????????+?".?service:?"?+?invoker.getInterface().getName()?+?",?method:?"?+?invocation.getMethodName()??
  • ????????????????????+?",?exception:?"?+?e.getClass().getName()?+?":?"?+?e.getMessage(),?e);??
  • ????????????throw?e;??
  • ????????}??
  • ????}??
  • ??
  • }??
  • 代碼分析

    按邏輯順序進行分析,滿足其中一個即返回,不再繼續執行判斷。

    邏輯0

    [java]?view plaincopy
  • if?(result.hasException()?&&?GenericService.class?!=?invoker.getInterface())?{??
  • ????//...??
  • }??
  • return?result;??
  • 調用結果有異常且未實現GenericService接口,進入后續判斷邏輯,否則直接返回結果。 [java]?view plaincopy
  • /**?
  • ?*?通用服務接口?
  • ?*??
  • ?*?@author?william.liangf?
  • ?*?@export?
  • ?*/??
  • public?interface?GenericService?{??
  • ??
  • ????/**?
  • ?????*?泛化調用?
  • ?????*??
  • ?????*?@param?method?方法名,如:findPerson,如果有重載方法,需帶上參數列表,如:findPerson(java.lang.String)?
  • ?????*?@param?parameterTypes?參數類型?
  • ?????*?@param?args?參數列表?
  • ?????*?@return?返回值?
  • ?????*?@throws?Throwable?方法拋出的異常?
  • ?????*/??
  • ????Object?$invoke(String?method,?String[]?parameterTypes,?Object[]?args)?throws?GenericException;??
  • ??
  • }??
  • 泛接口實現方式主要用于服務器端沒有API接口及模型類元的情況,參數及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:實現一個通用的遠程服務Mock框架,可通過實現GenericService接口處理所有服務請求。
    不適用于此場景,不在此處探討。

    邏輯1

    [java]?view plaincopy
  • //?如果是checked異常,直接拋出??
  • if?(!?(exception?instanceof?RuntimeException)?&&?(exception?instanceof?Exception))?{??
  • ????return?result;??
  • }??
  • 不是RuntimeException類型的異常,并且是受檢異常(繼承Exception),直接拋出。
    provider端想拋出受檢異常,必須在api上明確寫明拋出受檢異常;consumer端如果要處理受檢異常,也必須使用明確寫明拋出受檢異常的api。
    provider端api新增 自定義的 受檢異常, 所有的 consumer端api都必須升級,同時修改代碼,否則無法處理這個特定異常。
    consumer端DecodeableRpcResult的decode方法會對異常進行處理


    此處會拋出IOException,上層catch后會做toString處理,放到mErrorMsg屬性中: [java]?view plaincopy
  • try?{??
  • ????decode(channel,?inputStream);??
  • }?catch?(Throwable?e)?{??
  • ????if?(log.isWarnEnabled())?{??
  • ????????log.warn("Decode?rpc?result?failed:?"?+?e.getMessage(),?e);??
  • ????}??
  • ????response.setStatus(Response.CLIENT_ERROR);??
  • ????response.setErrorMessage(StringUtils.toString(e));??
  • }?finally?{??
  • ????hasDecoded?=?true;??
  • }??

  • DefaultFuture判斷請求返回的結果,最后拋出RemotingException: [java]?view plaincopy
  • private?Object?returnFromResponse()?throws?RemotingException?{??
  • ????Response?res?=?response;??
  • ????if?(res?==?null)?{??
  • ????????throw?new?IllegalStateException("response?cannot?be?null");??
  • ????}??
  • ????if?(res.getStatus()?==?Response.OK)?{??
  • ????????return?res.getResult();??
  • ????}??
  • ????if?(res.getStatus()?==?Response.CLIENT_TIMEOUT?||?res.getStatus()?==?Response.SERVER_TIMEOUT)?{??
  • ????????throw?new?TimeoutException(res.getStatus()?==?Response.SERVER_TIMEOUT,?channel,?res.getErrorMessage());??
  • ????}??
  • ????throw?new?RemotingException(channel,?res.getErrorMessage());??
  • }??

  • DubboInvoker捕獲RemotingException,拋出RpcException: [java]?view plaincopy
  • try?{??
  • ????boolean?isAsync?=?RpcUtils.isAsync(getUrl(),?invocation);??
  • ????boolean?isOneway?=?RpcUtils.isOneway(getUrl(),?invocation);??
  • ????int?timeout?=?getUrl().getMethodParameter(methodName,?Constants.TIMEOUT_KEY,Constants.DEFAULT_TIMEOUT);??
  • ????if?(isOneway)?{??
  • ????????boolean?isSent?=?getUrl().getMethodParameter(methodName,?Constants.SENT_KEY,?false);??
  • ????????currentClient.send(inv,?isSent);??
  • ????????RpcContext.getContext().setFuture(null);??
  • ????????return?new?RpcResult();??
  • ????}?else?if?(isAsync)?{??
  • ????????ResponseFuture?future?=?currentClient.request(inv,?timeout)?;??
  • ????????RpcContext.getContext().setFuture(new?FutureAdapter<Object>(future));??
  • ????????return?new?RpcResult();??
  • ????}?else?{??
  • ????????RpcContext.getContext().setFuture(null);??
  • ????????return?(Result)?currentClient.request(inv,?timeout).get();??
  • ????}??
  • }?catch?(TimeoutException?e)?{??
  • ????throw?new?RpcException(RpcException.TIMEOUT_EXCEPTION,?"Invoke?remote?method?timeout.?method:?"?+?invocation.getMethodName()?+?",?provider:?"?+?getUrl()?+?",?cause:?"?+?e.getMessage(),?e);??
  • }?catch?(RemotingException?e)?{??
  • ????throw?new?RpcException(RpcException.NETWORK_EXCEPTION,?"Failed?to?invoke?remote?method:?"?+?invocation.getMethodName()?+?",?provider:?"?+?getUrl()?+?",?cause:?"?+?e.getMessage(),?e);??
  • }??

  • 調用棧:
    FailOverClusterInvoker.doInvoke -...-> DubboInvoker.doInvoke -> ReferenceCountExchangeClient.request -> HeaderExchangeClient.request -> HeaderExchangeChannel.request -> AbstractPeer.send -> NettyChannel.send -> AbstractChannel.write -> Channels.write --back_to--> DubboInvoker.doInvoke -> DefaultFuture.get -> DefaultFuture.returnFromResponse -> throw new RemotingException 異常示例: [java]?view plaincopy
  • com.alibaba.dubbo.rpc.RpcException:?Failed?to?invoke?the?method?triggerCheckedException?in?the?service?com.xxx.api.DemoService.?Tried?1?times?of?the?providers?[192.168.1.101:20880]?(1/1)?from?the?registry?127.0.0.1:2181?on?the?consumer?192.168.1.101?using?the?dubbo?version?3.1.9.?Last?error?is:?Failed?to?invoke?remote?method:?triggerCheckedException,?provider:?dubbo://192.168.1.101:20880/com.xxx.api.DemoService?xxx,?cause:?java.io.IOException:?Response?data?error,?expect?Throwable,?but?get?{cause=(this?Map),?detailMessage=null,?suppressedExceptions=[],?stackTrace=[Ljava.lang.StackTraceElement;@23b84919}??
  • java.io.IOException:?Response?data?error,?expect?Throwable,?but?get?{cause=(this?Map),?detailMessage=null,?suppressedExceptions=[],?stackTrace=[Ljava.lang.StackTraceElement;@23b84919}??
  • ????at?com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:94)??
  • ?

    邏輯2

    [java]?view plaincopy
  • //?在方法簽名上有聲明,直接拋出??
  • try?{??
  • ????Method?method?=?invoker.getInterface().getMethod(invocation.getMethodName(),?invocation.getParameterTypes());??
  • ????Class<?>[]?exceptionClassses?=?method.getExceptionTypes();??
  • ????for?(Class<?>?exceptionClass?:?exceptionClassses)?{??
  • ????????if?(exception.getClass().equals(exceptionClass))?{??
  • ????????????return?result;??
  • ????????}??
  • ????}??
  • }?catch?(NoSuchMethodException?e)?{??
  • ????return?result;??
  • }??
  • 如果在provider端的api明確寫明拋出運行時異常,則會直接被拋出。 如果拋出了這種異常,但是consumer端又沒有這種異常,會發生什么呢?
    答案是和上面一樣,拋出RpcException。

    因此如果consumer端不care這種異常,則不需要任何處理;
    consumer端有這種異常(路徑要完全一致,包名+類名),則不需要任何處理;
    沒有這種異常,又想進行處理,則需要引入這個異常進行處理(方法有多種,比如升級api,或引入/升級異常所在的包)。

    邏輯3

    [java]?view plaincopy
  • //?異常類和接口類在同一jar包里,直接拋出??
  • String?serviceFile?=?ReflectUtils.getCodeBase(invoker.getInterface());??
  • String?exceptionFile?=?ReflectUtils.getCodeBase(exception.getClass());??
  • if?(serviceFile?==?null?||?exceptionFile?==?null?||?serviceFile.equals(exceptionFile)){??
  • ????return?result;??
  • }??
  • 如果異常類和接口類在同一個jar包中,直接拋出。

    邏輯4

    [java]?view plaincopy
  • //?是JDK自帶的異常,直接拋出??
  • String?className?=?exception.getClass().getName();??
  • if?(className.startsWith("java.")?||?className.startsWith("javax."))?{??
  • ????return?result;??
  • }??
  • 以java.或javax.開頭的異常直接拋出。

    邏輯5

    [java]?view plaincopy
  • //?是Dubbo本身的異常,直接拋出??
  • if?(exception?instanceof?RpcException)?{??
  • ????return?result;??
  • }??
  • dubbo自身的異常,直接拋出。

    邏輯6

    [java]?view plaincopy
  • //?否則,包裝成RuntimeException拋給客戶端??
  • return?new?RpcResult(new?RuntimeException(StringUtils.toString(exception)));??
  • 不滿足上述條件,會做toString處理并被封裝成RuntimeException拋出。

    核心思想

    盡力避免反序列化時失敗(只有在jdk版本或api版本不一致時才可能發生)。

    如何正確捕獲業務異常

    了解了ExceptionFilter,解決上面提到的問題就很簡單了。 有多種方法可以解決這個問題,每種都有優缺點,這里不做詳細分析,僅列出供參考: 1.?將該異常的包名以"java.或者"javax. " 開頭 2.?使用受檢異常(繼承Exception) 3.?不用異常,使用錯誤碼 4.?把異常放到provider-api的jar包中 5.?判斷異常message是否以XxxException.class.getName()開頭(其中XxxException是自定義的業務異常) 6.?provider實現GenericService接口 7.?provider的api明確寫明throws XxxException,發布provider(其中XxxException是自定義的業務異常) 8. 實現dubbo的filter,自定義provider的異常處理邏輯(方法可參考之前的文章給dubbo接口添加白名單——dubbo Filter的使用)

    ?給dubbo接口添加白名單——dubbo Filter的使用具體內容如下:

    在開發中,有時候需要限制訪問的權限,白名單就是一種方法。對于Java Web應用,Spring的攔截器可以攔截Web接口的調用;而對于dubbo接口,Spring的攔截器就不管用了。

    dubbo提供了Filter擴展,可以通過自定義Filter來實現這個功能。本文通過一個事例來演示如何實現dubbo接口的IP白名單。

    ?

  • 擴展Filter
    實現com.alibaba.dubbo.rpc.Filter接口:
    [java]?view plaincopy
  • public?class?AuthorityFilter?implements?Filter?{??
  • ????private?static?final?Logger?LOGGER?=?LoggerFactory.getLogger(AuthorityFilter.class);??
  • ??
  • ????private?IpWhiteList?ipWhiteList;??
  • ??
  • ????//dubbo通過setter方式自動注入??
  • ????public?void?setIpWhiteList(IpWhiteList?ipWhiteList)?{??
  • ????????this.ipWhiteList?=?ipWhiteList;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?Result?invoke(Invoker<?>?invoker,?Invocation?invocation)?throws?RpcException?{??
  • ????????if?(!ipWhiteList.isEnabled())?{??
  • ????????????LOGGER.debug("白名單禁用");??
  • ????????????return?invoker.invoke(invocation);??
  • ????????}??
  • ??
  • ????????String?clientIp?=?RpcContext.getContext().getRemoteHost();??
  • ????????LOGGER.debug("訪問ip為{}",?clientIp);??
  • ????????List<String>?allowedIps?=?ipWhiteList.getAllowedIps();??
  • ????????if?(allowedIps.contains(clientIp))?{??
  • ????????????return?invoker.invoke(invocation);??
  • ????????}?else?{??
  • ????????????return?new?RpcResult();??
  • ????????}??
  • ????}??
  • }??
  • 注意:只能通過setter方式來注入其他的bean,且不要標注注解!
    dubbo自己會對這些bean進行注入,不需要再標注@Resource讓Spring注入,參見擴展點加載
  • 配置文件
    參考:調用攔截擴展
    在resources目錄下添加純文本文件META-INF/dubbo/com.alibaba.dubbo.rpc.Filter,內容如下:
    [plain]?view plaincopy
  • xxxFilter=com.xxx.AuthorityFilter??
  • 修改dubbo的provider配置文件,在dubbo:provider中添加配置的filter,如下:
    [html]?view plaincopy
  • <dubbo:provider?filter="xxxFilter"?/>??
  • 這樣就可以實現dubbo接口的IP白名單功能了。

    ?

    轉載于:https://www.cnblogs.com/xuwc/p/8974709.html

    總結

    以上是生活随笔為你收集整理的dubbo超时重试和异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日韩大片在线观看 | 成人黄大片视频在线观看 | 久久观看最新视频 | 久久久精品国产一区二区 | 亚洲成年片 | 超碰在线天天 | 色婷婷狠狠五月综合天色拍 | 亚洲 综合 激情 | 日日婷婷夜日日天干 | 久久久一本精品99久久精品66 | 在线观看日韩一区 | 亚洲丁香日韩 | 91在线中文 | 欧美日韩免费视频 | 91色在线观看 | 美女国产 | 91免费观看视频网站 | av高清网站在线观看 | 久久99免费观看 | 激情综合久久 | 日韩亚洲国产中文字幕 | 丝袜少妇在线 | 69国产精品视频免费观看 | 国产九九精品视频 | 日韩电影在线视频 | 色综合天天综合网国产成人网 | 天天插天天干 | 一区二区视频欧美 | 亚洲va欧美va国产va黑人 | 91天堂影院 | 黄色日批网站 | 最近中文字幕久久 | av中文在线观看 | 国产精品毛片久久蜜 | 亚洲国产色一区 | 国产69熟 | 日韩av一区二区在线 | 中文字幕在线播放av | 久久人操| 97在线公开视频 | 99草视频 | 日韩r级电影在线观看 | 国产不卡在线看 | 992tv在线成人免费观看 | 97视频久久久 | 三级黄色在线 | 国产亚洲精品电影 | 在线观看的av网站 | av一级二级| 一区二区三区四区五区六区 | av资源免费看 | 亚洲久草在线视频 | 国产精品综合在线观看 | 中文字幕在线观看一区 | 久久久久久久久久久网站 | 91伊人| 91资源在线播放 | 午夜丁香视频在线观看 | 欧美精品亚洲精品日韩精品 | 日本激情动作片免费看 | 亚州国产精品久久久 | 99在线热播精品免费 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 处女av在线| 亚洲最大成人免费网站 | 有码一区二区三区 | 99精品国产99久久久久久97 | 精品国产一区二区三区在线观看 | 激情综合婷婷 | 日韩乱码中文字幕 | 久久视频二区 | 干天天 | 欧美性生活一级片 | 免费在线看成人av | 91日韩在线专区 | 久久免费片 | 狠狠色噜噜狠狠狠狠2022 | 久久精品国产亚洲精品2020 | 黄色91免费观看 | 久草在线这里只有精品 | 九九热在线视频 | 色综合色综合久久综合频道88 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 中文字幕超清在线免费 | 日韩免费三区 | 色姑娘综合网 | 久久99久久精品 | 日本精品久久 | 人人超碰在线 | 激情在线网址 | 日韩精品久久久 | 热久久免费视频 | 亚洲一区二区观看 | 夜夜骑天天操 | 午夜精品一区二区三区视频免费看 | 久久国产a | 麻豆视频免费网站 | 97香蕉超级碰碰久久免费软件 | 99视频在线免费播放 | 韩国在线一区二区 | 国产精品视频在线看 | 久久国产精品系列 | 日韩免费一区二区在线观看 | 99热精品免费观看 | 美女网站视频免费都是黄 | 国产成人精品一区二区三区在线观看 | 韩国三级在线一区 | 国产淫片免费看 | 色综合久久久久 | 天无日天天操天天干 | 视频一区二区在线观看 | 丰满少妇在线观看 | 久草香蕉在线视频 | 婷婷色视频 | 成人一区在线观看 | 亚洲视频在线播放 | 怡春院av| 日韩免费在线视频观看 | av综合在线观看 | 欧美在线观看小视频 | 久久免费视频这里只有精品 | 亚洲在线成人精品 | 免费视频区| 日韩欧美视频二区 | 久久av影视 | 国产精品视频99 | 国产亚洲高清视频 | 亚洲精品视频免费在线观看 | 欧美日韩视频免费看 | 国产精品视频永久免费播放 | 久久国产精品久久国产精品 | 韩国一区二区在线观看 | 国产91精品一区二区麻豆亚洲 | 日韩天天干| 少妇bbw搡bbbb搡bbb | 久久国产网| 五月婷婷在线视频观看 | 日韩一区二区在线免费观看 | 国产精品k频道 | 亚洲日本中文字幕在线观看 | 国产日韩在线视频 | 爱射综合 | 天天曰视频 | 久久婷婷色综合 | 久久伊人操 | 色鬼综合网| av在观看| 在线亚洲日本 | 国产成人精品在线播放 | 日韩电影一区二区三区 | 国产又黄又爽又猛视频日本 | 午夜精品久久 | 国产一级黄色电影 | 91精品啪啪| 五月婷婷色综合 | 国产在线视频不卡 | 日韩在线观看影院 | a在线免费观看视频 | 91在线资源 | 国产五月天婷婷 | 国产精品久久久久久婷婷天堂 | 伊人影院在线观看 | 欧美性大胆 | 亚洲综合激情 | 欧美日韩不卡在线观看 | 午夜黄网| 婷婷激情综合 | 97超在线 | 天无日天天操天天干 | 韩国在线一区二区 | 国产午夜精品免费一区二区三区视频 | 国产中文字幕在线播放 | 91在线操 | 中文字幕在线免费播放 | 婷婷丁香狠狠爱 | 亚洲国产精品99久久久久久久久 | 天天射天天干天天操 | 一区二区精品久久 | 亚洲高清资源 | 国产精品入口66mio女同 | 99久久精品网 | 婷婷国产一区二区三区 | 国产手机在线观看视频 | 久久久久久久久久久成人 | 91精品国产综合久久福利 | 超碰在97| 亚洲精品久久久蜜桃 | 中文字幕av全部资源www中文字幕在线观看 | 久久精品国产精品亚洲 | 天天色天天操天天爽 | 日本黄色免费看 | 91福利视频免费 | 日韩精品一区二区电影 | 国产一区二区精品在线 | 亚洲精品999 | 国产一区在线精品 | 99精品久久久 | 国产高清视频在线播放 | 日日碰夜夜爽 | 久久精品网站视频 | 国产精品美女久久久免费 | 久久99精品国产91久久来源 | 国产精品24小时在线观看 | 国产美女视频免费观看的网站 | 亚洲成人黄色av | 久久综合成人网 | 久久久精品国产一区二区三区 | 色婷婷综合视频在线观看 | 精品一区精品二区高清 | www.久草.com| 综合网在线视频 | 99久久影院 | 四虎亚洲精品 | 四季av综合网站 | 99免费在线视频观看 | 久久综合九色综合久99 | 98福利在线| 久久在线电影 | 色av男人的天堂免费在线 | 久久无码av一区二区三区电影网 | 国产一级电影在线 | 欧美日韩电影在线播放 | 国产视频一二区 | 99超碰在线观看 | av一区二区三区在线观看 | 亚洲精品色婷婷 | 日韩一区二区三免费高清在线观看 | 欧美精品免费视频 | 韩日在线一区 | 综合网成人 | 麻豆视频国产 | 久久久久久久久久久免费av | 午夜精品视频免费在线观看 | 深夜福利视频在线观看 | 久久久鲁 | 欧美a√大片 | 九九热只有这里有精品 | 免费的国产精品 | 777奇米四色| 久久乱码卡一卡2卡三卡四 五月婷婷久 | 久草电影免费在线观看 | 丰满少妇高潮在线观看 | 亚洲黄色在线观看 | 日本爽妇网 | 九九激情视频 | 日本中文字幕网址 | 国产精品男女 | 国产黄色特级片 | 国产第一页在线播放 | 91成人在线视频观看 | 免费在线视频一区二区 | 视频 国产区 | 97香蕉超级碰碰久久免费软件 | 国产黄色一级大片 | 免费三级网 | 96av在线视频 | 午夜精品电影一区二区在线 | 免费精品视频在线 | 欧美视频国产视频 | 天天狠狠干| 夜添久久精品亚洲国产精品 | 狠狠操狠狠插 | 91免费视频黄 | 在线国产视频一区 | 国产日韩欧美在线观看 | 在线免费观看的av | 欧美精品一区二区蜜臀亚洲 | 久久精品一级片 | 久久久精品视频网站 | 久草视频在线资源 | 欧美色综合天天久久综合精品 | 亚洲国产av精品毛片鲁大师 | 国产精品美女毛片真酒店 | 国产乱码精品一区二区三区介绍 | av免费观看高清 | 丁香婷婷色综合亚洲电影 | 中中文字幕av在线 | 91精品国产99久久久久 | 国产又黄又猛又粗 | 日韩久久久久久久久 | 黄色软件在线看 | 日韩欧美视频二区 | 欧美99精品 | 91亚色免费视频 | www狠狠操 | 日韩精品一区电影 | 在线观看黄色小视频 | 在线免费中文字幕 | 精品视频久久久久久 | 午夜91在线 | 精品福利网 | 日日干综合 | 国产一级免费电影 | 在线观看91 | 国产精品成人免费精品自在线观看 | 成人网在线免费视频 | 日韩高清免费在线观看 | 91完整视频 | 亚洲国产av精品毛片鲁大师 | av在线最新 | 天天干中文字幕 | 国产自产在线视频 | 国产欧美精品一区二区三区四区 | 久久综合9988久久爱 | 免费成人黄色片 | 欧美在线视频一区二区三区 | 午夜影视剧场 | 91精品老司机久久一区啪 | 美女视频一区二区 | 国产精品国产三级国产专区53 | 四虎免费在线观看 | 国产又粗又猛又黄 | 亚洲人人爱 | 天堂av观看 | 日韩在线观看视频中文字幕 | 国产午夜精品免费一区二区三区视频 | 香蕉久久久久久av成人 | 亚洲精品国产第一综合99久久 | 超黄视频网站 | 视频在线精品 | 国产精品久久伊人 | 欧美黑人xxxx猛性大交 | 国产尤物视频在线 | 伊人永久 | 国产精品不卡在线观看 | 亚洲无吗av | 蜜桃麻豆www久久囤产精品 | 中文字幕在线免费播放 | 久久人人爽av | 日本精品视频在线观看 | 亚洲综合成人av | 日韩在线观看中文字幕 | 久久免费毛片 | 亚洲涩涩涩涩涩涩 | 免费在线观看的av网站 | 日韩电影精品一区 | 91视频麻豆 | 久久超级碰视频 | 免费黄在线观看 | 久久九九国产精品 | 国产精品久久久久av福利动漫 | 精品国产诱惑 | 日韩在线视频免费看 | 毛片的网址 | 视频在线观看一区 | 五月亚洲综合 | 国产五月婷婷 | 欧美精品一区二区三区四区在线 | 亚洲最新av网站 | 久久国产精品免费一区 | 亚洲成人av一区 | 亚洲色图av | 日本三级不卡 | 久久国产电影 | 麻豆视频在线免费观看 | 四虎最新域名 | 三日本三级少妇三级99 | 91九色精品国产 | 精品在线播放视频 | 久久综合狠狠综合久久综合88 | 天天操夜夜操夜夜操 | 国产午夜精品一区二区三区四区 | 久久夜色网 | 欧美国产不卡 | 欧美性色黄大片在线观看 | 天天弄天天操 | 成人小视频在线观看免费 | 天天色棕合合合合合合 | 日本性xxx| 蜜臀av性久久久久av蜜臀三区 | 天天综合久久 | 久久久久久久久网站 | 婷婷丁香激情综合 | 中日韩免费视频 | 91av在线免费播放 | av免费看av| 不卡国产在线 | 国产婷婷精品av在线 | 黄色毛片视频免费 | 99色网站| 久久久久久高潮国产精品视 | 婷婷av色综合 | av电影中文 | 99久久精品国产免费看不卡 | 精品欧美一区二区三区久久久 | 色中射| 亚洲激情校园春色 | 国产精品日韩高清 | 欧美日在线 | 精品视频一区在线观看 | 国产精品乱码久久久久 | 99精品欧美一区二区蜜桃免费 | 中文字幕在线高清 | 久久久久成人精品 | 国产在线观看一区 | 国产资源av | 天天射天天爽 | 国产精品毛片久久久久久 | 国产黄色网 | www.久久免费视频 | 人人爽人人看 | 超碰999 | 亚洲国产色一区 | 国产极品尤物在线 | 91网免费看 | 国产成人久久精品77777综合 | 国产欧美在线一区 | 精品综合久久久 | 521色香蕉网站在线观看 | 中文字幕乱码在线播放 | 欧美日韩国产一区二区在线观看 | 在线成人观看 | 欧洲精品久久久久毛片完整版 | 色五月情 | 久久久久福利视频 | 天天干com| 天天操天天色天天射 | 麻豆视频免费入口 | 国产高清在线免费观看 | 国产精品成人自产拍在线观看 | 青青河边草观看完整版高清 | 9在线观看免费高清完整版在线观看明 | japanesexxxxfreehd乱熟 | av最新资源| 97超碰中文字幕 | 中文字幕在线观 | 中文字幕传媒 | 在线看日韩av | 亚洲综合一区二区精品导航 | 91漂亮少妇露脸在线播放 | 蜜臀av性久久久久蜜臀av | 丝袜美腿av| 成片视频免费观看 | 亚洲精品视频免费 | 亚洲婷久久 | 亚洲视频免费在线观看 | 中文字幕乱码在线播放 | 不卡电影一区二区三区 | 久久久91精品国产一区二区精品 | aaawww| 久久人人爽人人片 | 亚洲一级黄色大片 | 久久久精品高清 | 超碰免费成人 | 久久综合精品国产一区二区三区 | 在线日韩中文字幕 | 91探花在线 | 丁香婷婷电影 | 99久久精品免费 | 91精品一区二区三区久久久久久 | 日韩欧美精品在线 | 99久久精品费精品 | 国产一级二级av | 97视频在线观看视频免费视频 | www.夜夜骑.com | 日本黄色免费播放 | 成人免费 在线播放 | 伊人午夜 | 国产成人在线免费观看 | 免费国产黄线在线观看视频 | 婷婷5月色| 色吊丝在线永久观看最新版本 | 五月天久久综合 | 97在线视频免费 | 91精品久久久久久久91蜜桃 | 岛国一区在线 | 成人性生交大片免费看中文网站 | 涩五月婷婷 | 国产一区网 | 久久精品亚洲一区二区三区观看模式 | 国产91精品在线观看 | 黄色avwww| 欧美在线观看视频 | 天堂av色婷婷一区二区三区 | 伊人久久精品久久亚洲一区 | 亚洲最大的av网站 | 久久久久久久久久久久久9999 | 色婷婷久久一区二区 | 国产女人40精品一区毛片视频 | 国产精品自产拍在线观看网站 | 看片黄网站 | 成人av资源在线 | 精品在线视频一区 | 国产在线小视频 | 五月婷婷在线视频观看 | 亚洲一级片在线观看 | 中文字幕第一页在线播放 | 国产午夜在线观看 | 国产精品免费久久 | 久久久久国产精品免费网站 | 天堂资源在线观看视频 | 成人av网站在线 | 日韩videos高潮hd | 91丨九色丨国产丨porny精品 | 一本一本久久a久久精品综合 | 日韩色中色 | 国产精品激情在线观看 | 午夜骚影 | 欧美日bb | 99久久精品免费看国产一区二区三区 | 久热免费在线 | 成人免费看电影 | 亚洲久草在线视频 | 在线国产一区二区三区 | 亚洲综合成人专区片 | 国产麻豆精品久久一二三 | 中文字幕精品一区久久久久 | 99理论片| 日韩激情久久 | 国产原创在线 | 中文字幕a在线 | 国产精品网在线观看 | 国产日韩视频在线观看 | 久久精品视频网站 | 制服丝袜一区二区 | 欧美另类亚洲 | 在线视频a | 国产美女精品视频 | 激情五月视频 | 人人狠| 亚洲人人射 | 成年人网站免费在线观看 | 免费日韩电影 | 91精品国产三级a在线观看 | 中文字幕一区二区三 | 色视频网站免费观看 | 国产免费一区二区三区网站免费 | 五月情婷婷 | 国产精品久久一区二区三区不卡 | 国产va在线观看免费 | 亚洲精选视频免费看 | 夜夜操夜夜干 | 爱av在线网| 国产乱视频 | 国产午夜精品理论片在线 | 91在线观看欧美日韩 | 国产精品免费久久久久影院仙踪林 | 久久久久久高潮国产精品视 | 久久精品8| 亚洲成年人免费网站 | 国产视频一区二区在线 | 久久99精品久久只有精品 | 亚洲国产成人av网 | 欧美视频xxx | 色综合在 | 国产美女免费 | 一区二区三区四区在线 | 日韩精品中文字幕久久臀 | 在线免费观看黄色av | 成人在线视频在线观看 | 黄色亚洲大片免费在线观看 | av在线网站大全 | 欧美日韩xxxxx| 国产特黄色片 | 青青河边草免费直播 | 成人久久久久 | 国产黄色片久久久 | 午夜精品久久久久久久99热影院 | 欧美日韩国产在线观看 | 国色天香av | 国产精品久久久久久久久毛片 | 欧美福利网站 | 久久精国产 | 特级黄色视频毛片 | 国产亚洲精品xxoo | 午夜久久福利影院 | 久久国产精品一国产精品 | 亚洲国产视频在线 | 欧美成人一区二区 | 亚洲精品久久久久999中文字幕 | 久久精品99国产国产 | 亚洲天堂精品视频 | 精品国产一区二区三区在线观看 | 久久精品国产成人 | 69av在线播放 | 国产丝袜一区二区三区 | 综合久久综合久久 | 精品久久久久久久久久久久久久久久久久 | 日本bbbb摸bbbb| 国内精品99| 久操免费视频 | 色窝资源| 久久夜夜爽| 婷香五月| 久久久久网站 | 亚洲综合色站 | 超碰人人做 | 在线观看一 | av视屏在线播放 | 国产黄色免费电影 | 日韩亚洲国产中文字幕 | 国产一区二区三区视频在线 | 99久久毛片 | 日本中文字幕电影在线免费观看 | 久久综合色天天久久综合图片 | av免费在线网站 | 99久久精品国产亚洲 | 天堂久久电影网 | 在线一区电影 | 国产成人av福利 | 亚洲3级 | 国产精品一区二区三区电影 | 国产一卡在线 | 国产精品无 | 欧美大片第1页 | 国产精品久久久久久久午夜片 | 久草视频免费在线播放 | 欧美精品乱码久久久久久按摩 | 天天干国产 | 久久精品一区二区 | www.亚洲黄 | 久草视频中文 | 精品一区二区久久久久久久网站 | 黄色三级网站在线观看 | 久久久久免费视频 | 日韩字幕| 天天干天天拍天天操天天拍 | 亚洲国产美女精品久久久久∴ | 手机成人在线电影 | 久久免费片| 97色婷婷人人爽人人 | 成人一级黄色片 | 国产裸体bbb视频 | 欧美动漫一区二区三区 | 在线观看国产www | 一区精品在线 | 97国产情侣爱久久免费观看 | 97精品国产97久久久久久春色 | 人人爽人人爽人人片av免 | 国产成人精品999在线观看 | 91麻豆精品国产91久久久更新时间 | 96国产在线 | 欧美日韩国产一二三区 | 久久人人爽人人人人片 | 国产伦精品一区二区三区… | av在线小说 | 黄色小说免费在线观看 | 99色国产 | 久久免费看av | av高清网站在线观看 | 99精品视频在线观看播放 | 欧美激情视频久久 | 99久久精品免费看国产一区二区三区 | 国产91在线观看 | 国产精品精 | 国产一级在线免费观看 | 欧美大香线蕉线伊人久久 | 欧美激情综合五月色丁香小说 | 久久九九影视网 | a在线观看免费视频 | 九九在线精品视频 | 99国产在线视频 | 日韩精品一区二区电影 | 99热这里只有精品1 av中文字幕日韩 | 国产精品久久久 | 狠狠干夜夜操天天爽 | 亚洲国产免费 | 免费看v片 | 美女免费视频黄 | 97在线影院 | 欧美99久久| 国产精品igao视频网入口 | 亚洲日日夜夜 | 国产欧美中文字幕 | 97成人精品区在线播放 | 国内精品久久久精品电影院 | 在线视频成人 | 一区二区三区精品在线视频 | 久久99国产精品视频 | 91麻豆精品一区二区三区 | 91色网址 | 综合中文字幕 | 视频一区视频二区在线观看 | 国产一级视频免费看 | 成 人 黄 色 免费播放 | 一区二区三区免费在线播放 | 久久精品久久久久电影 | 日韩av中文在线观看 | 伊人五月天婷婷 | 国产电影黄色av | 国产精品国产自产拍高清av | 丁香花在线视频观看免费 | 狠狠色丁香| www操操操| 亚洲91精品在线观看 | 久二影院 | 久久国语露脸国产精品电影 | 97自拍超碰| 久久久国产毛片 | www.玖玖玖| 超碰伊人网 | 国产三级在线播放 | 九九亚洲视频 | 波多野结衣在线观看视频 | 精品一区二三区 | 久草视频在线播放 | 国产视频在线免费观看 | 日韩字幕在线观看 | 日韩高清在线一区二区三区 | 久草www | 免费三级网 | 伊人网av | 天天爽天天射 | www.com久久久 | 麻豆视频免费在线观看 | 91资源在线观看 | 国产精品久久久久久一二三四五 | 日p视频 | 99精品99 | 欧美美女视频在线观看 | 91亚洲在线观看 | 精品视频免费播放 | 伊人久久五月天 | 久久伦理 | 51久久成人国产精品麻豆 | 成人免费观看在线视频 | 91在线免费播放视频 | 超碰在线网 | 国产日本在线播放 | 中文字幕在线看视频国产中文版 | 综合铜03| 久久精品国产精品 | 国产不卡片 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国产一级二级三级视频 | 久久精精品视频 | 日韩免费在线 | 97色se| 亚洲成人一区 | 色wwww| 久草在线综合网 | 大胆欧美gogo免费视频一二区 | 免费观看一级成人毛片 | 国产尤物视频在线 | 国产日韩在线一区 | 天天做天天爱天天综合网 | 午夜视频一区二区 | 91av观看 | 国产精品色视频 | 日本一区二区高清不卡 | 99精彩视频在线观看免费 | 456免费视频 | 一级精品视频在线观看宜春院 | 国产一级在线看 | 日韩特黄av | 日本老少交 | 亚洲午夜电影网 | 不卡视频一区二区三区 | 91av在线免费看 | 亚洲欧美国内爽妇网 | a级国产乱理伦片在线播放 久久久久国产精品一区 | av中文在线影视 | 日韩免费视频线观看 | 亚洲第一成网站 | 三级黄色a | 在线观影网站 | 97成人在线视频 | 96久久欧美麻豆网站 | 亚洲电影久久 | 久久人人爽人人爽人人片 | 国产小视频在线播放 | 伊人久久五月天 | av中文资源在线 | 欧美一区二区三区特黄 | 日日操操 | 久草色在线观看 | 欧美一级片免费 | 精品福利网站 | 日韩高清观看 | 福利视频入口 | 国产一级精品视频 | 天天夜夜亚洲 | 免费三级大片 | 免费在线 | 欧美成人免费在线 | 99re中文字幕 | 欧美精品久久久久久久久免 | 亚洲一区 影院 | 在线观看免费av片 | 99久热在线精品视频观看 | 国产女人40精品一区毛片视频 | 成人四虎影院 | 午夜精品久久久久久久99 | 中文字幕免费高清在线 | 欧美精品一区二区蜜臀亚洲 | 国产一二三精品 | 国产精品18久久久 | 精品国产伦一区二区三区免费 | 91传媒激情理伦片 | 一本一道久久a久久精品蜜桃 | 中文字幕人成人 | 99精品乱码国产在线观看 | 亚洲人xxx | 日韩午夜电影院 | 西西人体4444www高清视频 | 视频二区在线视频 | 久久视频在线免费观看 | 国产精品久久久久久久久久久杏吧 | 国产小视频国产精品 | 久草视频播放 | 在线免费观看视频a | 夜色在线资源 | 亚洲另类视频 | 国内精品久久久久久久久 | 91九色在线视频 | 精品视频免费久久久看 | 91精品国产欧美一区二区成人 | 啪嗒啪嗒免费观看完整版 | 免费v片| 一区二区三区四区久久 | 日韩视频在线不卡 | 涩涩网站在线播放 | 国产精品视频永久免费播放 | 日本护士撒尿xxxx18 | 免费网站黄色 | 99精品国自产在线 | 国产精品嫩草在线 | www久久精品 | 成人免费在线网 | 在线香蕉视频 | 久久综合色天天久久综合图片 | 日韩特级毛片 | 久久精品这里都是精品 | 视频精品一区二区三区 | 色全色在线资源网 | 中文字幕中文字幕 | 成人动漫视频在线 | 久久综合九色九九 | 国产中文字幕视频在线观看 | 成人app在线播放 | 高清久久久久久 | 日韩av影片在线观看 | 天天综合网 天天综合色 | 国内99视频 | 国产日韩精品在线观看 | 日韩性xxxx | 99在线看 | 不卡精品视频 | 欧美黑人xxxx猛性大交 | 黄色免费网站下载 | 激情丁香综合 | 992tv人人网tv亚洲精品 | 最新av在线免费观看 | 日韩欧美极品 | 亚洲狠狠干 | 色狠狠操 | 日韩午夜在线 | 日韩中文字幕视频在线观看 | 亚洲日本va午夜在线影院 | 中文字幕在线观看第三页 | 国产在线观看高清视频 | 国产午夜精品av一区二区 | 2022久久国产露脸精品国产 | 亚洲精品在线看 | 国产码电影 | 一区二区三区在线观看免费 | av在线色 | 天天狠狠| 视频国产区 | 99精品国产视频 | 国产黄网在线 | 黄色录像av | 四虎国产精品免费观看视频优播 | 99热超碰在线 | 正在播放国产91 | 国产午夜精品一区二区三区在线观看 | 日韩av一区二区在线 | 丁香婷婷综合激情 | 特级毛片在线 | 99热播精品 | 久久99精品国产99久久6尤 | 天天激情天天干 | 免费精品国产va自在自线 | 日韩在线免费视频观看 | 国产成人精品一二三区 | 亚洲精区二区三区四区麻豆 | 日韩理论在线视频 | 亚洲精品高清在线 | 91热这里只有精品 | 日韩影视在线 | 精品国内自产拍在线观看视频 | 国产精品精品久久久 | 超碰大片 | 国产剧情在线一区 | 一区二区国产精品 | 激情五月综合网 | 国产精品久久久久久爽爽爽 | 天天干夜夜 | 久久五月婷婷丁香 | 日日躁夜夜躁xxxxaaaa | 久久婷婷开心 | 国产福利小视频在线 | 国产亚洲久久 | 亚洲视频在线观看 | 国产成年人av | 99精品美女 | 黄网站app在线观看免费视频 | 欧美日韩免费观看一区=区三区 | 亚洲精品综合在线观看 | 国产精品乱码久久 | 天天色草 | 黄网站大全 | 欧美精品一区二区蜜臀亚洲 | 亚洲精品 在线视频 | 欧美激情片在线观看 | 在线 精品 国产 | 天天做日日做天天爽视频免费 | 国产日韩中文字幕 | 中文字幕一区二区在线播放 | 久久精品在线免费观看 | 久久夜夜夜 | 国产一区二区午夜 | 韩国视频一区二区三区 | 国产剧情在线一区 | 欧美一区二区伦理片 | 日韩国产精品毛片 | 国产99视频在线观看 | 日韩免费在线一区 | 最近中文字幕免费av | 999抗病毒口服液 | 国产裸体视频bbbbb | 人人爽人人爽人人爽 | 精品a视频 | 亚洲在线视频免费观看 | 国产一级视屏 | 国内一级片在线观看 | 91九色综合 | 国产精品一区二区在线看 | 国产日本在线观看 | 亚洲精品久久久久中文字幕m男 | 在线欧美日韩 | 免费视频黄色 | av日韩不卡 | 婷久久 | 国产男女免费完整视频 | 国产在线成人 | a在线观看免费视频 | 日韩欧美国产精品 | 成人一区二区三区中文字幕 | 国产精品福利在线观看 | 天天干天天在线 | 正在播放国产一区 | 狠狠色丁香九九婷婷综合五月 | 俺要去色综合狠狠 | 天天做夜夜做 | 国产亚洲日 | 亚洲欧美少妇 | 337p日本欧洲亚洲大胆裸体艺术 | 91亚洲精品国偷拍自产在线观看 | 97电影网站| 亚洲资源在线网 | 2020天天干夜夜爽 | 国产免费一区二区三区最新 | 亚洲专区欧美专区 | 岛国大片免费视频 | 色婷婷一区 | 欧美一进一出抽搐大尺度视频 | 粉嫩高清一区二区三区 | 亚洲国产中文在线观看 | 久久国产精品99国产精 | 日本久久高清视频 | 免费日韩电影 | 亚洲天天综合 | 精品久久一区二区三区 | 色综合色综合久久综合频道88 | 高清av在线免费观看 | 射久久久 | 99色视频 | 国产一区在线免费观看 | 欧美午夜精品久久久久久浪潮 | 亚洲欧美成人 | 国产精品18videosex性欧美 | 亚洲九九精品 | 五月天婷婷在线观看视频 | 中文字幕在线看 | 三级视频片 | 欧美成天堂网地址 | 精品国产一区二区三区久久久蜜臀 | 久久久久久久久久久久国产精品 | 超碰在线个人 | 91黄色在线观看 | 在线色视频小说 | 天天操操操操操操 | 很黄很色很污的网站 | 五月婷婷黄色 | 伊人影院av| 欧美日韩69 | 亚洲 欧美 另类人妖 | 久久免费视频这里只有精品 | 欧美另类sm图片 | 在线播放 日韩专区 | 中文字幕视频三区 | 国产精品久久久久久久久久白浆 | 亚洲狠狠丁香婷婷综合久久久 | va视频在线观看 | 国产一级不卡毛片 | 97超碰国产在线 | 中文字幕视频一区二区 |