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

微服務(wù)難點(diǎn)剖析 | 服務(wù)拆的挺爽,問題是日志該怎么串聯(lián)起來(lái)呢?

開發(fā) 架構(gòu)
現(xiàn)在微服務(wù)架構(gòu)盛行,很多以前的單體應(yīng)用服務(wù)都被拆成了多個(gè)分布式的微服務(wù),以解決應(yīng)用系統(tǒng)發(fā)展壯大后的開發(fā)周期長(zhǎng)、難以擴(kuò)展、故障隔離等挑戰(zhàn)。

本文轉(zhuǎn)載自微信公眾號(hào)「網(wǎng)管叨bi叨」,作者KevinYan11。轉(zhuǎn)載本文請(qǐng)聯(lián)系網(wǎng)管叨bi叨公眾號(hào)。

現(xiàn)在微服務(wù)架構(gòu)盛行,很多以前的單體應(yīng)用服務(wù)都被拆成了多個(gè)分布式的微服務(wù),以解決應(yīng)用系統(tǒng)發(fā)展壯大后的開發(fā)周期長(zhǎng)、難以擴(kuò)展、故障隔離等挑戰(zhàn)。

不過技術(shù)領(lǐng)域有個(gè)諺語(yǔ)叫--沒有銀彈,這句話的意思其實(shí)跟現(xiàn)實(shí)生活中任何事都有利和弊兩面一樣,意思是告訴我們不要寄希望于用一個(gè)解決方案解決所有問題,引入新方案解決舊問題的同時(shí),勢(shì)必會(huì)引入新的問題。典型的比如,原本在單體應(yīng)用里可以靠本地?cái)?shù)據(jù)庫(kù)的ACID 事務(wù)來(lái)保證數(shù)據(jù)一致性。但是微服務(wù)拆分后,就沒那么簡(jiǎn)單了。

同理拆分成為服務(wù)后,一個(gè)業(yè)務(wù)邏輯的完成一般需要多個(gè)服務(wù)的協(xié)作才能完成,每個(gè)服務(wù)都會(huì)有自己的業(yè)務(wù)日志,那怎么把各個(gè)服務(wù)的業(yè)務(wù)日志串聯(lián)起來(lái),也會(huì)變難,今天我們就聊一下微服務(wù)的日志串聯(lián)的方案。

在早前的文章分布式鏈路跟蹤中的traceid和spanid代表什么? 這里我給大家介紹過 TraceId 和 SpanId 的概念。

  • trace 是請(qǐng)求在分布式系統(tǒng)中的整個(gè)鏈路視圖
  • span 則代表整個(gè)鏈路中不同服務(wù)內(nèi)部的視圖,span 組合在一起就是整個(gè) trace 的視圖

在微服務(wù)的日志串聯(lián)里,我們同樣能使用這兩個(gè)概念,通過 trace 串聯(lián)出一個(gè)業(yè)務(wù)邏輯的所有業(yè)務(wù)日志,span 串聯(lián)出在單個(gè)服務(wù)里的業(yè)務(wù)日志。

而單個(gè)微服務(wù)的日志串聯(lián)的時(shí)候還有個(gè)挑戰(zhàn)是怎么把數(shù)據(jù)庫(kù)執(zhí)行過程的一些日志也注入這些 traceid 和 spanid 打到業(yè)務(wù)日志里。下面我們就分別通過

  • HTTP 服務(wù)間的日志追蹤參數(shù)傳遞
  • HTTP 和 RPC 服務(wù)間的追蹤參數(shù)傳遞
  • ORM 的日志中注入追蹤參數(shù)

來(lái)簡(jiǎn)述一下微服務(wù)業(yè)務(wù)日志串聯(lián)的思路。提前聲明本文中給出的解決方案更多是 Go 技術(shù)棧的,其他語(yǔ)言的技術(shù)棧有些方案實(shí)現(xiàn)跟這里列舉的稍有不同,尤其是 Java 一些開源庫(kù)上比較容易實(shí)現(xiàn)的東西在 Go 這里并不簡(jiǎn)單。

