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

一口氣說出“分布式追蹤系統”原理!

開發 架構 開發工具 分布式
在微服務架構中,一次請求往往涉及到多個模塊,多個中間件,多臺機器的相互協作才能完成。

 在微服務架構中,一次請求往往涉及到多個模塊,多個中間件,多臺機器的相互協作才能完成。

[[343625]]

 

圖片來自 Pexels

這一系列調用請求中,有些是串行的,有些是并行的,那么如何確定這個請求背后調用了哪些應用,哪些模塊,哪些節點及調用的先后順序?如何定位每個模塊的性能問題?本文將為你揭曉答案。

本文將會從以下幾個方面來闡述:

  • 分布式追蹤系統原理及作用
  • SkyWalking 的原理及架構設計
  • 我司在分布式調用鏈上的實踐

分布式追蹤系統的原理及作用

如何衡量一個接口的性能好壞,一般我們至少會關注以下三個指標:

  • 接口的 RT 你怎么知道?
  • 是否有異常響應?
  • 主要慢在哪里?

單體架構

在初期,公司剛起步的時候,可能多會采用如下單體架構,對于單體架構我們該用什么方式來計算以上三個指標呢?

 

最容易想到的顯然是用 AOP:

 

使用 AOP 在調用具體的業務邏輯前后分別打印一下時間即可計算出整體的調用時間,使用 AOP 來 catch 住異常也可知道是哪里的調用導致的異常。

微服務架構

在單體架構中由于所有的服務,組件都在一臺機器上,所以相對來說這些監控指標比較容易實現。

不過隨著業務的快速發展,單體架構必然會朝微服務架構發展,如下圖:

 

一個稍微復雜的微服務架構

如果有用戶反饋某個頁面很慢,我們知道這個頁面的請求調用鏈是A→C→B→D,此時如何定位可能是哪個模塊引起的問題。

每個服務 Service A,B,C,D 都有好幾臺機器。怎么知道某個請求調用了服務的具體哪臺機器呢?

 

可以明顯看到,由于無法準確定位每個請求經過的確切路徑,在微服務這種架構下有以下幾個痛點:

  • 排查問題難度大,周期長。
  • 特定場景難復現。
  • 系統性能瓶頸分析較難。

分布式調用鏈就是為了解決以上幾個問題而生,它主要的作用如下:

  • 自動采取數據。
  • 分析數據產生完整調用鏈:有了請求的完整調用鏈,問題有很大概率可復現。
  • 數據可視化:每個組件的性能可視化,能幫助我們很好地定位系統的瓶頸,及時找出問題所在。

通過分布式追蹤系統能很好地定位如下請求的每條具體請求鏈路,從而輕易地實現請求鏈路追蹤,每個模塊的性能瓶頸定位與分析。

分布式調用鏈標準:OpenTracing

 

知道了分布式調用鏈的作用,那我們來看下如何實現分布式調用鏈的實現及原理。

首先為了解決不同的分布式追蹤系統 API 不兼容的問題,誕生了 OpenTracing 規范。

OpenTracing 是一個輕量級的標準化層,它位于應用程序/類庫和追蹤或日志分析程序之間。

 

這樣 OpenTracing 通過提供平臺無關,廠商無關的 API,使得開發人員能夠方便地添加追蹤系統的實現。

說到這大家是否想過 Java 中類似的實現?還記得 JDBC 吧,通過提供一套標準的接口讓各個廠商去實現,程序員即可面對接口編程,不用關心具體的實現。

這里的接口其實就是標準,所以制定一套標準非常重要,可以實現組件的可插拔。

 

接下來我們來看 OpenTracing 的數據模型,主要有以下三個:

  • Trace:一個完整請求鏈路。
  • Span:一次調用過程(需要有開始時間和結束時間)。
  • SpanContext:Trace 的全局上下文信息,如里面有 TraceId。

理解這三個概念非常重要,為了讓大家更好地理解這三個概念,我特意畫了一張圖:

 

