国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

3種方式!Go Error處理最佳實踐

共 17721字,需瀏覽 36分鐘

 ·

2022-08-29 12:05

導(dǎo)語?| ? 錯誤處理一直以一是編程必需要面對的問題,錯誤處理如果做的好的話,代碼的穩(wěn)定性會 很好。不同的語言有不同的出現(xiàn)處理的方式。Go語言也一樣,在本篇文章中,我們來討論一下Go語言的錯誤處理方式。


一、錯誤與異常


(一) Error


錯誤是程序中可能出現(xiàn)的問題,比如連接數(shù)據(jù)庫失敗,連接網(wǎng)絡(luò)失敗等,在程序設(shè)計中,錯誤處理是業(yè)務(wù)的一部分。


Go內(nèi)建一個error接口類型作為go的錯誤標(biāo)準(zhǔn)處理


http://golang.org/pkg/builtin/#error


      
        
          // 接口定義
        
      
      
        type error interface {
      
      
           Error() string
      
      
        }
      
    


http://golang.org/src/pkg/errors/errors.go


      
        
          // 實現(xiàn)
        
      
      
        func New(text string) error {
      
      
           return &errorString{text}
      
      
        }
      
      
        
          
type errorString struct { s string }
func (e *errorString) Error() string { return e.s }



(二)Exception


異常是指在不該出現(xiàn)問題的地方出現(xiàn)問題,是預(yù)料之外的,比如空指針引用,下標(biāo)越界,向空map添加鍵值等。


  • 人為制造被自動觸發(fā)的異常,比如:數(shù)組越界,向空map添加鍵值對等。


  • 手工觸發(fā)異常并終止異常,比如:連接數(shù)據(jù)庫失敗主動panic。



(三)panic


對于真正意外的情況,那些表示不可恢復(fù)的程序錯誤,不可恢復(fù)才使用panic。對于其他的錯誤情況,我們應(yīng)該是期望使用error來進(jìn)行判定。


go源代碼很多地方寫panic, 但是工程實踐業(yè)務(wù)代碼不要主動寫panic,理論上panic只存在于server啟動階段,比如config文件解析失敗,端口監(jiān)聽失敗等等,所有業(yè)務(wù)邏輯禁止主動panic,所有異步的goroutine都要用recover去兜底處理。



(四)總結(jié)


理解了錯誤和異常的真正含義,我們就能理解Go的錯誤和異常處理的設(shè)計意圖。傳統(tǒng)的try...catch...結(jié)構(gòu),很容易讓開發(fā)人員把錯誤和異?;鞛橐徽劊踔涟褬I(yè)務(wù)錯誤處理的一部分當(dāng)做異常來處理,于是你會在程序中看到一大堆的catch...


Go開發(fā)團(tuán)隊認(rèn)為錯誤應(yīng)該明確地當(dāng)成業(yè)務(wù)的一部分,任何可以預(yù)見的問題都需要做錯誤處理,于是在Go代碼中,任何調(diào)用者在接收函數(shù)返回值的同時也需要對錯誤進(jìn)行處理,以防遺漏任何運(yùn)行時可能的錯誤。


異常則是意料之外的,甚至你認(rèn)為在編碼中不可能發(fā)生的,Go遇到異常會自動觸發(fā)panic(恐慌),觸發(fā)panic程序會自動退出。除了程序自動觸發(fā)異常,一些你認(rèn)為不可允許的情況你也可以手動觸發(fā)異常。


另外,在Go中除了觸發(fā)異常,還可以終止異常并可選的對異常進(jìn)行錯誤處理,也就是說,錯誤和異常是可以相互轉(zhuǎn)換的。



二、Go處理錯誤的三種方式


(一)經(jīng)典Go邏輯


直觀的返回error:


      
        type ZooTour interface {
      
      
            Enter() error 
      
      
            VisitPanda(panda *Panda) error 
      
      
            Leave() error
      
      
        }
      
      
        
          
// 分步處理,每個步驟可以針對具體返回結(jié)果進(jìn)行處理 func Tour(t ZooTour1, panda *Panda) error { if err := t.Enter(); err != nil { return errors.WithMessage(err, "Enter failed.") } if err := t.VisitPanda(); err != nil { return errors.WithMessage(err, "VisitPanda failed.") } // ...
return nil }



(二)屏蔽過程中的error的處理


將error保存到對象內(nèi)部,處理邏輯交給每個方法,本質(zhì)上仍是順序執(zhí)行。標(biāo)準(zhǔn)庫的bufio、database/sql包中的Rows等都是這樣實現(xiàn)的,有興趣可以去看下源碼:


      
        type ZooTour interface {
      
      
            Enter() error
      
      
            VisitPanda(panda *Panda) error
      
      
            Leave() error
      
      
            Err() error
      
      
        }
      
      
        
          