其實(shí)如果使用 APM 的話,是有比較統(tǒng)一的解決方案的,比如接入 Skywalking 就可以,不過還是有額外的學(xué)習(xí)成本以及需要引入外部系統(tǒng)組件的。

HTTP 服務(wù)間的日志追蹤參數(shù)傳遞

HTTP 服務(wù)間的追蹤參數(shù)傳遞,主要是靠在全局的路由中間件來(lái)搞,我們可以在請(qǐng)求頭里指定 TraceId 和 SpanId。當(dāng)然如果是請(qǐng)求到達(dá)的第一個(gè)服務(wù),則生成 TraceId 和 SpanId,加到Header 里往下傳。

  1. type Middleware func(http.HandlerFunc) http.HandlerFunc 
  2.  
  3. func withTrace() Middleware { 
  4.     // 創(chuàng)建中間件 
  5.     return func(f http.HandlerFunc) http.HandlerFunc { 
  6.  
  7.        return func(w http.ResponseWriter, r *http.Request) { 
  8.           traceID := r.Header.Get("xx-tranceid"
  9.           parentSpanID := r.Header.Get("xx-spanid"
  10.           spanID := genSpanID(r.RemoteAddr) 
  11.           if traceID == "" {// traceID為空,證明是初始調(diào)用,讓root span id == trace id 
  12.               traceId = spanID 
  13.           } 
  14.             // 把 追蹤參數(shù)通過 Context 在服務(wù)內(nèi)部處理中傳遞 
  15.            ctx := context.WithValue(r.Context(), "trace-id", traceID) 
  16.            ctx := context.WithValue(ctx, "pspan-id", parentSpanID) 
  17.            ctx := context.WithValue(ctx, "span-id", parentSpanID) 
  18.            r.WithContext(ctx) 
  19.  
  20.             // 調(diào)用下一個(gè)中間件或者最終的handler處理程序 
  21.             f(w, r) 
  22.         } 
  23.     } 

上面主要通過在中間件程序,獲取 Header 頭里存儲(chǔ)的追蹤參數(shù),把參數(shù)保存到請(qǐng)求的 Context 中在服務(wù)內(nèi)部傳遞。上面的程序有幾點(diǎn)需要說(shuō)明:

  • genSpanID 是根據(jù)遠(yuǎn)程客戶端IP 生成唯一 spanId 的方法,生成方法只要保證哈希串唯一就行。
  • 如果服務(wù)是請(qǐng)求的開始,在生成spanId 的時(shí)候,我們把它也設(shè)置成 traceId,這樣就能通過 spanId == traceId 判斷出當(dāng)前的 Span 是請(qǐng)求的開端、即 root span。

接下來(lái)往下游服務(wù)發(fā)起請(qǐng)求的時(shí)候,我們需要在把 Context 里存放的追蹤參數(shù),放到 Header 里接著往下個(gè) HTTP 服務(wù)傳。

  1. func HttpGet(ctx context.Context url string, data string, timeout int64) (code int, content string, err error) { 
  2.     req, _ := http.NewRequest("GET", url, strings.NewReader(data)) 
  3.     defer req.Body.Close() 
  4.  
  5.     req.Header.Add("xx-trace-tid", ctx.Value("trace-id").(string)) 
  6.     req.Header.Add("xx-trace-tid", ctx.Value("span-id").(string)) 
  7.    
  8.     client := &http.Client{Timeout: time.Duration(timeout) * time.Second
  9.     resp, error := client.Do(req) 

HTTP 和 RPC 服務(wù)間的追蹤參數(shù)傳遞

上面咱們說(shuō)的上下游服務(wù)都是 HTTP 服務(wù)的追蹤參數(shù)傳遞,那如果是 HTTP 服務(wù)的下游是 RPC 服務(wù)呢?

其實(shí)跟發(fā)HTTP請(qǐng)求可以配置HTTP客戶端攜帶 Header 和 Context 一樣,RPC客戶端也支持類似功能。以 gRPC 服務(wù)為例,客戶端調(diào)用RPC 方法時(shí),在可以攜帶的元數(shù)據(jù)里設(shè)置這些追蹤參數(shù)。

  1. traceID := ctx.Value("trace-id").(string) 
  2. traceID := ctx.Value("trace-id").(string) 
  3. md := metadata.Pairs("xx-traceid", traceID, "xx-spanid", spanID) 
  4. // 新建一個(gè)有 metadata 的 context 
  5. ctx := metadata.NewOutgoingContext(context.Background(), md) 
  6. // 單向的 Unary RPC 
  7. response, err := client.SomeRPCMethod(ctx, someRequest) 

RPC 的服務(wù)端的處理方法里,可以再通過 metadata 把元數(shù)據(jù)里存儲(chǔ)的追蹤參數(shù)取出來(lái)。

  1. func (s server) SomeRPCMethod(ctx context.Context, req *xx.someRequest) (reply *xx.SomeReply, err error) { 
  2.  
  3.   remote, _ := peer.FromContext(ctx) 
  4.   remoteAddr := remote.Addr.String() 
  5.   // 生成本次請(qǐng)求在當(dāng)前服務(wù)的 spanId 
  6.   spanID := utils.GenerateSpanID(remoteAddr) 
  7.    
  8.   traceID, pSpanID := """" 
  9.   md, _ := metadata.FromIncomingContext(ctx) 
  10.   if arr := md["xx-tranceid"]; len(arr) > 0 { 
  11.       traceID = arr[0] 
  12.   } 
  13.   if arr := md["xx-spanid"]; len(arr) > 0 { 
  14.       pSpanID = arr[0] 
  15.   } 
  16.   return 

有一個(gè)概念我們需要注意一下,代碼里是把上游傳過來(lái)的 spanId 作為本服務(wù)的 parentSpanId 的,本服務(wù)處理請(qǐng)求時(shí)候的 spanId 是需要重新生成的,生成規(guī)則在之前我們介紹過。

除了 HTTP 網(wǎng)關(guān)調(diào)用 RPC 服務(wù)外,處理請(qǐng)求時(shí)也經(jīng)常出現(xiàn) RPC 服務(wù)間的調(diào)用,那這種情況該怎么弄呢?

RPC 服務(wù)間的追蹤參數(shù)傳遞

其實(shí)跟 HTTP 服務(wù)調(diào)用 RPC 服務(wù)情況類似,如果上游也是 RPC 服務(wù),那么則應(yīng)該在接收到的上層元數(shù)據(jù)的基礎(chǔ)上再附加的元數(shù)據(jù)。

  1. md := metadata.Pairs("xx-traceid", traceID, "xx-spanid", spanID) 
  2. mdOld, _ := metadata.FromIncomingContext(ctx) 
  3. md = metadata.Join(mdOld, md) 
  4. ctx = metadata.NewOutgoingContext(ctx, md) 

當(dāng)然如果我們每個(gè)客戶端調(diào)用和RPC 服務(wù)方法里都這么搞一遍得類似,gRPC 里也有類似全局路由中間件的概念,叫攔截器,我們可以把追蹤參數(shù)傳遞這部分邏輯封裝在客戶端和服務(wù)端的攔截器里。

gRPC 攔截器的詳細(xì)介紹請(qǐng)看我之前的文章 -- gRPC生態(tài)里的中間件

客戶端攔截器

  1. func UnaryClientInterceptor(ctx context.Context, ... , opts ...grpc.CallOption) error { 
  2.  md := metadata.Pairs("xx-traceid", traceID, "xx-spanid", spanID) 
  3.  mdOld, _ := metadata.FromIncomingContext(ctx) 
  4.  md = metadata.Join(mdOld, md) 
  5.  ctx = metadata.NewOutgoingContext(ctx, md) 
  6.  
  7.  err := invoker(ctx, method, req, reply, cc, opts...) 
  8.  
  9.  return err 
  10.  
  11. // 連接服務(wù)器 
  12. conn, err := grpc.Dial(*address, grpc.WithInsecure(),grpc.WithUnaryInterceptor(UnaryClientInterceptor)) 

服務(wù)端攔截器

  1. func UnaryServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { 
  2.  remote, _ := peer.FromContext(ctx) 
  3.  remoteAddr := remote.Addr.String() 
  4.  spanID := utils.GenerateSpanID(remoteAddr) 
  5.  
  6.  // set tracing span id 
  7.  traceID, pSpanID := """" 
  8.  md, _ := metadata.FromIncomingContext(ctx) 
  9.  if arr := md["xx-traceid"]; len(arr) > 0 { 
  10.   traceID = arr[0] 
  11.  } 
  12.  if arr := md["xx-spanid"]; len(arr) > 0 { 
  13.   pSpanID = arr[0] 
  14.  } 
  15.   // 把 這些ID再搞到 ctx 里,其他兩個(gè)就省略了 
  16.   ctx := Context.WithValue(ctx, "traceId", traceId) 
  17.   resp, err = handler(ctx, req) 
  18.    
  19.   return 

ORM 的日志中注入追蹤參數(shù)

其實(shí),如果你用的是 GORM 注入這個(gè)參數(shù)是最難的,如果你是 Java 程序員的話,可能會(huì)對(duì)比如阿里巴巴的 Druid 數(shù)據(jù)庫(kù)連接池加入類似 traceId 這種參數(shù)習(xí)以為常,但是 Go 的 GORM 庫(kù)確實(shí)做不到,也有可能新版本可以,我用的還是老版本,其他 Go 的 ORM 庫(kù)沒有接觸過,知道的同學(xué)可以留言給我們普及一下。

GORM做不到在日志里加入追蹤參數(shù)的原因就是這個(gè)GORM 的 logger 沒有實(shí)現(xiàn)SetContext方法,所以除非修改源碼中調(diào)用db.slog的地方,否則無(wú)能為力。

不過話也不能說(shuō)死,之前介紹過一種使用函數(shù)調(diào)用棧實(shí)現(xiàn) Goroutine Local Storage 的庫(kù) jtolds/gls ,我們可以通過它在外面封裝一層來(lái)實(shí)現(xiàn),并且還需要重新實(shí)現(xiàn) GORM Logger 的打印日志的 Print 方法。

下面大家感受一下,GLS 庫(kù)的使用,確實(shí)有點(diǎn)點(diǎn)怪,不過能過。

  1. func SetGls(traceID, pSpanID, spanID string, cb func()) { 
  2.   mgr.SetValues(gls.Values{traceIDKey: traceID, pSpanIDKey: pSpanID, spanIDKey: spanID}, cb) 
  3.  
  4. gls.SetGls(traceID, pSpanID, spanID, func() { 
  5.    data, err =  findXXX(primaryKey) 
  6. }) 

重寫 Logger 的我就簡(jiǎn)單貼貼,核心思路還是在記錄SQL到日志的時(shí)候,從調(diào)用棧里把 traceId 和 spanId 取出來(lái)放一并加入到日志記錄里。

  1. // 對(duì)Logger 注冊(cè) Print方法 
  2. func (l logger) Print(values ...interface{}) { 
  3.  if len(values) > 1 { 
  4.    // ... 
  5.    l.sqlLog(sql, args, duration, path.Base(source)) 
  6.  
  7.   } else { 
  8.    err := values[2] 
  9.    log.Error("source", source, "err", err) 
  10.   } 
  11.  } 
  12.  
  13. func (l logger) sqlLog(sql string, args []interface{}, dur time.Duration, source string) { 
  14.  argsArr := make([]string, len(args)) 
  15.  for k, v := range args { 
  16.   argsArr[k] = fmt.Sprintf("%v", v) 
  17.  } 
  18.  argsStr := strings.Join(argsArr, ","
  19.    
  20.   spanId := gls.GetSpanId() 
  21.   traceId := gls.GetTraceId() 
  22.  //對(duì)于超時(shí)的,統(tǒng)一打warn日志 
  23.  if dur > (time.Millisecond * 500) { 
  24.   log.Warn("xx-traceid", traceId, "xx-spanid", spanId, "sql", sql, "args_detal", argsStr, "source", source) 
  25.  } else { 
  26.   log.Debug("xx-traceid", traceId, "xx-spanid", spanId, "sql", sql, "args_detal", argsStr, "source", source) 
  27.  } 

通過調(diào)用棧獲取 spanId 和 traceId 的是類似這樣的方法,由 GLS 庫(kù)提供的方法封裝實(shí)現(xiàn)。

  1. //  Get spanID 用于Goroutine的鏈路追蹤 
  2. func GetSpanID() (spanID string) { 
  3.  span, ok := mgr.GetValue(spanIDKey) 
  4.  if ok { 
  5.   spanID = span.(string) 
  6.  } 
  7.  return 

日志打印的話,也是對(duì)超過 500 毫秒的SQL執(zhí)行進(jìn)行 Warn 級(jí)別日志的打印,方便線上環(huán)境分析問題,而其他的SQL執(zhí)行記錄,因?yàn)槭褂昧?Debug 日志級(jí)別只會(huì)在測(cè)試環(huán)境上顯示。

總結(jié)

用分布式鏈路追蹤參數(shù)串聯(lián)起整個(gè)服務(wù)請(qǐng)求的業(yè)務(wù)日志,在線上的分布式環(huán)境中是非常有必要的,其實(shí)上面只是簡(jiǎn)單闡述了一些思路,只有把日志搞的足夠好,上下文信息足夠多才會(huì)能高效地定位出線上問題。感覺這部分細(xì)節(jié)太多,想用一篇文章闡述明白非常困難。

而且還有一點(diǎn)就是日志錯(cuò)誤級(jí)別的選擇也非常有講究,如果本該用Debug的地方,用了 Info 級(jí)別,那線上日志就會(huì)出現(xiàn)非常多的干擾項(xiàng)。

細(xì)節(jié)的地方怎么實(shí)現(xiàn),就屬于實(shí)踐的時(shí)候才能把控的了。希望這篇文章能給你個(gè)實(shí)現(xiàn)分布式日志追蹤的主旨思路。

 

責(zé)任編輯:武曉燕 來(lái)源: 網(wǎng)管叨bi叨
相關(guān)推薦

2022-09-06 07:29:33

微服務(wù)方式函數(shù)

2021-02-24 14:01:13

微服務(wù)開發(fā)框架

2021-07-08 07:52:48

微服務(wù)業(yè)務(wù)架構(gòu)

2015-07-29 16:23:07

2022-12-02 16:28:47

2021-12-29 08:30:48

微服務(wù)架構(gòu)開發(fā)

2024-11-06 16:27:12

2017-10-13 16:22:22

微服務(wù)架構(gòu)師開發(fā)

2016-08-24 16:23:36

服務(wù)架構(gòu)

2018-03-27 09:45:52

持續(xù)集成微服務(wù)化

2016-09-29 14:55:56

SAP數(shù)字化轉(zhuǎn)型

2022-12-05 09:08:12

微服務(wù)灰度發(fā)布

2021-07-20 08:03:43

微服務(wù)應(yīng)用程序

2019-09-11 10:10:36

ERP遷移

2017-10-17 11:39:40

微服務(wù)路由解決方案

2013-01-15 09:36:33

交換機(jī)串聯(lián)網(wǎng)絡(luò)

2020-04-22 10:50:21

微服務(wù)架構(gòu)企業(yè)

2017-05-09 09:26:48

微服務(wù)消息推送

2023-12-30 08:27:13

2022-08-16 15:20:12

微服務(wù)IT運(yùn)維
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

一区二区三区毛片免费| 国产激情在线| 久久久人人人| 亚洲一区二区精品| www.com操| 国产在线观看av| 丁香六月久久综合狠狠色| 国内精品久久久久久影视8| 欧美一级免费在线| √天堂8资源中文在线| 久久九九久久九九| 国产欧美日韩精品专区| 超碰手机在线观看| 国产无遮挡裸体免费久久| 欧美日韩精品在线播放| 亚洲日本理论电影| 亚洲国产剧情在线观看| 国产深夜精品| 国产一区二区三区三区在线观看 | missav|免费高清av在线看| 久久久亚洲精品一区二区三区| 91中文在线观看| www.久久视频| 亚洲狼人精品一区二区三区| 久久综合色影院| 无码人妻精品一区二区中文| 国产精品22p| 3d成人h动漫网站入口| 无码人妻丰满熟妇区毛片18| 欧美亚洲系列| 亚洲色图制服诱惑| 亚洲激情一区二区| 日本高清中文字幕二区在线| 成人听书哪个软件好| 91精品视频网站| 中文在线观看免费高清| 美女黄网久久| 日本午夜精品理论片a级appf发布| 激情五月婷婷小说| 欧美.www| 久久亚洲私人国产精品va| 四虎永久免费在线观看| 亚洲精品国模| 日韩久久免费视频| 波多野结衣影院| 91精品啪在线观看国产手机 | 一级片黄色免费| 小明成人免费视频一区| 色欧美片视频在线观看在线视频| 成人免费aaa| 蜜桃视频m3u8在线观看| 精品国产91久久久久久| 少妇人妻在线视频| 高清在线视频不卡| 欧美日韩亚洲91| 成年人黄色片视频| 免费观看一级欧美片| 欧美日韩免费在线观看| 99爱视频在线| 韩国主播福利视频一区二区三区| 欧美视频二区36p| 男人亚洲天堂网| 欧美国产日韩电影| 欧美美女bb生活片| 成人在线短视频| av综合网页| 亚洲精品丝袜日韩| 亚洲午夜精品久久久久久高潮| 第九色区aⅴ天堂久久香| 中文字幕日韩电影| 日韩激情综合网| 欧美激情在线| 午夜精品久久久久久久99热| 久久久久久久久久影院| 久久精品综合| 成人激情在线观看| 亚洲国产精品suv| 成人激情视频网站| 日韩aⅴ视频一区二区三区| 2017亚洲天堂1024| 一区二区三区高清在线| 国产精品秘入口18禁麻豆免会员| 欧美xnxx| 亚洲第一在线视频| 欧美波霸videosex极品| 综合在线一区| 欧美在线视频一区二区| 亚洲一区二区天堂| 成人禁用看黄a在线| 欧美日韩亚洲综合一区二区三区激情在线 | 麻豆精品蜜桃一区二区三区| av大全在线免费看| 亚洲一区在线看| 嫩草av久久伊人妇女超级a| a一区二区三区亚洲| 亚洲国产日韩欧美在线图片 | 人妻少妇精品无码专区久久| 久久久久国产精品麻豆ai换脸 | 久久久久久高清| 一级日本在线| 激情懂色av一区av二区av| 五月天激情视频在线观看| av不卡一区| 自拍偷拍免费精品| 免费在线不卡视频| 国产精品综合二区| 日韩欧美一区二区三区四区五区 | 黄色在线免费观看大全| 亚洲啪啪综合av一区二区三区| 欧美变态另类刺激| 欧洲大片精品免费永久看nba| 亚洲开心激情网| 久草视频免费在线播放| 蜜臀久久99精品久久久久宅男 | 潘金莲一级淫片aaaaa| 精品国产一区二区三区久久久蜜臀 | 波多野结衣a v在线| 欧美一区综合| 国产精品影院在线观看| 亚洲AV成人无码一二三区在线| 中文字幕日韩av资源站| 男人透女人免费视频| 高潮按摩久久久久久av免费| 久久精品亚洲一区| 瑟瑟视频在线免费观看| 久久综合给合久久狠狠狠97色69| 欧美久久久久久久久久久久久久| 国产 日韩 欧美| 日韩亚洲精品视频| 一区二区乱子伦在线播放| 99久久99久久精品国产片果冻| 青草全福视在线| 日本黄色成人| 日韩在线观看网站| 成人黄色av免费在线观看| 麻豆网址在线观看| 日产国产高清一区二区三区| 精品久久久久久综合日本| 欧美xxxx做受欧美88bbw| 555www色欧美视频| 激情高潮到大叫狂喷水| 蜜臂av日日欢夜夜爽一区| 色综合久久久久久久久五月| 电影天堂国产精品| 精品一区二区三区四区| 日本一区二区三区精品| 久久综合九色综合97婷婷女人| 一区二区传媒有限公司| 欧美丝袜足交| 欧美制服第一页| 深夜福利在线观看直播| 动漫精品一区二区| 疯狂揉花蒂控制高潮h| 香蕉亚洲视频| 日本一区二区三区视频在线观看| 日韩在线影院| 自拍偷拍亚洲在线| 一级片一区二区三区| 欧美国产97人人爽人人喊| 日韩av卡一卡二| 午夜av一区| 成人动漫在线观看视频| 99爱在线视频| 国产视频久久久久| 国产免费a视频| 亚洲欧美日韩中文播放| 亚洲精品鲁一鲁一区二区三区| 在线精品一区| 欧美激情第六页| abab456成人免费网址| 久久精品中文字幕一区| 午夜久久久久久久久久| 精品久久香蕉国产线看观看gif| 黄瓜视频污在线观看| 日韩专区一卡二卡| 国产手机视频在线观看| 欧美男男freegayvideosroom| 国产成人精品一区二区| 国产秀色在线www免费观看| 精品乱人伦小说| 精品久久久久久久久久久国产字幕| 国产精品三级在线观看| 韩国一区二区三区四区| 麻豆成人精品| 亚洲乱码日产精品bd在线观看| 天海翼亚洲一区二区三区| 国产男女猛烈无遮挡91| 波多一区二区| 最近日韩中文字幕中文| 女人18毛片一区二区三区| 在线视频综合导航| 九九久久免费视频| 国产调教视频一区| 精品国产aⅴ一区二区三区东京热| 老鸭窝毛片一区二区三区| 欧美一级黄色录像片| 偷拍自拍一区| 91免费的视频在线播放| 亚洲国产福利| 色综合久久88| 午夜视频成人| 国产丝袜精品视频| av网站免费大全| 色狠狠综合天天综合综合| 久久精品www| 国产精品天干天干在观线| 香港三日本8a三级少妇三级99| 美女视频第一区二区三区免费观看网站| 国产精品第157页| 欧美成人milf| 欧美日韩一区二区视频在线观看| 免费一级欧美在线大片| 国产精品亚洲自拍| 成人私拍视频| 国产+人+亚洲| 亚洲性图自拍| 色偷偷偷综合中文字幕;dd| 日韩三级电影网| 精品久久免费看| 国产欧美日韩成人| 在线免费av一区| 亚洲成人av影片| 婷婷丁香激情综合| 日韩免费一二三区| 亚洲欧美日韩电影| 日韩在线观看免| 国产精品免费久久久久| 色欲AV无码精品一区二区久久| 不卡高清视频专区| 激情小说欧美色图| 国产91对白在线观看九色| 中文字幕亚洲影院| 韩国三级在线一区| 五月天激情播播| 麻豆精品一区二区综合av| 国产精品人人爽人人爽| 肉色丝袜一区二区| 中文字幕第80页| 日韩vs国产vs欧美| 丁香婷婷激情网| 日韩精品视频网| 亚洲成人福利在线观看| 日韩专区中文字幕一区二区| 国产aaaaa毛片| 轻轻草成人在线| 性chinese极品按摩| 奇米色一区二区三区四区| 15—17女人毛片| 久久99久国产精品黄毛片色诱| 手机av在线免费| 激情深爱一区二区| 亚洲成人手机在线观看| 国产河南妇女毛片精品久久久| 国产免费无码一区二区| av电影一区二区| 女~淫辱の触手3d动漫| 中文字幕av一区二区三区免费看 | 国产精品99久久免费黑人人妻| 国产亚洲精品bv在线观看| 无码人妻h动漫| 免播放器亚洲一区| 操人视频免费看| 成人精品视频一区二区三区 | 午夜精品久久久久久久第一页按摩| 欧美mv日韩mv| 深夜福利免费在线观看| 在线精品国产欧美| 超碰人人在线| 韩国三级日本三级少妇99| 自由日本语热亚洲人| 国产精品日韩在线一区| 国产aa精品| 国产一级精品aaaaa看| 你微笑时很美电视剧整集高清不卡| 日韩中文一区二区三区| 中文字幕人成人乱码| 国产无限制自拍| 日本少妇一区二区| 天天色天天干天天色| 26uuu国产在线精品一区二区| 日韩欧美黄色网址| 亚洲精品你懂的| 免看一级a毛片一片成人不卡| 欧美日韩国产专区| 国产乱淫a∨片免费观看| 亚洲国产精品va在线| 日本电影一区二区在线观看| 在线看日韩欧美| av免费不卡| 成人黄色片网站| 日韩av系列| 免费看污污视频| 美女日韩在线中文字幕| 99999精品| 国产午夜精品一区二区三区四区| 午夜写真片福利电影网| 在线精品视频免费观看| 午夜精品久久久久久久99热黄桃| 一本色道久久88综合亚洲精品ⅰ | 欧美一级大片免费看| 久久久美女毛片| 久草视频在线资源站| 欧美日韩精品一区二区天天拍小说| 欧美一级做性受免费大片免费| 日韩亚洲第一页| 亚洲综合在线电影| 国产精品亚洲综合| 伊人久久大香线| 亚洲天堂av线| 91免费视频网址| 久久久精品99| 91精品国产黑色紧身裤美女| 二区三区在线| 日本电影亚洲天堂| 狠狠久久伊人| 国产91沈先生在线播放| 韩国v欧美v日本v亚洲v| 亚洲图片第一页| 在线观看亚洲精品视频| 天天影院图片亚洲| 国内精品视频在线| 57pao国产一区二区| 无码人妻精品一区二区三区99v| 免费av成人在线| 国产在线综合视频| 91久久奴性调教| 青青草观看免费视频在线| 午夜精品一区二区三区在线播放| 精品成人18| 中文字幕乱码免费| 精品写真视频在线观看| 午夜三级在线观看| 7878成人国产在线观看| 蜜桃视频网站在线| 国产女同一区二区| 日韩精品诱惑一区?区三区| 亚洲少妇第一页| 国产女人aaa级久久久级| 国产又粗又猛又黄视频| 亚洲午夜精品久久久久久性色| 成人性教育av免费网址| 日韩成人av网站| 免费在线一区观看| 亚洲欧美综合7777色婷婷| 欧美巨大另类极品videosbest| 尤物网在线观看| 成人黄色免费看| 欧美精品aa| 黄色av网址在线观看| 污片在线观看一区二区| 天堂资源中文在线| 国产ts一区二区| 欧美日韩色图| 天天综合天天添夜夜添狠狠添| 亚洲三级在线播放| 国产黄色高清视频| 久久久久亚洲精品| 啪啪国产精品| 日日摸天天爽天天爽视频| 欧美激情综合网| 国产精品区在线观看| 久久精品99久久香蕉国产色戒| 国产一区精品二区| 阿v天堂2018| 久久久久久久性| 亚洲天堂手机版| 欧美久久精品午夜青青大伊人| av成人综合| 国内外成人免费激情视频| 国产欧美日韩精品a在线观看| 99精品视频免费看| 久久噜噜噜精品国产亚洲综合| 免费不卡中文字幕在线| 制服丝袜综合网| 亚洲国产成人av网| 国产小视频免费在线观看| 亚洲一区二区日本| 一区二区精品| 亚洲欧美卡通动漫| 亚洲国产成人精品电影| 亚洲日本在线观看视频| 国产高清不卡无码视频| 久久夜色精品一区| 99热这里只有精品在线观看| 91高清免费视频| 91麻豆精品国产91久久久平台| 国产精品手机在线观看| 欧美日韩中文字幕一区二区| 欧美黑人猛交| 亚州欧美一区三区三区在线| 国产91精品久久久久久久网曝门| 99久久久无码国产精品免费蜜柚| 欧美高清视频在线播放| 国产99亚洲| 永久免费看片在线观看| 91久久精品一区二区三区| 女囚岛在线观看| 亚洲一区二区三区精品动漫| 99久久精品国产麻豆演员表| 一区二区日韩在线观看|