如圖示,一次下單的完整請求完整就是一個 Trace,顯然對于這個請求來說,必須要有一個全局標識來標識這一個請求,每一次調用就稱為一個 Span,每一次調用都要帶上全局的 TraceId。

這樣才可把全局 TraceId 與每個調用關聯起來,這個 TraceId 就是通過 SpanContext 傳輸的,既然要傳輸顯然都要遵循協議來調用。

如圖示,我們把傳輸協議比作車,把 SpanContext 比作貨,把 Span 比作路應該會更好理解一些。

理解了這三個概念,接下來我看看分布式追蹤系統如何采集統一圖中的微服務調用鏈。

 

我們可以看到底層有一個 Collector 一直在默默無聞地收集數據,那么每一次調用 Collector 會收集哪些信息呢?

  • 全局 trace_id:這是顯然的,這樣才能把每一個子調用與最初的請求關聯起來。
  • span_id:圖中的 0,1,1.1,2,這樣就能標識是哪一個調用。
  • parent_span_id:比如 b 調用 d 的 span_id 是 1.1,那么它的 parent_span_id 即為 a 調用 b 的 span_id 即 1,這樣才能把兩個緊鄰的調用關聯起來。

有了這些信息,Collector 收集的每次調用的信息如下:

根據這些圖表信息顯然可以據此來畫出調用鏈的可視化視圖如下:

 

于是一個完整的分布式追蹤系統就實現了。

以上實現看起來確實簡單,但有以下幾個問題需要我們仔細思考一下:

  • 怎么自動采集 Span 數據:自動采集,對業務代碼無侵入。
  • 如何跨進程傳遞 Context。
  • TraceId 如何保證全局唯一。
  • 請求量這么多采集會不會影響性能。

接下我來看看 SkyWalking 是如何解決以上四個問題的。

SkyWalking 的原理及架構設計

怎么自動采集 Span 數據

SkyWalking 采用了插件化+javaagent 的形式來實現了 Span 數據的自動采集。

這樣可以做到對代碼的無侵入性,插件化意味著可插拔,擴展性好(后文會介紹如何定義自己的插件)。

 

如何跨進程傳遞 Context

我們知道數據一般分為 Header 和 Body,就像 HTTPhttp 有 Header 和 Body,RocketMQ 也有 MessageHeader,Message Body。

Body 一般放著業務數據,所以不宜在 Body 中傳遞 Context,應該在 Header 中傳遞 Context,如圖示:

 

Dubbo 中的 Attachment 就相當于 Header,所以我們把 Context 放在 attachment 中,這樣就解決了 Context 的傳遞問題。

 

小提示:這里的傳遞 Context 流程均是在 Dubbo Plugin 處理的,業務無感知,這個 Plugin 是怎么實現的呢,下文會分析。

TraceId 如何保證全局唯一

要保證全局唯一 ,我們可以采用分布式或者本地生成的 ID,使用分布式話需要有一個發號器,每次請求都要先請求一下發號器,會有一次網絡調用的開銷。

所以 SkyWalking 最終采用了本地生成 ID 的方式,它采用了大名鼎鼎的 Snowflow 算法,性能很高。

 

Snowflake 算法生成的 id

不過 Snowflake 算法有一個眾所周知的問題:時間回撥,這個問題可能會導致生成的 id 重復。那么 SkyWalking 是如何解決時間回撥問題的呢。

 

每生成一個 id,都會記錄一下生成 id 的時間(lastTimestamp),如果發現當前時間比上一次生成 id 的時間(lastTimestamp)還小,那說明發生了時間回撥,此時會生成一個隨機數來作為 TraceId。

這里可能就有同學要較真了,可能會覺得生成的這個隨機數也會和已生成的全局 id 重復,是否再加一層校驗會好點。

這里要說一下系統設計上的方案取舍問題了,首先如果針對產生的這個隨機數作唯一性校驗無疑會多一層調用,會有一定的性能損耗。