func Tour(t ZooTour, panda *Panda) error {
t.Enter() t.VisitPanda(panda) t.Leave() // 集中編寫業(yè)務(wù)邏輯代碼,最后統(tǒng)一處理error if err := t.Err(); err != nil { return errors.WithMessage(err, "ZooTour failed") } return nil }



(三)利用函數(shù)式編程延遲運(yùn)行


分離關(guān)注點(diǎn)-遍歷訪問用數(shù)據(jù)結(jié)構(gòu)定義運(yùn)行順序,根據(jù)場景選擇,如順序、逆序、二叉樹樹遍歷等。運(yùn)行邏輯將代碼的控制流邏輯抽離,靈活調(diào)整。kubernetes中的visitor對此就有很多種擴(kuò)展方式,分離了數(shù)據(jù)和行為,有興趣可以去擴(kuò)展閱讀:


      
        type Walker interface {
      
      
            Next MyFunc
      
      
        }
      
      
        type SliceWalker struct {
      
      
            index int 
      
      
            funs []MyFunc
      
      
        } 
      
      
        
          
func NewEnterFunc() MyFunc { return func(t ZooTour) error { return t.Enter() } }
func BreakOnError(t ZooTour, walker Walker) error { for { f := walker.Next() if f == nil { break } if err := f(t); err := nil { // 遇到錯誤break或者continue繼續(xù)執(zhí)行 } } }



(四)三種方式對比


上面這三個例子,是Go項目處理錯誤使用頻率最高的三種方式,也可以應(yīng)用在error以外的處理邏輯。


  • case1: 如果業(yè)務(wù)邏輯不是很清楚,比較推薦case1;


  • case2: 代碼很少去改動,類似標(biāo)準(zhǔn)庫,可以使用case2;


  • case3: 比較復(fù)雜的場景,復(fù)雜到抽象成一種設(shè)計模式。



三、分層下的Error Handling


(一)一個常見的三層調(diào)用


在工程實踐中,以一個常見的三層架構(gòu)(dao->service->controller)為例,我們常見的錯誤處理方式大致如下:


      
        
          // controller
        
      
      
        if err := mode.ParamCheck(param); err != nil {
      
      
            log.Errorf("param=%+v", param)
      
      
            return errs.ErrInvalidParam
      
      
        }
      
      
        
          
return mode.ListTestName("")
// service _, err := dao.GetTestName(ctx, settleId) if err != nil { log.Errorf("GetTestName failed. err: %v", err) return errs.ErrDatabase }
// dao if err != nil { log.Errorf("GetTestDao failed. uery: %s error(%v)", sql, err) }



(二)問題總結(jié)


  • 分層開發(fā)導(dǎo)致的處處打印日志;


  • 難以獲取詳細(xì)的堆棧關(guān)聯(lián);


  • 根因丟失。



(三)Wrap erros


Go相關(guān)的錯誤處理方法很多,但大多為過渡方案,這里就不一一分析了(類似 github.com/juju/errors 庫,有興趣可以了解)。這里我以 github.com/pkg/errors 為例,這個也是官方Proposal的重點(diǎn)參考對象。


  1. 錯誤要被日志記錄;


  2. 應(yīng)用程序處理錯誤,保證100%完整性;


  3. 之后不再報告當(dāng)前錯誤(錯誤只被處理一次)。


github.com/pkg/errors包主要包含以下幾個方法,如果我們要新生成一個錯誤,可以使用New函數(shù),生成的錯誤,自帶調(diào)用堆棧信息。如果有一個現(xiàn)成的error ,我們需要對他進(jìn)行再次包裝處理,這時候有三個函數(shù)可以選擇(WithMessage/WithStack/Wrapf)。其次,如果需要對源錯誤類型進(jìn)行自定義判斷可以使用Cause,可以獲得最根本的錯誤原因。


      
        
          // 新生成一個錯誤, 帶堆棧信息
        
      
      
        func New(message string) error
      
      
        
          
// 只附加新的信息 func WithMessage(err error, message string) error
// 只附加調(diào)用堆棧信息 func WithStack(err error) error
// 同時附加堆棧和信息 func Wrapf(err error, format string, args ...interface{}) error
// 獲得最根本的錯誤原因 func Cause(err error) error


以常見的一個三層架構(gòu)為例:


a0f5449e4e8a93d8f3784ffeba5f6dba.webp


  • Dao層使用Wrap上拋錯誤


      
            if err != nil {
      
      
                if errors.Is(err, sql.ErrNoRows) {
      
      
                    return nil, errors.Wrapf(ierror.ErrNotFound, "query:%s", query)
      
      
                }
      
      
                return nil, errors.Wrapf(ierror.ErrDatabase,
      
      
                    "query: %s error(%v)", query, err)
      
      
            }
      
    


  • Service層追加信息


      
            bills, err := a.Dao.GetName(ctx, param)
      
      
            if err != nil {
      
      
                return result, errors.WithMessage(err, "GetName failed")
      
      
            }
      
    


  • MiddleWare統(tǒng)一打印錯誤日志

      
        
          // 請求響應(yīng)組裝
        
      
      
        func (Format) Handle(next ihttp.MiddleFunc) ihttp.MiddleFunc {
      
      
            return func(ctx context.Context, req *http.Request, rsp *ihttp.Response) error {
      
      
                format := &format{Time: time.Now().Unix()}
      
      
                err := next(ctx, req, rsp)
      
      
                format.Data = rsp.Data
      
      
                if err != nil {
      
      
                    format.Code, format.Msg = errCodes(ctx, err)
      
      
                }
      
      
                rsp.Data = format
      
      
                return nil
      
      
            }
      
      
        }
      
      
        
          
// 獲取錯誤碼 func errCodes(ctx context.Context, err error) (int, string) { if err != nil { log.CtxErrorf(ctx, "error: [%+v]", err) } var myError = new(erro.IError) if errors.As(err, &myError) { return myError.Code, myError.Msg }
return code.ServerError, i18n.CodeMessage(code.ServerError) }


  • 和其他庫進(jìn)行協(xié)作


如果和其他庫進(jìn)行協(xié)作,考慮使用errors.Wrap或者errors.Wrapf保存堆棧信息。同樣適用于和標(biāo)準(zhǔn)庫協(xié)作的時候。


      
        _, err := os.Open(path)
      
      
        if err != nil {
      
      
           return errors.Wrapf(err, "Open failed. [%s]", path)
      
      
        }
      
    


  • 包內(nèi)如果調(diào)用其他包內(nèi)的函數(shù),通常簡單的直接return err


最終效果樣例:


5d2c3286788a9b4f57e6fef2d9d2a13b.webp


關(guān)鍵點(diǎn)總結(jié):


  • MyError作為全局error的底層實現(xiàn),保存具體的錯誤碼和錯誤信息;


  • MyError向上返回錯誤時,第一次先用Wrap初始化堆棧,后續(xù)用WithMessage增加堆棧信息;


  • 要判斷error是否為指定的錯誤時,可以使用errors.Cause獲取root error,再進(jìn)行和sentinel error判定;


  • github.com/pkg/errors和標(biāo)準(zhǔn)庫的error完全兼容,可以先替換、后續(xù)改造歷史遺留的代碼;


  • 打印error的堆棧需要用%+v,而原來的%v依舊為普通字符串方法;同時也要注意日志采集工具是否支持多行匹配;


  • log error級別的打印棧,warn和info可不打印堆棧;


  • 可結(jié)合統(tǒng)一錯誤碼使用:

    https://google-cloud.gitbook.io/api-design-guide/errors



四、errgroup集中錯誤處理


官方的ErrGroup非常簡單,其實就是解決小型多任務(wù)并發(fā)任務(wù)?;居梅╣olang.org/x/sync/errgroup包下定義了一個Group struct,它就是我們要介紹的ErrGroup并發(fā)原語,底層也是基于WaitGroup實現(xiàn)的。在使用ErrGroup時,我們要用到三個方法,分別是WithContext、Go和Wait。


(一)背景


通常,在寫業(yè)務(wù)代碼性能優(yōu)化時經(jīng)常將一個通用的父任務(wù)拆成幾個小任務(wù)并發(fā)執(zhí)行。此時需要將一個大的任務(wù)拆成幾個小任務(wù)并發(fā)執(zhí)行,來提高QPS,我們需要再業(yè)務(wù)代碼里嵌入以下邏輯,但這種方式存在問題:


  • 每個請求都開啟goroutinue,會有一定的性能開銷。


  • 野生的goroutinue,生命周期管理比較困難。


  • 收到類似SIGQUIT信號時,無法平滑退出。



(二)errgroup函數(shù)簽名


      
        type Group
      
      
            func WithContext(ctx context.Context) (*Group, context.Context)
      
      
            func (g *Group) Go(f func() error)
      
      
            func (g *Group) Wait() error
      
    


整個包就一個Group結(jié)構(gòu)體:


  • 通過WithContext可以創(chuàng)建一個帶取消的Group;


  • 當(dāng)然除此之外也可以零值的Group也可以直接使用,但是出錯之后就不會取消其他的goroutine了;


  • Go方法傳入一個func() error內(nèi)部會啟動一個goroutine去處理;


  • Wait類似WaitGroup的Wait方法,等待所有的goroutine結(jié)束后退出,返回的錯誤是一個出錯的err。



(三)使用案例


注意這里有一個坑,在后面的代碼中不要把ctx當(dāng)做父 context又傳給下游,因為errgroup取消了,這個context就沒用了,會導(dǎo)致下游復(fù)用的時候出錯


      
        func TestErrgroup() {
      
      
           eg, ctx := errgroup.WithContext(context.Background())
      
      
           for i := 0; i < 100; i++ {
      
      
              i := i
      
      
              eg.Go(func() error {
      
      
                 time.Sleep(2 * time.Second)
      
      
                 select {
      
      
                 case <-ctx.Done():
      
      
                    fmt.Println("Canceled:", i)
      
      
                    return nil
      
      
                 default:
      
      
                    fmt.Println("End:", i)
      
      
                    return nil
      
      
                 }})}
      
      
           if err := eg.Wait(); err != nil {
      
      
              log.Fatal(err)
      
      
           }
      
      
        }
      
    



(四)errgroup拓展包


B站拓展包

(https://github.com/go-kratos/kratos/blob/v0.3.3/pkg/sync/errgroup/errgroup.go)


相比官方的結(jié)構(gòu),B站的結(jié)構(gòu)多出了一個函數(shù)簽名管道和一個函數(shù)簽名切片,并把Context直接放入了返回的Group結(jié)構(gòu),返回僅返回一個Group結(jié)構(gòu)指針。

?

      
        type Group struct {
      
      
           err     error
      
      
           wg      sync.WaitGroup
      
      
           errOnce sync.Once
      
      
        
          
workerOnce sync.Once ch chan func(ctx context.Context) error chs []func(ctx context.Context) error
ctx context.Context cancel func() }
func WithContext(ctx context.Context) *Group { return &Group{ctx: ctx} }


Go方法可以看出并不是直接起協(xié)程的(如果管道已經(jīng)初始化好了),而是優(yōu)先將函數(shù)簽名放入管道,管道如果滿了就放入切片。


      
        func (g *Group) Go(f func(ctx context.Context) error) {
      
      
           g.wg.Add(1)
      
      
           if g.ch != nil {
      
      
              select {
      
      
              case g.ch <- f:
      
      
              default:
      
      
                 g.chs = append(g.chs, f)
      
      
              }
      
      
              return
      
      
           }
      
      
           go g.do(f)
      
      
        }
      
    


GOMAXPROCS函數(shù)其實是起了一個并發(fā)池來控制協(xié)程數(shù)量,傳入最大協(xié)程數(shù)量進(jìn)行并發(fā)消費(fèi)管道里的函數(shù)簽名:


      
        func (g *Group) GOMAXPROCS(n int) {
      
      
           if n <= 0 {
      
      
              panic("errgroup: GOMAXPROCS must great than 0")
      
      
           }
      
      
           g.workerOnce.Do(func() {
      
      
              g.ch = make(chan func(context.Context) error, n)
      
      
              for i := 0; i < n; i++ {
      
      
                 go func() {
      
      
                    for f := range g.ch {
      
      
                       g.do(f)
      
      
                    }
      
      
                 }()
      
      
              }
      
      
           })
      
      
        }
      
    


整個流程梳理下來其實就是啟動一個固定數(shù)量的并發(fā)池消費(fèi)任務(wù),Go函數(shù)其實是向管道中發(fā)送任務(wù)的生產(chǎn)者,這個設(shè)計中有意思的是他的協(xié)程生命周期的控制,他的控制方式是每發(fā)送一個任務(wù)都進(jìn)行WaitGroup加一,在最后結(jié)束時的wait函數(shù)中進(jìn)行等待,等待所有的請求都處理完才會關(guān)閉管道,返出錯誤。


tips :


  • B站拓展包主要解決了官方ErrGroup的幾個痛點(diǎn): 制并發(fā)量、 Recover住協(xié)程的Panic并打出堆棧信息。


  • Go方法并發(fā)的去調(diào)用在量很多的情況下會產(chǎn)生死鎖,因為他的切片不是線程安全的,如果要并發(fā),并發(fā)數(shù)量一定不能過大,一旦動用了任務(wù)切片,那么很有可能就在wait方法那里hold住了。這個可以加個鎖來優(yōu)化。


  • Wg watigroup只在Go方法中進(jìn)行Add(),并沒有控制消費(fèi)者的并發(fā),Wait的邏輯就是分發(fā)者都分發(fā)完成,直接關(guān)閉管道,讓消費(fèi)者并發(fā)池自行銷毀,不去管控,一旦邏輯中有完全hold住的方法那么容易產(chǎn)生內(nèi)存泄漏。


?作者簡介


60b2d8491cc0fbf55432d3ac3eb188fa.webp

李森林

騰訊后臺工程師

騰訊后臺工程師,目前負(fù)責(zé)騰訊游戲內(nèi)容平臺的設(shè)計、開發(fā)和維護(hù)工作。



推薦閱讀


福利
我為大家整理了一份 從入門到進(jìn)階的Go學(xué)習(xí)資料禮包 ,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。 關(guān)注公眾號 「polarisxu」,回復(fù)? ebook ?獲??;還可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。


瀏覽 32
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 婷婷五月综合网| 亚洲A网站| 婷婷久久五月| 久久免费视频精品| 无码伊人| 特色毛片| 欧美日韩性色无码免费| 日韩人妻精品一区二区| 日韩人妻无码一区二区三区中文 | 亚洲视频久久| 黑人猛躁白人BBBBBBBBB| 国产精品毛片一区二区在线看| 大香蕉啪啪啪啪| 男女精品一区| 内射视频网站| 你懂的视频在线| 一级成人A片| 久草国产精品| 91亚洲综合| 欧美日韩久久久| 足交在线播放| 亚洲成人AV一区二区| 久久亚洲福利视频| 成人网站在线| 91视频亚洲| 日本不卡一区二区三区| 成人黄A片免费| 国产18毛片18水多精品| 伊人网综合| 熟练中出-波多野结衣| 思思热思思操| 婷婷精品免费| 欧美色色色| 色99999| 婷婷在线综合| 亚洲av男人天堂| 搡女人视频国产一级午夜片| 成人免费黄色片| 天天舔天天射| 成人免费啪啪视频| 伊人666| 你懂的在线视频观看| 女BBBBBB女BBB| 一区二区三区四区视频| 91AV视频在线观看| 插进去综合网| 欧美A片在线观看| 最新av在线| 亚洲免费黄色| 日本欧美亚洲| 亚洲精品第一页| 丁香五月婷婷六月| 国产无遮挡| 欧美a片在线观看| 亚洲精品一二| 熟女人妻一区二区| 久久成人福利| 豆花成人视频在线观看| 成人动漫| 亚洲偷拍视频| 亚洲精品自拍偷拍| 无套内射在线| 日韩加勒比在线| 国产一级操逼片| 夜夜bb| 中文字幕无码精品三级在线欧美| 亚洲欧洲免费看| 天天撸天天干天天日| 色婷婷免费视频| 综合久久中文字幕| 特级欧美AAAAAA| 日韩欧美一区二区在线观看| 天天色操| 曰韩精品| 国产丰满大乳无码免费播放| 成人视频毛片| 最好看2019中文在线播放电影| 黄色激情AV| 日韩欧美视频一区国产欧美在线| 欧美操B电影| 一区二区三区久久久| 91小视频| 亚洲第一黄色| 成人免费黄色| 午夜福利在线视频| 日韩在线视频免费| 欧美成人精品激情在线视频| 欧美成人一级a片| 91操美女视频| 国产欧美日本视频| 国产喷水ThePorn| youjizzcom日本| 九九九精品| 99热这里有精品| 日韩AV免费在线观看| 国产va| 中文字幕在线无码视频| 超碰97免费| 国产www视频| www伦理片-韩国三级三级三级a三级-成人AV | 午夜黄色福利| 一本久久A精品一合区久久久 | 久久香蕉网站| 一本色道久久88综合无码| 欧美亚韩一区二区三区| 一区二区三区视频在线| 亚欧视频在线观看| 日本一区二区三| 日韩超碰在线| 97福利| 超碰97免费在线| 国产AV不卡| 你懂的网站在线观看| 波多野结衣一级婬片A片免费下载| ChineSe露脸老女人| 免看一级a毛片一片成人不卡| 97日韩天堂| 亚洲天堂网在线观看视频| 免费无码在线观看| 亚洲中文字幕码mv| 东北老女人操逼视频| 人成在线视频| 精品999999| 麻豆传媒免费观看| 91九色精品女同系列| 中文字幕日韩欧美在线| 在线播放毛片| 天天色操| 免费日韩无码| 亚洲一区二区三区在线视频| 国产伊人在线| 亚洲欧洲高清无码| 亚洲免费AV在线| 91日日| 无码人妻一区二区三区| 韩国无码人妻| 日韩无码首页| 青青草成人网| 婷婷五月天激情网| 亚洲熟女一区二区| 正在播放亚洲| 日韩肏屄视频在线观看| 日本黄色视频官网| 丝袜东京热AV高清| 精品人妻一区二区三区日产乱码 | 国产A片| 99热精品在线| 东北成人毛片| 亚洲日韩精品在线视频| 亚洲无码观看视频| 天天草天天| a网站在线观看| 大鸡巴在线视频| 蜜桃av在线播放| 97激情| 这里都是精品| 在线看国产| 五月丁香天堂网| 91在线无码| 毛片A级成人片| 91精品国产成人www| 青青草社区视频| 日韩三级片在线播放| 91亚洲精选| 国产三级国产三级国产| 91爱爱视频| 大香蕉啪啪| 美女做爱在线观看| 日韩黄色免费网站| 99国产精品久久久久久久成人| 在线观看的av网站| 无码人妻精品一区二区三| 操逼综合| 免费看欧美成人A片| 台湾色综合| 精品成人AV| 91抽插| 欧美性爱91| 99精品视频在线| 国产一级影院| 欧美亚洲操逼视频| 91亚洲国产成人久久精品麻豆| 欧美亚洲日韩国产| 无码免费观看视频| 后入少妇视频| 黄色av网站免费| 91人妻人人澡人人爽人人爽| 性爱福利视频| 日韩一二区| 亚洲无码在线观看免费| henhengan| 不卡视频一区二区三区| 日本黄在线观看| 天堂中文在线资源| 国产麻豆精品ThePorn| 国产91在线看| 18禁无码永久免费网站大全| 国产ww| 激情毛片| 一牛影视精品av| 日本爱爱免费播放视频| 婷婷色在线播放| 超碰乱伦| 热无码av| 九九九视频在线观看| 可以免费观看的av| a√天堂中文在线8| 国产色五月| 色婷婷久久综合久色| 91精品视频在线播放| 国产特級黃色大片| 深爱开心激情| 探花在线综合| 曰韩毛片| 大香蕉现在视频中心一| 欧美日韩免费观看视频| 成人做爰黄A片免费视频网站野外| 日韩无码动漫| 91精品视频在线| 欧美精品操逼| 91人人人人| 日本爱爱小视频| 亚洲无码影视| AV在线大香蕉| 中日韩特黄A片免费视频| 日韩午夜福利视频| 丰满人妻一区二区三区视频在线不卡 | 亚洲AV激情无码专区在线播放| 日韩无码高清视频| 久久久久久久久久久久成人 | 一本加勒比HEZYO东京热无码| 日韩AV中文字幕在线| 影音先锋久久| 午夜成人国产| 久久婷婷六月| 2021无码| 天天扣天天操| 亚洲天堂在线观看免费视频| www.亚洲精品| 2019中文字幕在线免费观看| 国产亚洲无码激情前后夹击| 国产亚洲精品码| 免费无码国产在线53| 成人日韩精品| 免费国产三级片| 亚洲精品中文字幕无码| 大香蕉精品欧美色综合2025| 91久久久久久久18| 国产成人免费观看| 美国操逼片| 日韩第五页| 三级在线观看视频| 无码网址| 久久久精品中文字幕麻豆发布 | 国产精品久久久久无码| 黄色视频网站在线| 丰满人妻一区二区三区精品高清| 国产黄色视频网站在线观看| 天天干,夜夜操| 亚洲内射网| 天天干人人干| 久草视频免费| 国产一区免费视频| 安徽妇搡BBBB搡BBBB按摩| 毛片视频免费观看| 中文字幕有码在线播放| 日本69视频| 精东影业秘国产传媒| 亚洲无码在线观看免费| 国产精品丝袜| 日本精品一区二区三区四区的功能| 北条麻纪视频| 五月天综合视频| 中文无码熟妇人妻AV在线| 夜夜操操| 五月天婷婷激情网| 日逼黄片| 51妺妺嘿嘿午夜成人| 日批国产| 97男人的天堂| 成人免费看A片| 免费黄色一级片| 欧美一道本在线| 日本欧美在线视频| 超碰免费在线观看| 国产精品欧美日韩| 婷婷内射| 麻豆电影| 91精品无码一区二区| 啪啪免费网站| 又大又粗AV| 强开小嫩苞一区二区电影| 天天干天天干| 日逼黄色视频| 欧美精品在线播放| 亚洲综合成人在线| 黄色小视频在线免费看| 亚洲天堂无码| 自拍偷拍图区| 色婷婷丁香五月天| www.91在线视频| AV中文字幕网| 亚洲一级免费在线观看| 男人的天堂免费视频| 成人午夜精品| 成人免费视频网站| 高清无码在线免费| av天天av无码av天天爽| 国产2页| 亚洲五月婷婷| 黄色亚洲网站| 中文一级片| 夜夜撸一撸| 日本免费视频| 亚洲天堂在线观看网站| 日韩在线观看视频网站| 亚洲视频在线观看| 欧美日韩一区视频| 亚洲第一在线| 91久久超碰| 成人国产在线观看| 3D精品啪啪一区二区三区| 无码人妻精品一区二区蜜桃91| 国产操比网| 日韩少妇无码视频| 2025精品偷拍视频| av六月天| av无码高清| 中文无码影院| 亚洲欧美另类在线| 91在线欧美| 黄骗免费网站| 欧美黄片在线免费看| 三级黄色毛片| 人妻少妇被猛烈进入中文字幕| a片视频网站| 亚洲视频一区| 亚洲AV无码精品国产| 99在线免费观看视频| 天天综合天天| 在线黄色网| 黄色一级大片在线免费看产| 97久久久| 久久久91人妻无码精品蜜桃ID| 亚洲女人被黑人巨大进入| 大陆搡BBBBB搡BBBBBB| 人人草在线视频| 一级A片黃色A片| 加勒比无码| 在线观看免费黄视频| 无码精品视频在线观看| 男人资源在线| 一级欧美日韩| 国产又粗又长又硬又大毛苴茸图片 | 婷婷五月天视频| 波多野结衣视频免费在线观看| 免费a在线观看| 成人精品一区日本无码网站suv/ | 极品美鮑20p| 天堂AV色| 免费在线观看黄色片| 久久久久亚洲AV成人片| 欧美伊人大香蕉| 日韩高清色| 无码成人AV| 无码一级A片| 亚洲国产婷婷香蕉A片| WW免费视频| 国产精品无码成人AV在线播放| 国产夫妻av| 影音先锋日韩| 激情婷婷丁香| 中文字幕亞洲高清手機版第617| 亚洲中文字幕在线无码| 国产日韩精品无码去免费专区国产| 久久久久久久艹| 中文字幕在线观看视频www| 五月天婷婷网站| 亚洲免费婷婷| 丰满人妻一区二区三区四区54| 日韩免费视频| 亚州成人视频| 中文无码熟妇一区二区| 水蜜桃在线观看视频| 欧美性爱在线网站| 国产视频无码| 韩国无码视频在线观看| 欧美成人网站在线观看| 欧美日韩中文字幕在线视频| 高清色色女网站| 日韩性爱区| 蜜桃av久久久亚洲精品| 水蜜桃网| 国精产品一区一区三区有限公司杨| 国产精品色哟哟| 在线天堂999| 日本一级按摩片免费观看| 国产一区二区三区在线观看免费视频免费视频免费视频 | 69AV在线观看| 久久视频免费在线观看| 91性爱| www.日本色| 91夜夜夜| 国产精品国产| XXXX国产| 91成人在线| 天天色影院| 苏妲己一级婬片A片| 超碰精品在线| 國產精品777777777| 尻屄视频| 北条麻妃中文字幕在线观看| 成人午夜小电影| 91在线小视频| 黄色无码视频在线观看| 美女一级变态毛片| 亚洲涩情91日韩一区二区| www.91超碰在线| 三级小说| 91干干| 亚洲国产操逼| 黄色大片免费观看| 台湾精品一区二区三区| 日韩视频中文字幕| 影音先锋av资源在线| JIZZJIZZ国产精品喷水| 亚洲视频综合| 无码不卡av| 一级操逼视频免费观看| 色婷婷在线视频观看| 色哟哟――国产精品| 黄片www| 日韩午夜av| 色就色欧美| 伊人大香蕉综合| 亚洲区中文字幕| 亚洲成年人网| 久草视频免费| 9久9久9久9久女女女女| 人人爱人人插高清| 亚洲色情在线观看| www.199麻豆在线观看网站| 777免费观看成人电影视频 | 色欲综合网| 熟女伦乱| 91在线无码精品秘国产三年| 国产v在线| 午夜成人无码视频| 青草视频在线| h国产在线| 少妇成人网| 无码人妻一区二区三区四区老鸭窝| 午夜福利aaa| 久久免费毛片| 国产美女被操| 色老板亚洲| 日韩欧美三级在线| 免费中文资源在线观看| 久久91欧美特黄A片| 日韩欧美亚洲一区二区三区| 亚洲Japanese办公室制服| 91女人18片女毛片60分钟| 日韩在线女优天天干| 天天操天天干欧美精品| 三级高清无码| 国产又粗又猛又爽又黄91精品 | 天天色色综合| 欧美老女人操逼视频| 手机在线成人视频| 在线免费看av| 亚洲欧美成人在线观看| 亚洲婷婷视频| 杨晨晨不雅视频| 超碰97久久| 囯产一级a一级a免费视频| 久久久久久久久久久久久久久久久久免费精品分类视频 | 影音先锋日韩资源| 蜜臀久久久99久久久久久久| 久草在线资源| 欧美三级片在线播放| 2025精品视频| a片在线免费播放| 大吊妞| 人人爽人人澡| 男人的天堂在线播放| 天堂视频中文在线| 国产A√| 色天天| 竹菊传媒一区二区三区| 成人黄色一级| 麻豆免费成人传媒| 性一区| 精品素人在线| AV天堂国产| 四虎无码| 亚洲专区在线播放| 亚洲真人无码| 人妻无码蜜桃视频| 91九色口爆吞精| 免费黄色三级片| 国产一区二区视频在线| 中文在线最新版天堂8| 久久婷婷秘精品国产538| 北条麻妃无码一区二区| 啪啪免费网| 欧美在线观看网站18| 中文字幕在线观看av| 无码偷拍| 青青青亚州视频在线| 人人澡人人妻人人爽| 中文无码AV| 在线AⅤ| 免费啪啪网| 青青草视频免费观看| 靠比免费| 免费无码国产在线观看快色| 亚洲日本国产| 亚洲成人在线观看视频| 91久久久久久久久久久| 国产一级视频| www.污| 欧美成人黄色小说| 伊人大香在线| 久久久精品999| 色婷婷丁香| 人人妻人人爽人人澡人人精品| 日产精品久久久久| 亚洲国产精品精JIZZ老师| 波多野结衣av在线观看窜天猴 | 国产激情自拍| 亚洲无码制服| 亚洲天堂日本| 色吧超碰| 亚洲av小电影| 男女嫩草视频| 久久精品视频18| 亚洲小黄片| 在线观看亚洲一区| 色婷婷AV在线| 国产免费乱伦| 高清无码视频网站| 蜜桃av色偷偷av老熟女| 亚洲黄色视频网站在线观看| 第一福利导航大全| 人人妻人人做| 秋霞一区二区三区无码| 黄色小电影网站| 久久久久久久91| AV青青草| 1000部毛片A片免费视频| 精品成人无码一区二区三区| 法国《少女日记》电影| 欧美色婷婷| 蜜臀精品| 成年人黄色视频在线观看| 美日韩AV| 欧美日韩一级二级三级| 四虎影库男人天堂| 中文字幕亚洲精品| 91精品人妻一区二区三区蜜桃欧美 | 日本一区免费| 国产成人精品无码区在线| 黄色国产视频在线观看| 亚洲综合网在线| MAD033_后宫秘密陶子.| 日韩福利视频| 午夜性福利| 99免费在线观看视频| 丁香五月激情啪啪啪| 黄片高清无码在线观看| 一级特黄大片录像i| xxx国产精品| 婷婷五月亚洲| 日本一区二区三区在线视频| 无码成人AV| 少妇推油呻吟白浆啪啪成人片 | 2025av天堂网| 天天夜夜操| 免费无码毛片一区二区A片| 久久国产一区二区| 欧美一级黄片免费看| 在线综合国产欧美| 国产一级在线观看| 成人福利| 操屄免费视频| 免费看国产黄色视频| 国产成人免费视频在线| 老湿机福利院| 大地中文资源5页的更新内容| 国内精品人妻无码久久久影院蜜桃 | 免费网站观看www在线观| 蜜臀久久精品久久久久| 在线乱视频| 特一级黄A片| 日韩高清色| 成人视频三级| 亚洲视频无码| 91久久精品日日躁夜夜躁国产| 午夜精品18| 爱爱黄色视频| 久久精品视频99| 国产成人无码精品久在线观看 | 蜜臀导航| 色丁香五月婷婷| 操比网| 91精品在线免费观看| 中文字幕亚洲无码视频| 一级黄色片网站| 久久婷婷五月丁香| 日韩无码一| 自慰一区| 大香蕉福利在线| 国产免费激情视频| 91在线无码精品国产三年| 大香蕉99| 蜜臀AV在线| 欧美性爱一区| 亚洲精品一区二区三区| www.久久99| 特级西西444www高清| 黄色小视频免费观看| 色色影院| 日本不卡在线视频| 91久久精品视频| 亚洲欧洲av| 日韩人妻AV| AV在线一区二区三区| 亚洲免费观看高清完整版在线观| 91大香蕉伊人| 日韩,变态,另类,中文,人妻 | 亚洲综合色色| 第九色| 精品91视频| 在线内射视频| 大香久久| 2025av在线| 一级性爽A√毛片| 欧美VA视频| 成人电影无码| 免费国产A片| 无码中文AV| 囯产精品久久久久久久久免费无码| 国产粉嫩在线观看| 色老板在线观看视频| 激情综合视频| 夜夜撸日日| 欧美成人无码一区二区三区 | 91一起草高清资源| 少妇高潮日韩| 青青草视频91| 激情人妻网站| 亚洲无码中文字幕在线| 白天操夜夜操| 久久久久亚洲AV无码网影音先锋 | 伊人久久精品| 国产成人自拍偷拍视频| 最近日本中文字幕中文翻译歌词| 人人干人人妻| 激情综合视频| 性爱AV天堂| 第一页在线观看| 日韩一区二区三| 老熟女导航| 亚洲无码在线视频观看| 91久热| 国产区欧美去区在线| 日韩欧美精品| 日韩中文在线播放| 国产无套免费网站69| 黄色A片免费看| 亚洲一级黄色视频| 国产乱伦自拍| 骚逼av| 爱爱毛片| 激情五月综合| 久草在线| 国产清纯可爱美女自卫裸贷偷情| 99热加勒比| 性做久久久久久| 蜜桃视频91| 苍井空在线播放| 三级片AAAA| 国产性生活视频| 亚洲精品成人AV| 韩国成人无码| 一级电影视频去去去| 山西真实国产乱子伦| 水蜜桃视频免费| 真实野外打野视频| 亚洲中文娱乐| 国产一区二区三区免费播放| 国产激情精品| 九色在线视频| 亚洲欧美在线观看| 欧美精品午夜福利无码| 日韩无码二级| 中文字幕在线无码观看| 97伊人超碰| 成人先锋影音| 天天无码视频| 日皮在线观看| 先锋影音资源网站| 国产精品一卡| 天天干天天干天天日| 伊人午夜| 中文字幕免费久久| 麻豆少妇| 欧美一级性爱在线观看| 欧美激情视频一区| 人人上人人摸| 蜜桃精品视频在线观看| 各种妇女撒尿mm毛免费网站 | 99热黄| 欧美性爱在线视频| 日韩黄色电影在线观看| 影音先锋成人| 婷婷开心色四房播播免费| 亚洲视频三区| 91久久人澡人妻人人澡人人爽 | 欧美黄色免费观看| 久久久噜噜噜久久中文字幕色伊伊| 国产第一页在线观看| 操逼视频免费看| 免费看A级片| 噼里啪啦免费观看视频大全| 色视频免费在线观看| 肏屄视频网站| 中文字幕第69页| 精东影业秘国产传媒| 激情黄色五月天| 韩国精品久久久| 亚洲无码A片在线| 91大神在线免费观看| 国产白丝精品91爽爽久久| 91首页| 成人视频在线观看黄色18| 豆花视频成人网站入口免费观看| www.蜜桃| 国产日韩欧美综合精品在线观看| 黄色视频在线| 午夜精品久久久久久久91蜜桃| 成人免费看A片| 欧美性爱xxxx| 色婷婷AV国产精品| 91精品无码| 亚洲AV秘一区二区色盗战流出| 日韩成人无码影片| 91蝌蚪视频在线播放| 五月天色色网站| 天天爽夜夜爽人人爽| 国产亚洲视频在线观看| 中字无码| 欧美久草蜜桃视频| 一区二区三区四区无码在线| 国产videos| 日韩黄片免费看| 黄色av免费| 超碰免费在线| 欧美日本一区二区三区| 精品成人av| 大香蕉色伊人| 丰满老妇高潮一级A片| 一级黄色视频网站| 国产精品久久| 最美人妖系列国产Ts涵涵| 在线高清无码视频| 午夜福利小视频| 成人视频免费| 操东北老女人| 婷婷激情中文字幕| 日韩午夜在线观看| 午夜神马影院| 七十路の高齡熟妇无码| 中文字幕无码人妻| 免费AV网站观看| 91视频免费| 69成人视频| 国产成人免费观看| 狠狠色婷婷| 中文字幕在线欧美| 操逼123首页| 成人在线A片| 久久草草热国产精品| 欧美天堂成人三级| 免费高清无码在线| 免费无码网站| 国产区AV| 国产乱子伦真实精品| 亚洲国产剧情| 色色五月丁香| 久久77777| 亚洲黄片免费观看| 免费看毛片中文字幕| 懂色AV无码中字幕一区| 99在线视频免费| 亚洲自拍电影| 在线播放中文字幕| 国产三级一区| av影片在线播放| 日韩久久免费视频| 天天狠狠| 天堂av中文字幕| 亚洲欧美成人在线视频| 91人人妻人人澡人人爽人人| 成人视频网站在线观看| 日韩极品视频在线| 欧美福利在线观看| 91丨PORNY丨丰满人妻网站| 色综合99| 影音先锋女人资源| 一区二区经典| 91亚洲国产AⅤ精品一区二区 | 日日夜夜av| 天天操天天操免费视频| 成人天天爽| 国产一区二区电影| 西西444www无码精品| 插菊花综合网1| 伊人久久大香蕉视频| 粉嫩小泬BBBBBB免费看| 免费a片视频| 国产激情在线观看| 午夜激情操一操| 高清无码日本| 国产精品v| 久久99久久视频| 91精品丝袜久久久久久| 亚洲成人久久久| 日韩人妻精品中文字幕免费| www.seses| 久久一道| 91人妻精| 国产丝袜AV| 欧美日韩一区在线观看| 无码理论片| 亚洲免费网站| 骚骚肥肥一区二区三区| 亚洲精品中文字幕在线观看| 人人看人人爽| 免费看黄色电影| 一本大道东京热AV| 国产黃色AAA片| 高清av免费| 91爱爱·com| 国产成人精品电影| 色逼高清| 日日夜夜无码| 美女肏逼| 亚洲婷婷三级成人网| 中文字幕免费av| www.99av| 69精品视频| 亚洲一区无码在线观看| 亚洲第一视频在线观看| 日本黄色视频免费观看| 亚洲欧美国产另类| 婷婷五月天性爱| 黄色特级片| 丰满少妇一级片| 久久免费视频,久久免费视频| 在线永久看片免费的视频| 欧美成人性爱网址| 中文字幕免费MV第一季歌词| 欧美老逼| 免费在线性爱视频| 天天干人人干| 成人片网址| 色久悠悠综合网| 青青草无码在线| 亚洲a在线观看| 欧美久色| 成人亚洲AV| 成人自拍偷拍| 黄色爱爱视频| 69网站| 亚洲精品乱码久久久久久按摩观| 91久久久久久久久久久久18 | 无码成人AV| 一区二区三区视频| 三级视频国产| 操片免费| 国色天香一区二区| 韩国三级HD久久精品| 黄色AA片| 在线免费观看国产视频| 国产第一页在线播放| 亚洲精品视频在线| av手机天堂网| av无码中文| 性A免费在线播放| 麻豆成人精品| 男人的天堂黄色| 99性爱网| 亚洲国产熟妇无码日韩| 欧美黄片免费看| 日本A在线播放| 毛片视频网站| 国产欧美在线观看不卡| 狼人综合在线| 伊人网在线播放|