但其實時間回撥發生的概率很小(發生之后由于機器時間紊亂,業務會受到很大影響,所以機器時間的調整必然要慎之又慎),再加上生成的隨機數重合的概率也很小,綜合考慮這里確實沒有必要再加一層全局惟一性校驗。

對于技術方案的選型,一定要避免過度設計,過猶不及。

全部采集會不會影響性能?

請求這么多,如果對每個請求調用都采集,那毫無疑問數據量會非常大,但反過來想一下,是否真的有必要對每個請求都采集呢。

其實沒有必要,我們可以設置采樣頻率,只采樣部分數據,SkyWalking 默認設置了 3 秒采樣 3 次,其余請求不采樣,如圖示:

 

這樣的采樣頻率其實足夠我們分析組件的性能了,按 3 秒采樣 3 次這樣的頻率來采樣數據會有啥問題呢。

理想情況下,每個服務調用都在同一個時間點(如下圖示)這樣的話每次都在同一時間點采樣確實沒問題。

 

但在生產上,每次服務調用基本不可能都在同一時間點調用,因為期間有網絡調用延時等,實際調用情況很可能是下圖這樣:

 

這樣的話就會導致某些調用在服務 A 上被采樣了,在服務 B,C 上不被采樣,也就沒法分析調用鏈的性能,那么 SkyWalking 是如何解決的呢。

它是這樣解決的:如果上游有攜帶 Context 過來(說明上游采樣了),則下游強制采集數據。這樣可以保證鏈路完整。

SkyWalking 的基礎架構

SkyWalking 的基礎如下架構,可以說幾乎所有的的分布式調用都是由以下幾個組件組成的:

 

首先當然是節點數據的定時采樣,采樣后將數據定時上報,將其存儲到 ES, MySQL 等持久化層,有了數據自然而然可根據數據做可視化分析。

SkyWalking 的性能如何

接下來大家肯定比較關心 SkyWalking 的性能,那我們來看下官方的測評數據:

 

圖中藍色代表未使用 SkyWalking 的表現,橙色代表使用了 SkyWalking 的表現,以上是在 TPS 為 5000 的情況下測出的數據。

可以看出,不論是 CPU,內存,還是響應時間,使用 SkyWalking 帶來的性能損耗幾乎可以忽略不計。

接下來我們再來看 SkyWalking 與另一款業界比較知名的分布式追蹤工具 Zipkin,Pinpoint 的對比(在采樣率為 1 秒 1 個,線程數 500,請求總數為 5000 的情況下做的對比)。

可以看到在關鍵的響應時間上 Zipkin(117ms),PinPoint(201ms)遠遜色于 SkyWalking(22ms)!

 

從性能損耗這個指標上看,SkyWalking 完勝!

再看下另一個指標:對代碼的侵入性如何,ZipKin 是需要在應用程序中埋點的,對代碼的侵入強,而 SkyWalking 采用 javaagent+插件化這種修改字節碼的方式可以做到對代碼無任何侵入。

除了性能和對代碼的侵入性上 SkyWaking 表現不錯外,它還有以下優勢幾個優勢:

  • 對多語言的支持,組件豐富:目前其支持 Java,.Net Core,PHP,NodeJS,Golang,LUA 語言,組件上也支持 Dubbo,MySQL 等常見組件,大部分能滿足我們的需求。
  • 擴展性:對于不滿足的插件,我們按照 SkyWalking 的規則手動寫一個即可,新實現的插件對代碼無入侵。

我司在分布式調用鏈上的實踐

SkyWalking 在我司的應用架構

由上文可知 SkyWalking 有很多優點,那么是不是我們用了它的全部組件了呢,其實不然,來看下其在我司的應用架構:

 

從圖中可以看出我們只采用了 SkyWalking 的 Agent 來進行采樣,放棄了另外的「數據上報及分析」,「數據存儲」,「數據可視化」三大組件。那為啥不直接采用 SkyWalking 的整套解決方案呢?

因為在接入 SkyWalking 之前我們的 Marvin 監控生態體系已經相對比較完善了。

如果把其整個替換成 SkyWalking,一來沒有必要,Marvin 在大多數場景下都能滿足我們的需求,二來系統替換成本高,三來如果重新接入用戶學習成本很高。

這也給我們一個啟示:任何產品搶占先機很重要,后續產品的替換成本會很高,搶占先機,也就是搶占了用戶的心智,這就像微信雖然 UI,功能上制作精良,但在國外照樣干不過 Whatsapp 一樣,因為先機已經沒了。

從另一方面來看,對架構來說,沒有最好的,最有最合適的,結合當前業務場景去平衡折中才是架構設計的本質。

我司對 SkyWalking 的改造實踐

我司主要作了以下改造和實踐:

  • 預發環境由于調試需要強制采樣
  • 實現更細粒度的采樣
  • 日志中嵌入 traceId
  • 自研實現了 SkyWalking 插件

①預發環境由于調試需要強制采樣

從上文分析可知 Collector 是在后臺定時采樣的,這不挺好的嗎,為啥要實現強制采樣呢。

還是為了排查定位問題,有時線上出現問題,我們希望在預發上能重現,希望能看到這個請求的完整調用鏈,所以在預發上實現強制采樣很有必要。

所以我們對 Skywalking 的 Dubbo 插件進行了改造,實現強制采樣。

我們在請求的 Cookie 上帶上一個類似 force_flag=true 這樣的鍵值對來表示我們希望強制采樣。

在網關收到這個 Cookie 后,就會在 Dubbo 的 Attachment 里帶上force_flag=true 這個鍵值對。

然后 Skywalking 的 Dubbo 插件就可以據此來判斷是否是強制采樣了,如果有這個值即強制采樣,如果沒有這個值,則走正常的定時采樣。

 

②實現更細粒度的采樣?

哈叫更細粒度的采樣。先來看下 Skywalking 默認的采樣方式 ,即統一采樣。

 

我們知道這種方式默認是 3 秒采樣前 3 次,其他請求都丟棄,這樣的話有個問題。

假設在這臺機器上在 3 秒內有多個 Dubbo,MySQL,Redis 調用,但在如果前三次都是 Dubbo 調用的話,其他像 MySQL,Redis 等調用就采樣不到了。

所以我們對 Skywalking 進行了改造,實現了分組采樣,如下:

就是說 3 秒內進行 3 次 Redis,Dubbo,MySQL 等的采樣,也就避免了此問題。

 

③日志中如何嵌入 TraceId?

輸出日志中嵌入 TraceId 便于我們排查問題,所以打出出 TraceId 非常有必要,該怎么在日志中嵌入 TraceId 呢?

我們用的是 log4j,這里就要了解一下 log4j 的插件機制了,log4j 允許我們自定義插件來輸出日志的格式,首先我們需要定義日志的格式,在自定義的日志格式中嵌入 %traceId,作為占位符,如下:

 

然后我們再實現一個 log4j 的插件,如下:

 

首先 log4j 的插件要定義一個類,這個類要繼承 LogEventPatternConverter 這個類,并且用標準 Plugin 將其自身聲明為 Plugin。

通過 @ConverterKeys 這個注解指定了要替換的占位符,然后在 format 方法里將其替換掉。

這樣在日志中就會出現我們想要的 TraceId,如下:

 

④我司自研了哪些 Skywalking 插件

SkyWalking 實現了很多插件,不過未提供 Memcached 和 Druid 的插件,所以我們根據其規范自研了這兩者的插件:

插件如何實現呢,可以看到它主要由三個部分組成:

 

  • 插件定義類:指定插件的定義類,最終會根據這里的定義類打包生成 plugin。
  • Instrumentation:指定切面,切點,要對哪個類的哪個方法進行增強。
  • Interceptor:指定步驟 2 中要在方法的前置,后置還是異常中寫增強邏輯。

可能大家看了還是不懂,那我們以 Dubbo Plugin 來簡單講解一下,我們知道在 Dubbo 服務中,每個請求從 Netty 接收到消息,遞交給業務線程池處理開始,到真正調用到業務方法結束,中間經過了十幾個 Filter 的處理:

 

而 MonitorFilter 可以攔截所有客戶端發出請求或者服務端處理請求,所以我們可以對 MonitorFilter 作增強。

在其調用 Invoke 方法前,將全局 TraceId 注入到其 Invocation 的 Attachment 中,這樣就可以確保在請求到達真正的業務邏輯前就已經存在全局 TraceId。

所以顯然我們需要在插件中指定我們要增強的類(MonitorFilter),對其方法(Invoke)做增強,要對這個方法做哪些增強呢?

這就是攔截器(Inteceptor)要做的事,來看看 Dubbo 插件中的 instrumentation(DubboInstrumentation):

 

我們再看看下代碼中描寫的攔截器(Inteceptor)干了什么事,以下列出關鍵步驟:

 

首先 beforeMethod 代表在執行 MonitorFilter 的 invoke 方法前會調用這里的方法,與之對應的是 afterMethod,代表在執行 invoke 方法后作增強邏輯。

其次我們從第 2,3 點可以看到,不管是 Consumer 還是 Provider, 都對其全局 ID 作了相應處理。

這樣確保到達真正的業務層的時候保證有了此全局 Traceid,定義好 Instrumentation 和 Interceptor 后,最后一步就是在 skywalking.def 里指定定義的類:

  1. // skywalking-plugin.def 文件 
  2. dubbo=org.apache.skywalking.apm.plugin.asf.dubbo.DubboInstrumentation 

這樣打包出來的插件就會對 MonitorFilter 的 Invoke 方法進行增強,在 Invoke 方法執行前對期 Attachment 作注入全局 TraceId 等操作,這一切都是靜默的,對代碼無侵入的。

總結

本文由淺入深地介紹了分布式追蹤系統的原理,相信大家對其作用及工作機制有了比較深的理解。

特別需要注意的是,引入某項技巧,一定要結合現有的技術架構作出最合理的選擇,就像 SkyWalking 有四個模塊,我司只采用其 Agent 采樣功能一樣,沒有最好的技術,只有最合適的技術。

通過此文,相信大家應該對 SkyWalking 的實現機制有了比較清晰的認識,文中只是介紹了一下 SkyWalking 的插件實現方式,不過其畢竟是工業級軟件,要了解其博大精深,還要多讀源碼哦。

作者:碼海

編輯:陶家龍

出處:轉載自公眾號碼海(ID:seaofcode)

責任編輯:武曉燕 來源: 碼海
相關推薦

2020-03-31 08:12:25

Kafka架構數據庫

2020-04-14 13:32:56

@Transacti失效場景

2020-07-31 10:15:32

分布式ID數據庫MySQL

2020-11-04 14:20:58

分布式數據庫MySQL

2020-07-10 07:44:26

Session方式Web

2022-05-24 11:50:46

延時消息分布式

2020-07-08 07:45:44

OAuth2.0授權

2020-04-16 12:42:42

附近的人共享單車App

2020-08-12 09:55:07

附近的人數據庫MySQL

2021-06-08 22:43:07

IPC方式Qt

2021-03-29 12:22:25

微信iOS蘋果

2021-12-06 08:30:49

SpringSpring Bean面試題

2025-05-14 01:55:00

FCMCPAI

2020-05-08 10:08:21

延時隊列APIDelayQueue

2023-12-18 23:09:25

開源優化引擎

2020-10-22 12:30:33

MySQL

2020-06-04 07:45:07

過濾器和攔截器

2021-05-18 09:03:16

Gomapslice

2024-01-29 00:29:49

通信技術行業

2024-04-26 09:40:10

項目精度丟失javascrip
點贊
收藏

51CTO技術棧公眾號

91国产成人在线| 97se亚洲国产综合在线| 日韩有码片在线观看| 国产不卡的av| 亚洲精品成人图区| 国产精品每日更新在线播放网址| 亚洲影影院av| 亚洲欧美自拍视频| 一精品久久久| 亚洲人在线视频| 极品人妻一区二区| 欧美黄色三级| 午夜欧美2019年伦理| 亚洲第一导航| 深夜福利视频在线免费观看| 日本va欧美va精品发布| 久久久午夜视频| 五月婷婷六月香| 久久久久久久久久久久久久久久久久久久| 欧美亚洲丝袜传媒另类| 搞av.com| 国产精品刘玥久久一区| 久久久久久一二三区| 成人xxxxx色| 中文字幕欧美在线观看| av成人黄色| 欧美日韩成人在线观看| 丁香激情五月少妇| 秋霞蜜臀av久久电影网免费| 日韩一区二区中文字幕| 亚洲最大综合网| 日韩伦理在线一区| 亚洲午夜在线视频| 日本道在线视频| 免费日本一区二区三区视频| 久久精品人人做| 久久久久高清| 天堂在线视频免费| 国产精品一二三区在线| 91久久中文字幕| 中文字幕在线观看第二页| 久久精品在线| 日本精品视频在线| 羞羞影院体验区| 国产欧美日本| 97视频在线观看网址| 久久久久久天堂| 欧美福利影院| 久久久综合av| 日韩免费不卡视频| 亚洲青色在线| 国产91av在线| 手机看片久久久| 男人的天堂成人在线| 97超级碰在线看视频免费在线看| 亚洲一级生活片| 伊人久久大香线| 久久久国产成人精品| 三级黄色在线观看| 牛夜精品久久久久久久99黑人| 久久精品视频播放| 国产精品白丝喷水在线观看| 午夜电影亚洲| 久久乐国产精品| 天天综合天天干| 国产精品婷婷| 国产精品福利无圣光在线一区| 黄色av网站免费| 久久国产精品色| 91久久嫩草影院一区二区| 国产sm主人调教女m视频| 国产伦精一区二区三区| 国产精品青青草| 午夜成人鲁丝片午夜精品| 2023国产精品视频| 台湾成人av| av在线官网| 图片区日韩欧美亚洲| 欧洲av无码放荡人妇网站| 欧美最新精品| 欧美一区二区福利在线| 亚洲一级Av无码毛片久久精品| 免费萌白酱国产一区二区三区| 国产午夜精品理论片a级探花| 中文字幕成人动漫| 香蕉视频国产精品| 91精品国产91| 97在线播放免费观看| 国产91丝袜在线观看| 久久久久国产精品视频| 黄色片免费在线观看| 亚洲第一激情av| 男女视频一区二区三区| 亚洲日日夜夜| 日韩电影中文字幕在线观看| 国产白丝一区二区三区| 亚洲第一黄网| 国产精品日韩电影| 免费a级片在线观看| 欧美国产欧美综合| h无码动漫在线观看| 一二区成人影院电影网| 精品1区2区在线观看| 国产熟女一区二区| 亚洲国内欧美| 国产精品偷伦一区二区| 天天色天天操天天射| 国产精品成人网| 奇米精品一区二区三区| 国产成人久久精品一区二区三区| 亚洲精品中文字幕女同| 免费在线视频一区二区| 麻豆精品一二三| 久久婷婷国产综合尤物精品| 影音先锋在线视频| 欧美日韩日日摸| 国产精品成人一区二区三区电影毛片| 亚洲综合小说| 成人福利在线观看| 国产玉足榨精视频在线观看| 亚洲地区一二三色| 伊人五月天婷婷| 青青草综合网| 国产精品 欧美在线| 天天射,天天干| 亚洲国产精品一区二区尤物区| 亚洲国产成人va在线观看麻豆| 日韩美脚连裤袜丝袜在线| 欧美日韩成人黄色| a级片在线免费看| 成人免费在线视频观看| 成人羞羞国产免费网站| 日本亚洲不卡| 久久理论片午夜琪琪电影网| www.黄色一片| 一区二区在线免费观看| 热久久久久久久久| 99久久亚洲精品| 国产日产欧美a一级在线| www.视频在线.com| 欧洲中文字幕精品| 亚洲黄色小说视频| 日韩国产一区二| 日本视频一区在线观看| 希岛爱理一区二区三区av高清| 日韩成人中文字幕| 欧美一区二区激情视频| 91视频com| 精品99在线视频| 九一成人免费视频| 国产成人精品日本亚洲专区61| 美女欧美视频在线观看免费 | 日本精品另类| 亚洲三级 欧美三级| 无码人妻一区二区三区线| 久久久噜噜噜久久中文字幕色伊伊 | 精品免费在线视频| 五级黄高潮片90分钟视频| 性久久久久久| 午夜精品美女久久久久av福利 | 92看片淫黄大片欧美看国产片 | 日韩免费观看网站| 国内在线精品| 欧美日韩成人一区二区| 美女三级黄色片| 国产精品综合久久| 亚洲理论电影在线观看| 婷婷国产精品| 国产精品日韩一区| 大片免费在线观看| 亚洲国产三级网| 国产污视频网站| 国产精品萝li| 日韩高清一二三区| 男女av一区三区二区色多| 日韩伦理一区二区三区av在线| 国产精品久久久久77777丨| 久久天天躁狠狠躁夜夜av| 亚洲国产精品欧美久久| 色婷婷综合久久久中文字幕| jizzjizzjizz国产| 成人一区二区三区在线观看| 毛片av免费在线观看| 99精品视频在线| 狠狠色伊人亚洲综合网站色| 日韩成人高清| 欧美国产日韩视频| 国产视频三级在线观看播放| 日韩亚洲欧美综合| 欧美在线观看不卡| 亚洲品质自拍视频| 在线免费观看日韩av| 韩国理伦片一区二区三区在线播放| 久久99久久久久久| 日韩成人三级| 好吊色欧美一区二区三区四区| 国产原创一区| 91国产视频在线播放| 欧美成人三区| 亚洲人成电影网站色| 国产丰满果冻videossex| 欧美视频国产精品| 激情综合五月网| 欧美经典三级视频一区二区三区| 国产精品99久久久精品无码| 视频一区国产视频| 无码专区aaaaaa免费视频| 日韩激情图片| 免费一区二区三区在在线视频| 精品伊人久久| 国产精品美女av| 韩日毛片在线观看| 久久天天躁狠狠躁夜夜躁| 日韩av成人| 精品国产免费久久| 亚洲网站免费观看| 欧美色播在线播放| 国产精品99无码一区二区| 最新中文字幕一区二区三区| 熟女俱乐部一区二区| 国产成人午夜视频| 免费黄频在线观看| 乱一区二区av| 成人性做爰aaa片免费看不忠| 在线欧美三区| 国产www免费| 欧美va天堂| 国产精品88久久久久久妇女| 成人婷婷网色偷偷亚洲男人的天堂| 精品视频一区二区三区四区| 一区二区三区四区精品视频| 亚洲伊人久久大香线蕉av| 激情久久一区二区| 国产精品久久久久久久app| 电影一区二区三区| 欧美在线免费观看| 自拍偷拍欧美视频| 欧美与欧洲交xxxx免费观看| a'aaa级片在线观看| 久久久久久香蕉网| 国产精品69xx| 性色av一区二区三区在线观看| 性欧美videos高清hd4k| 欧美日本高清视频| 黄网在线免费看| 国外视频精品毛片| 麻豆mv在线观看| 欧美亚洲国产日韩2020| 在线看片福利| 国产91色在线|| 青青热久免费精品视频在线18| 国产精品久久激情| 日韩成人在线电影| 91在线观看免费| 亚洲一级大片| 久久影院理伦片| 国产一区二区三区电影在线观看| 日韩精品av一区二区三区| 成人同人动漫免费观看| 中文字幕一区二区三区5566| 羞羞答答成人影院www| 永久免费看av| 亚洲人成人一区二区三区| 九九九九免费视频| 老司机精品福利视频| 在线黄色免费观看| 国产精品系列在线播放| 日本三级日本三级日本三级极| 99久久精品免费精品国产| 亚洲一区二区三区蜜桃| 国产精品久久久一本精品| 天天看片中文字幕| 激情av一区二区| 在线免费观看av网址| 欧美高清一级片在线| 黄色www视频| 亚洲色图在线观看| 黄色av网站在线播放| 久久人91精品久久久久久不卡| 肉色欧美久久久久久久免费看| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | www成人免费| 欧美亚洲三区| 亚洲精品乱码久久久久久动漫| 成人av资源在线| 国产不卡在线观看视频| 亚洲一区免费观看| 欧美日韩a v| 欧美成人福利视频| 撸视在线观看免费视频| 欧美精品日韩www.p站| 亚洲精品mv| 成人女人免费毛片| 欧美日韩精品在线一区| 国产av熟女一区二区三区 | 亚洲成人综合在线| 亚洲 小说区 图片区| 精品少妇一区二区三区免费观看| 久久精品a一级国产免视看成人| 欧美成人黄色小视频| 最新日韩精品| 国产精品日韩二区| 99久久夜色精品国产亚洲96| 久久精品免费一区二区| 国产老肥熟一区二区三区| 精品无码国产污污污免费网站| 一区二区三区在线免费播放| 成人毛片一区二区三区| 精品1区2区在线观看| www在线免费观看视频| 国产精品va在线播放我和闺蜜| 9l视频自拍九色9l视频成人| 一本色道婷婷久久欧美 | 日本一区二区在线播放| 91精品入口| 影音先锋男人的网站| 日韩精品福利网| 亚洲欧美日本一区| 夜夜嗨av一区二区三区网页| 中文字幕av在线免费观看| 日韩精品在线观| av有码在线观看| 99re国产视频| 影音先锋成人在线电影| 国产高潮免费视频| 国产亚洲一二三区| 高清乱码免费看污| 精品网站999www| 华人av在线| 国产精品v欧美精品∨日韩| 91国语精品自产拍| www.久久久久久久久久久| 欧美高清在线视频| 一区二区乱子伦在线播放| 亚洲欧洲视频在线| 日韩大片欧美大片| 欧美另类一区| 老司机亚洲精品| 欧美做受高潮6| 色哟哟一区二区| 国产私拍精品| 国产精品一区=区| 91欧美大片| 亚洲综合日韩欧美| 国产精品盗摄一区二区三区| 在线免费观看中文字幕| 中文一区二区视频| 欧美a视频在线| 国产四区在线观看| 国产美女一区二区三区| 欧美一区二区三区爽爽爽| 欧美一区二区三区在线观看| 国产丝袜在线| www.久久久| 亚洲精品1区2区| 国产精品815.cc红桃| 欧美性猛交一区二区三区精品| 成人免费在线电影| 91精品在线一区| 国产精品chinese| 国产又粗又长又爽| 欧美亚洲日本一区| 最新av在线播放| 久久99久久99精品蜜柚传媒| 午夜一区不卡| 国产又黄又粗又猛又爽的| 91精品一区二区三区在线观看| 日本乱理伦在线| 欧美精品一区在线| 免费观看在线综合| 欧美三根一起进三p| 亚洲韩国日本中文字幕| 亚洲精品在线影院| 国产在线拍揄自揄拍无码| 成人精品国产福利| 久久久久亚洲视频| 欧美成人性生活| 亚洲成a人片77777在线播放 | 国产尤物av一区二区三区| av资源网一区| 又色又爽又黄无遮挡的免费视频| 美女少妇精品视频| 精品一区欧美| 欧美xxxxxbbbbb| 欧美午夜激情小视频| 日本中文字幕视频在线| 国产成人精品一区二区三区福利 | 黄色一级片免费播放| 亚洲国产aⅴ天堂久久| 国产三级视频在线| 产国精品偷在线| 日韩高清不卡一区| 久久精品国产亚洲av高清色欲| 亚洲日韩中文字幕| a级日韩大片| 亚洲欧美天堂在线| 一本大道av一区二区在线播放| 欧美人与禽猛交乱配| 涩涩日韩在线| 99精品国产热久久91蜜凸|