3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

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

编程问答

深入解析go依赖注入库go.uber.org/fx

發布時間:2024/3/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入解析go依赖注入库go.uber.org/fx 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

后面更新采用肝一篇go官方源碼,肝一篇框架源碼形式,傷肝->護肝,如果你喜歡就點個贊吧。官方源碼比較傷肝(* ̄︶ ̄)。

1依賴注入

初識依賴注入來自開源項目Grafana 的源碼,該項目框架采用依賴注入方式對各結構體字段進行賦值。DI 依賴注入包為https://github.com/facebookarchive/inject,后面我會專門介紹這個包依賴注入的原理。不過今天的主角是它:https://github.com/uber-go/fx。

該包統一采用構造函數Newxx()形式進行依賴注入,對比與inject ,我認為比較好的點:

  • 采用Newxx()形式顯示聲明,更利于構造單元測試
  • 采用Newxx()能更直觀,表明我這個對象需要什么,inject 后面是tag,與結構體字段混在一起。
  • 有時我們需要另一個對象,但不希望它出現在結構體字段里面

來看看我們自己給結構體賦值怎么做

假設我們一個對象需要b對象賦值,b 對象需要c 對象賦值,那么我們該這么寫

package main ? type A struct {B* B } ? func NewA( b *B)* A {return &A{B: b} } type B struct {C *C } func NewB(c * C)*B {return &B{c} } type C struct { ? } func NewC()*C {return &C{} } func main() {//我們需要一個ab:=NewB(NewC())a:=NewA(b)_=aPrintA(a) } func PrintA(a* A) {fmt.Println(*a) } ?

如果選擇依賴注入呢,實際情況可能更加復雜,如果有更好的方式,那么一定是DI 依賴注入了

package main ? import ("fmt""go.uber.org/fx" ) ? type A struct {B* B } ? func NewA( b *B)* A {return &A{B: b} } type B struct {C *C } func NewB(c * C)*B {return &B{c} } type C struct { ? } func NewC()*C {return &C{} } func main() {fx.New(fx.Provide(NewB),fx.Provide(NewA),fx.Provide(NewC),fx.Invoke(PrintA),) } func PrintA(a* A) {fmt.Println(*a) } ?

文章末尾有完整http項目實踐例子,附上github地址:https://github.com/yangtaolirong/fx-demo,大家可以根據自己需求進行優化。

2使用

New()

該函數時創建一個依賴注入實例

option 的結構

// An Option configures an App using the functional options paradigm // popularized by Rob Pike. If you're unfamiliar with this style, see // https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html. type Option interface {fmt.Stringer ?apply(*App) }

option 必須使用下面的幾個方法進行生成,來看個demo

package main ? import ("context""go.uber.org/fx" ) ? type Girl struct {Name stringAge int } ? func NewGirl()*Girl {return &Girl{Name: "蒼井",Age: 18,} } type Gay struct {Girl * Girl } ? func NewGay (girl * Girl)*Gay {return &Gay{girl} } func main() {app:=fx.New(fx.Provide(NewGay),fx.Provide(NewGirl),)err:=app.Start(context.Background())if err!=nil{panic(err)} }

Provide()

該函數將被依賴的對象的構造函數傳進去,傳進去的函數必須是個待返回值的函數指針

fx.Provide(NewGay)

fx.Provide(NewGirl)

Invoke()

該函數將函數依賴的對象作為參數傳進函數然后調用函數

func main() {invoke:= func(gay* Gay) {fmt.Println(gay.Girl) //&{蒼井 18} ?}app:=fx.New(fx.Provide(NewGay),fx.Provide(NewGirl),fx.Invoke(invoke),)err:=app.Start(context.Background())if err!=nil{panic(err)} }

Supply()

該函數直接提供被依賴的對象。不過這個supply 不能提供一個接口

func main() {invoke:= func(gay* Gay) {fmt.Println(gay.Girl)}girl:=NewGirl() //直接提供對象app:=fx.New(fx.Provide(NewGay),fx.Supply(girl),fx.Invoke(invoke),)err:=app.Start(context.Background())if err!=nil{panic(err)} }

不能提供接口類型,比如我們使用Provide可以提供一個SayInterface類型的接口,該代碼運行不會報錯,但我們換成supply 以后就會有問題

type Girl struct {Name stringAge int } ? func NewGirl()SayInterface {return &Girl{Name: "蒼井",Age: 18,} } ? type Gay struct {Girl * Girl } ? func (g* Girl)SayHello() {fmt.Println("girl sayhello") } func NewGay (say SayInterface)*Gay {//此處能夠正常獲取到return &Gay{} } ? type SayInterface interface {SayHello() } func main() {invoke:= func(gay *Gay) { ?}app:=fx.New(fx.Provide(NewGirl),fx.Provide(NewGay),fx.Invoke(invoke),)err:=app.Start(context.Background())if err!=nil{panic(err)} } ?

通過supply 提供就會報錯

func main() {invoke:= func(gay *Gay) { ?}app:=fx.New(fx.Supply(NewGirl()),fx.Provide(NewGay),fx.Invoke(invoke),)err:=app.Start(context.Background())if err!=nil{panic(err)} }

或者這種形式

func main() {invoke:= func(gay *Gay) { ?}var girl SayInterface=&Girl{}app:=fx.New(fx.Supply(girl),fx.Provide(NewGay),fx.Invoke(invoke),)err:=app.Start(context.Background())if err!=nil{panic(err)} } ?

錯誤:

Failed: could not build arguments for function "main".main.func1 (D:/code/leetcode/fx.go:39): failed to build * main.Gay: missing dependencies for function "main".NewGay (D:/code/leetcode/fx.go:29): missing type: main.SayIn terface (did you mean *main.Girl?) ?

原因我會在后面分析,反正是識別成了結構體真正的類型而不是接口類型,平時在使用中,也是一個坑

Populate()

該函數將通過容器內值外面的變量進行賦值

func main() {invoke:= func(gay *Gay) { ?}var gay *Gay //定義一個對象,值為nilapp:=fx.New(fx.Provide(NewGirl),fx.Provide(NewGay),fx.Invoke(invoke),fx.Populate(&gay),//調用Populate,這里必須是指針,因為是通過*target 來給元素賦值的)fmt.Println(gay) //&{0xc00008c680},將NewGay返回的對象放進var定義的變量里面了err:=app.Start(context.Background())if err!=nil{panic(err)} }

原理

將傳進來的參數,換成函數,參數為target,函數結果為類似下面這種類型,最后轉換成invoke類型進行調用

// Build a function that looks like://// func(t1 T1, t2 T2, ...) {// *targets[0] = t1// *targets[1] = t2// [...]// }//

下面是函數實現

// Populate sets targets with values from the dependency injection container // during application initialization. All targets must be pointers to the // values that must be populated. Pointers to structs that embed In are // supported, which can be used to populate multiple values in a struct. // // This is most helpful in unit tests: it lets tests leverage Fx's automatic // constructor wiring to build a few structs, but then extract those structs // for further testing. func Populate(targets ...interface{}) Option {// Validate all targets are non-nil pointers.targetTypes := make([]reflect.Type, len(targets))for i, t := range targets {if t == nil {return invokeErr(fmt.Errorf("failed to Populate: target %v is nil", i+1))}rt := reflect.TypeOf(t)if rt.Kind() != reflect.Ptr {return invokeErr(fmt.Errorf("failed to Populate: target %v is not a pointer type, got %T", i+1, t))} ?targetTypes[i] = reflect.TypeOf(t).Elem()} ?// Build a function that looks like://// func(t1 T1, t2 T2, ...) {// *targets[0] = t1// *targets[1] = t2// [...]// }//fnType := reflect.FuncOf(targetTypes, nil, false /* variadic */) //制造函數的類型fn := reflect.MakeFunc(fnType, func(args []reflect.Value) []reflect.Value {//制造函數for i, arg := range args {reflect.ValueOf(targets[i]).Elem().Set(arg)}return nil})return Invoke(fn.Interface()) //invoke選項 }
  • reflect.FuncOf該函數作用是通過指定的參數類型和返回類型創造一個函數,共有3個參數,variadic代表是不是可選參數
    FuncOf(in, out []Type, variadic bool) Type
  • reflect.MakeFunc代表按照什么函數類型制造函數,其中第二個參數是個回調函數,代表函數的傳參值和返回值,意思是將函數傳進來的參數值賦值給Populate傳進來的值

Annotated

http://fx.in

annotated提供高級功能,讓相同的對象按照tag能夠賦值到一個結構體上面,結構體必須內嵌http://fx.in

type Gay struct {fx.InGirl1 * Girl `name:"波多"`Girl2 * Girl `name:"海翼"`Girls []*Girl `group:"actor"` } func main() {invoke:= func(gay Gay) {fmt.Println(gay.Girl1.Name)//波多fmt.Println(gay.Girl2.Name)//海翼fmt.Println(len(gay.Girls),gay.Girls[0].Name)//1 杏梨} ?app:=fx.New(fx.Invoke(invoke),fx.Provide( ?fx.Annotated{Target: func() *Girl { return &Girl{Name: "波多"} },Name: "波多",},fx.Annotated{Target: func() *Girl { return &Girl{Name: "海翼"} },Name: "海翼",},fx.Annotated{Target: func() *Girl { return &Girl{Name: "杏梨"} },Group: "actor",},), ?) ?err:=app.Start(context.Background())if err!=nil{panic(err)} }

不帶tag的annotated,下面這種寫法是可以的

type Gay struct {fx.InGirl1 * Girl } func main() {invoke:= func(gay Gay) {fmt.Println(gay.Girl1.Name)} ?app:=fx.New(fx.Invoke(invoke),fx.Provide( ?fx.Annotated{Target: func() *Girl { return &Girl{Name: "波多"} },},//下面不能再添加fx.Annotated,不能識別了,因為是匿名的), ?) ?err:=app.Start(context.Background())if err!=nil{panic(err)} }

group寫多個,用","分開

type Gay struct {fx.InGirl1[]* Girl `group:"actor"` } func main() {invoke:= func(gay Gay) {fmt.Println(len(gay.Girl1))} ?app:=fx.New(fx.Invoke(invoke),fx.Provide( ?fx.Annotated{Target: func() *Girl { return &Girl{Name: "波多"} },Group: "actor,beauty",},), ?) ?err:=app.Start(context.Background())if err!=nil{panic(err)} } ?

錯誤的寫法,Group和Name 是不能同時存在的

fx.Annotated{Target: func() *Girl { return &Girl{Name: "波多"} },Group: "actor,beauty",Name:"波多"},

當返回切片時,需要在group 后面加上flatten

func NewGirl()[]*Girl {return []*Girl{{Name: "蒼井",Age: 18,}} } type Gay struct {fx.InGirl1 []* Girl `group:"actor"` } ? ? ? func main() {invoke:= func(gay Gay) {fmt.Println(gay)} ?app:=fx.New(fx.Invoke(invoke),fx.Provide(fx.Annotated{Target: NewGirl,Group: "actor,flatten",},),) ?err:=app.Start(context.Background())if err!=nil{panic(err)} } ?

fx.out

fx.out會將當前結構體的字段按名字輸出,相當于

fx.Annotated{Target: func() *Girl { return &Girl{Name: "海翼"} },Name: "海翼",}, //或者fx.Annotated{Target: func() *Girl { return &Girl{Name: "杏梨"} },Group: "actor",},

所以在另一個結構體寫上http://fx.in?就能按名字接收到了

type Gay struct {fx.OutGirl1 * Girl `name:"波多"` } type Gay1 struct {fx.OutGirl1 * Girl `name:"倉井"` } type Man struct {fx.InGirl1 * Girl `name:"波多"`Girl2 * Girl `name:"倉井"` } func NewGay()Gay {return Gay{Girl1:&Girl{Name: "波多"},} } func NewGay1()Gay1 {return Gay1{Girl1:&Girl{Name: "倉井"},} } func main() {invoke:= func(man Man) {fmt.Println(man.Girl1.Name)//波多fmt.Println(man.Girl2.Name) //倉井} ?app:=fx.New(fx.Invoke(invoke),fx.Provide(NewGay,NewGay1,),) ?err:=app.Start(context.Background())if err!=nil{panic(err)} }

源碼解析

核心方法New

// New creates and initializes an App, immediately executing any functions //創建和初始化app 實例,并且是立即執行注冊和調用的 // registered via Invoke options. See the documentation of the App struct for // details on the application's initialization, startup, and shutdown logic. ? func New(opts ...Option) *App {logger := fxlog.DefaultLogger(os.Stderr) //獲取日志實例 ?app := &App{//創建app 實例// We start with a logger that writes to stderr. One of the// following three things can change this://// - fx.Logger was provided to change the output stream// - fx.WithLogger was provided to change the logger// implementation// - Both, fx.Logger and fx.WithLogger were provided//// The first two cases are straightforward: we use what the// user gave us. For the last case, however, we need to fall// back to what was provided to fx.Logger if fx.WithLogger// fails.log: logger,startTimeout: DefaultTimeout, //啟動超時時間stopTimeout: DefaultTimeout, //停止超時時間} ?for _, opt := range opts {opt.apply(app)//用opt 初始化app} ?// There are a few levels of wrapping on the lifecycle here. To quickly// cover them://// - lifecycleWrapper ensures that we don't unintentionally expose the// Start and Stop methods of the internal lifecycle.Lifecycle type// - lifecycleWrapper also adapts the internal lifecycle.Hook type into// the public fx.Hook type.// - appLogger ensures that the lifecycle always logs events to the// "current" logger associated with the fx.App.app.lifecycle = &lifecycleWrapper{ //初始生命周期函數lifecycle.New(appLogger{app}),} ?var (bufferLogger *logBuffer // nil if WithLogger was not used ?// Logger we fall back to if the custom logger fails to build.// This will be a DefaultLogger that writes to stderr if the// user didn't use fx.Logger, and a DefaultLogger that writes// to their output stream if they did.fallbackLogger fxevent.Logger)if app.logConstructor != nil {// Since user supplied a custom logger, use a buffered logger// to hold all messages until user supplied logger is// instantiated. Then we flush those messages after fully// constructing the custom logger.bufferLogger = new(logBuffer)fallbackLogger, app.log = app.log, bufferLogger} ?app.container = dig.New( //創建containerdig.DeferAcyclicVerification(),dig.DryRun(app.validate),) ?for _, p := range app.provides { //app.provides 通過opt 已經初始化了,所以這就是調用fx.Provide()里面的構造函數app.provide(p)}frames := fxreflect.CallerStack(0, 0) // include New in the stack for default Providesapp.provide(provide{Target: func() Lifecycle { return app.lifecycle }, //將app.lifecycle這個對象提供出去Stack: frames,})//提供shutdowner,和dotGraph這兩個實例app.provide(provide{Target: app.shutdowner, Stack: frames})app.provide(provide{Target: app.dotGraph, Stack: frames}) ?// If you are thinking about returning here after provides: do not (just yet)!// If a custom logger was being used, we're still buffering messages.// We'll want to flush them to the logger. ?// If WithLogger and Printer are both provided, WithLogger takes// precedence.if app.logConstructor != nil { // If we failed to build the provided logger, flush the buffer// to the fallback logger instead.if err := app.constructCustomLogger(bufferLogger); err != nil {app.err = multierr.Append(app.err, err)app.log = fallbackLoggerbufferLogger.Connect(fallbackLogger)return app}} ?// This error might have come from the provide loop above. We've// already flushed to the custom logger, so we can return.if app.err != nil { return app} ?if err := app.executeInvokes(); err != nil { //執行調用app.err = err ?if dig.CanVisualizeError(err) {//如果錯誤可以可視化,就走下面邏輯打印var b bytes.Bufferdig.Visualize(app.container, &b, dig.VisualizeError(err))err = errorWithGraph{graph: b.String(),err: err,}}errorHandlerList(app.errorHooks).HandleError(err)} ?return app }

下面將依次剖析這些方法

Option

new 函數傳進來的Option結構,必須要實現對app 初始化的方法apply(*App),要實現打印接口fmt.Stringer方法,現在做框架傳配置幾乎都采用這種套路了, 優雅的傳配置。

// An Option configures an App using the functional options paradigm // popularized by Rob Pike. If you're unfamiliar with this style, see // https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html. type Option interface {fmt.Stringer ?apply(*App) }

app.provide

func (app *App) provide(p provide) {if app.err != nil {return} ?constructor := p.Targetif _, ok := constructor.(Option); ok {app.err = fmt.Errorf("fx.Option should be passed to fx.New directly, "+"not to fx.Provide: fx.Provide received %v from:\n%+v",constructor, p.Stack)return} ?var info dig.ProvideInfoopts := []dig.ProvideOption{dig.FillProvideInfo(&info),}defer func() {var ev fxevent.Event ?switch {case p.IsSupply:ev = &fxevent.Supplied{TypeName: p.SupplyType.String(),Err: app.err,} ?default:outputNames := make([]string, len(info.Outputs))for i, o := range info.Outputs {outputNames[i] = o.String()} ?ev = &fxevent.Provided{ConstructorName: fxreflect.FuncName(constructor),OutputTypeNames: outputNames,Err: app.err,}} ?app.log.LogEvent(ev)}()//處理anotated類型,生成相應的選項optsif ann, ok := constructor.(Annotated); ok {switch {case len(ann.Group) > 0 && len(ann.Name) > 0:app.err = fmt.Errorf("fx.Annotated may specify only one of Name or Group: received %v from:\n%+v",ann, p.Stack)returncase len(ann.Name) > 0:opts = append(opts, dig.Name(ann.Name))case len(ann.Group) > 0:opts = append(opts, dig.Group(ann.Group))} ?if err := app.container.Provide(ann.Target, opts...); err != nil {app.err = fmt.Errorf("fx.Provide(%v) from:\n%+vFailed: %v", ann, p.Stack, err)}return} ?if reflect.TypeOf(constructor).Kind() == reflect.Func {ft := reflect.ValueOf(constructor).Type() ?for i := 0; i < ft.NumOut(); i++ {t := ft.Out(i) ?if t == reflect.TypeOf(Annotated{}) {app.err = fmt.Errorf("fx.Annotated should be passed to fx.Provide directly, "+"it should not be returned by the constructor: "+"fx.Provide received %v from:\n%+v",fxreflect.FuncName(constructor), p.Stack)return}}} ?if err := app.container.Provide(constructor, opts...); err != nil {app.err = fmt.Errorf("fx.Provide(%v) from:\n%+vFailed: %v", fxreflect.FuncName(constructor), p.Stack, err)} }

app.executeInvokes

該函數將會執行函數調用,fx.Inovke()添加invoke 函數調用

// Execute invokes in order supplied to New, returning the first error // encountered. func (app *App) executeInvokes() error {// TODO: consider taking a context to limit the time spent running invocations. ?for _, i := range app.invokes { //循環遍歷invokes函數if err := app.executeInvoke(i); err != nil { return err}} ?return nil }

app.executeInvoke

//執行調用 func (app *App) executeInvoke(i invoke) (err error) {fn := i.TargetfnName := fxreflect.FuncName(fn) //獲取調用的函數名//日志相關app.log.LogEvent(&fxevent.Invoking{FunctionName: fnName})defer func() { app.log.LogEvent(&fxevent.Invoked{FunctionName: fnName,Err: err,Trace: fmt.Sprintf("%+v", i.Stack), // format stack trace as multi-line})}()//對fn 進行校驗,如果還是Option類型,說明是錯誤了,報錯if _, ok := fn.(Option); ok {return fmt.Errorf("fx.Option should be passed to fx.New directly, "+"not to fx.Invoke: fx.Invoke received %v from:\n%+v",fn, i.Stack)} ?return app.container.Invoke(fn) //執行容器的調用方法Invoke }

dig.Container

container.Provide

該函數作用是將構造函數賦值給容器,在這之前還要做一系列檢查

// Provide teaches the container how to build values of one or more types and // expresses their dependencies. // // The first argument of Provide is a function that accepts zero or more // parameters and returns one or more results. The function may optionally // return an error to indicate that it failed to build the value. This // function will be treated as the constructor for all the types it returns. // This function will be called AT MOST ONCE when a type produced by it, or a // type that consumes this function's output, is requested via Invoke. If the // same types are requested multiple times, the previously produced value will // be reused. // // In addition to accepting constructors that accept dependencies as separate // arguments and produce results as separate return values, Provide also // accepts constructors that specify dependencies as dig.In structs and/or // specify results as dig.Out structs. func (c *Container) Provide(constructor interface{}, opts ...ProvideOption) error {ctype := reflect.TypeOf(constructor)if ctype == nil { //構造函數不能為nilreturn errors.New("can't provide an untyped nil")}if ctype.Kind() != reflect.Func { //構造函數必須是函數return errf("must provide constructor function, got %v (type %v)", constructor, ctype)} ?var options provideOptionsfor _, o := range opts {o.applyProvideOption(&options) //如果有選項就應用選項}if err := options.Validate(); err != nil {return err}//調用provide if err := c.provide(constructor, options); err != nil {return errProvide{Func: digreflect.InspectFunc(constructor),Reason: err,}}return nil }

provide

func (c *Container) provide(ctor interface{}, opts provideOptions) error {n, err := newNode(ctor,nodeOptions{ResultName: opts.Name,ResultGroup: opts.Group,},) //創建1個node節點if err != nil {return err}//驗證結果keys, err := c.findAndValidateResults(n)if err != nil {return err} ?ctype := reflect.TypeOf(ctor) //獲取構造函數的反射類型if len(keys) == 0 {return errf("%v must provide at least one non-error type", ctype)} ?for k := range keys {c.isVerifiedAcyclic = falseoldProviders := c.providers[k] c.providers[k] = append(c.providers[k], n) //給c.providers[k] 賦值,代表該key 哪些節點能夠提供 ?if c.deferAcyclicVerification {continue}//驗證是否循環依賴if err := verifyAcyclic(c, n, k); err != nil {c.providers[k] = oldProvidersreturn err}c.isVerifiedAcyclic = true}c.nodes = append(c.nodes, n) ?// Record introspection info for caller if Info option is specifiedif info := opts.Info; info != nil { //一些打印信息params := n.ParamList().DotParam()results := n.ResultList().DotResult() ?info.ID = (ID)(n.id)info.Inputs = make([]*Input, len(params))info.Outputs = make([]*Output, len(results)) ?for i, param := range params {info.Inputs[i] = &Input{t: param.Type,optional: param.Optional,name: param.Name,group: param.Group,}} ?for i, res := range results {info.Outputs[i] = &Output{t: res.Type,name: res.Name,group: res.Group,}}}return nil }
  • 該步主要是生成node節點

newNode

func newNode(ctor interface{}, opts nodeOptions) (*node, error) {cval := reflect.ValueOf(ctor) //獲取構造函數的反射值ctype := cval.Type()//獲取構造函數的反射類型,獲取構造函數的指針cptr := cval.Pointer() ?params, err := newParamList(ctype)//獲取參數列表if err != nil {return nil, err} ?results, err := newResultList(//獲取返回列表ctype,resultOptions{Name: opts.ResultName,Group: opts.ResultGroup,},)if err != nil {return nil, err} ?return &node{ctor: ctor,//構造函數ctype: ctype, //構造函數類型location: digreflect.InspectFunc(ctor),id: dot.CtorID(cptr), //用指針地址作為節點的idparamList: params,//構造函數的參數resultList: results,//構造函數的結果}, err }

newParamList

// newParamList builds a paramList from the provided constructor type. // // Variadic arguments of a constructor are ignored and not included as // dependencies. func newParamList(ctype reflect.Type) (paramList, error) {numArgs := ctype.NumIn() //獲取invoke 函數的參數if ctype.IsVariadic() { //如果函數是可選參數,我們跳過最后一個參數,從這里可以知道,invoke 函數后面寫可選參數,是可以的// NOTE: If the function is variadic, we skip the last argument// because we're not filling variadic arguments yet. See #120.numArgs--} ?pl := paramList{ ctype: ctype,Params: make([]param, 0, numArgs),} ?for i := 0; i < numArgs; i++ {p, err := newParam(ctype.In(i)) //獲取函數的參數列表if err != nil {return pl, errf("bad argument %d", i+1, err)}pl.Params = append(pl.Params, p) //添加封裝后的參數} ?return pl, nil }

newParam

// newParam builds a param from the given type. If the provided type is a // dig.In struct, an paramObject will be returned. func newParam(t reflect.Type) (param, error) {switch {//參數如果是out 類型則報錯case IsOut(t) || (t.Kind() == reflect.Ptr && IsOut(t.Elem())) || embedsType(t, _outPtrType):return nil, errf("cannot depend on result objects", "%v embeds a dig.Out", t)case IsIn(t)://如果是fx.In 類型,創建newParamObject類型return newParamObject(t)case embedsType(t, _inPtrType):return nil, errf("cannot build a parameter object by embedding *dig.In, embed dig.In instead","%v embeds *dig.In", t)case t.Kind() == reflect.Ptr && IsIn(t.Elem()):return nil, errf("cannot depend on a pointer to a parameter object, use a value instead","%v is a pointer to a struct that embeds dig.In", t)default://創建paramSingle類型return paramSingle{Type: t}, nil} }

newResultList

func newResultList(ctype reflect.Type, opts resultOptions) (resultList, error) {rl := resultList{ctype: ctype,Results: make([]result, 0, ctype.NumOut()),resultIndexes: make([]int, ctype.NumOut()),} ?resultIdx := 0for i := 0; i < ctype.NumOut(); i++ { //循環遍歷構造函數的輸出參數t := ctype.Out(i)//獲取參數if isError(t) {//如果是錯誤類型,將這行結果索引賦值為-1rl.resultIndexes[i] = -1continue} ?r, err := newResult(t, opts)if err != nil {return rl, errf("bad result %d", i+1, err)} ?rl.Results = append(rl.Results, r)rl.resultIndexes[i] = resultIdx //添加結果類型,注意這里沒有用i,說明是有效的返回類型才會添加resultIdx++} ?return rl, nil }

newResult

// newResult builds a result from the given type. func newResult(t reflect.Type, opts resultOptions) (result, error) {switch {//如果該類型內嵌fx.IN,那么就報錯case IsIn(t) || (t.Kind() == reflect.Ptr && IsIn(t.Elem())) || embedsType(t, _inPtrType):return nil, errf("cannot provide parameter objects", "%v embeds a dig.In", t)//是錯誤也返回,不能返回錯誤類型在構造函數里面case isError(t):return nil, errf("cannot return an error here, return it from the constructor instead")//結構體如果內嵌fx.Out,返回ResultObject類型case IsOut(t):return newResultObject(t, opts)//結果類型內嵌必須是dig.Out而不是*dig.Outcase embedsType(t, _outPtrType):return nil, errf("cannot build a result object by embedding *dig.Out, embed dig.Out instead","%v embeds *dig.Out", t)//結果對象不能是指針case t.Kind() == reflect.Ptr && IsOut(t.Elem()):return nil, errf("cannot return a pointer to a result object, use a value instead","%v is a pointer to a struct that embeds dig.Out", t)case len(opts.Group) > 0: //如果構造函數是group類型,則創建resultGrouped類型g, err := parseGroupString(opts.Group)if err != nil {return nil, errf("cannot parse group %q", opts.Group, err)}rg := resultGrouped{Type: t, Group: g.Name, Flatten: g.Flatten}if g.Flatten { //如果group 后面有g.Flatten,那么這個構造函數返回值必須是切片類型if t.Kind() != reflect.Slice {return nil, errf("flatten can be applied to slices only","%v is not a slice", t)}rg.Type = rg.Type.Elem()}return rg, nildefault://返回單個參數類型return resultSingle{Type: t, Name: opts.Name}, nil} }
  • 根據構造函數返回的每個參數類型和選項創建一個result對象
  • 可見內嵌fx.Out 返回必須是個對象

findAndValidateResults

// Builds a collection of all result types produced by this node. func (c *Container) findAndValidateResults(n *node) (map[key]struct{}, error) {var err errorkeyPaths := make(map[key]string)walkResult(n.ResultList(), connectionVisitor{c: c,n: n,err: &err,keyPaths: keyPaths,}) ?if err != nil {return nil, err} ?keys := make(map[key]struct{}, len(keyPaths))for k := range keyPaths {keys[k] = struct{}{}}return keys, nil }

walkResult

// walkResult walks the result tree for the given result with the provided // visitor. // // resultVisitor.Visit will be called on the provided result and if a non-nil // resultVisitor is received, it will be used to walk its descendants. If a // resultObject or resultList was visited, AnnotateWithField and // AnnotateWithPosition respectively will be called before visiting the // descendants of that resultObject/resultList. // // This is very similar to how go/ast.Walk works. func walkResult(r result, v resultVisitor) {v = v.Visit(r)if v == nil {return} ?switch res := r.(type) {case resultSingle, resultGrouped:// No sub-resultscase resultObject:w := vfor _, f := range res.Fields {if v := w.AnnotateWithField(f); v != nil {walkResult(f.Result, v)//遞歸調用walkResult,傳入參數為返回結構體的字段}}case resultList:w := vfor i, r := range res.Results {if v := w.AnnotateWithPosition(i); v != nil {walkResult(r, v)//遞歸調用walkResult,傳入參數為切片的每個值}}default:panic(fmt.Sprintf("It looks like you have found a bug in dig. "+"Please file an issue at https://github.com/uber-go/dig/issues/ "+"and provide the following message: "+"received unknown result type %T", res))} } ?

connectionVisitor.Visit

func (cv connectionVisitor) Visit(res result) resultVisitor {// Already failed. Stop looking.if *cv.err != nil {return nil} ?path := strings.Join(cv.currentResultPath, ".") ?switch r := res.(type) {case resultSingle:k := key{name: r.Name, t: r.Type}//如果k 存在,并且返回值類型是resultSingle類型,說明該提供依賴以及存在了,根name和group 稍微有區別if conflict, ok := cv.keyPaths[k]; ok {*cv.err = errf("cannot provide %v from %v", k, path,"already provided by %v", conflict,)return nil} ?if ps := cv.c.providers[k]; len(ps) > 0 {cons := make([]string, len(ps))for i, p := range ps {cons[i] = fmt.Sprint(p.Location())} ?*cv.err = errf("cannot provide %v from %v", k, path,"already provided by %v", strings.Join(cons, "; "),)return nil} ?cv.keyPaths[k] = path ?case resultGrouped:// we don't really care about the path for this since conflicts are// okay for group results. We'll track it for the sake of having a// value there.//group 類型直接賦值就行了,代表該類型提供了值k := key{group: r.Group, t: r.Type}cv.keyPaths[k] = path} ?return cv }

container.Invoke

Invoke會在初始化依賴后調用,這個函數的任何參數都會被認為是它的依賴,這個依賴被初始化沒有順序,invoke 調用可能會有錯誤,這個錯誤將會被返回

// Invoke runs the given function after instantiating its dependencies. // // Any arguments that the function has are treated as its dependencies. The // dependencies are instantiated in an unspecified order along with any // dependencies that they might have. // // The function may return an error to indicate failure. The error will be // returned to the caller as-is. func (c *Container) Invoke(function interface{}, opts ...InvokeOption) error {ftype := reflect.TypeOf(function) //獲取函數類型if ftype == nil { //判斷是不是nilreturn errors.New("can't invoke an untyped nil")}if ftype.Kind() != reflect.Func { //判斷是不是函數return errf("can't invoke non-function %v (type %v)", function, ftype)} ?pl, err := newParamList(ftype)//獲取函數參數列表if err != nil {return err} ?if err := shallowCheckDependencies(c, pl); err != nil { //檢查依賴return errMissingDependencies{Func: digreflect.InspectFunc(function),Reason: err,}} ?if !c.isVerifiedAcyclic {//沒有驗證循環,驗證循環if err := c.verifyAcyclic(); err != nil {return err}} ?args, err := pl.BuildList(c)//將參數賦值,返回賦值后的參數if err != nil {return errArgumentsFailed{Func: digreflect.InspectFunc(function),Reason: err,}}returned := c.invokerFn(reflect.ValueOf(function), args)//調用函數結果if len(returned) == 0 {return nil}if last := returned[len(returned)-1]; isError(last.Type()) {//如果最后一個結果是錯誤,會將此錯誤進行返回if err, _ := last.Interface().(error); err != nil {return err}} ?return nil }

shallowCheckDependencies

檢查依賴是否缺少,比如func( a A),如果A 這種類型的對象在container 里面找不到,也就是說構造函數沒有提供,那么在這里將會報錯

? // Checks that all direct dependencies of the provided param are present in // the container. Returns an error if not. func shallowCheckDependencies(c containerStore, p param) error {var err errMissingTypesvar addMissingNodes []*dot.ParamwalkParam(p, paramVisitorFunc(func(p param) bool {ps, ok := p.(paramSingle)if !ok {return true} ?if ns := c.getValueProviders(ps.Name, ps.Type); len(ns) == 0 && !ps.Optional {err = append(err, newErrMissingTypes(c, key{name: ps.Name, t: ps.Type})...)addMissingNodes = append(addMissingNodes, ps.DotParam()...)} ?return true})) ?if len(err) > 0 {return err}return nil }

verifyAcyclic

if !c.isVerifiedAcyclic {if err := c.verifyAcyclic(); err != nil {return err} }

校驗循環,如果沒有校驗過循環,就校驗循環

func (c *Container) verifyAcyclic() error {visited := make(map[key]struct{})for _, n := range c.nodes {if err := detectCycles(n, c, nil /* path */, visited); err != nil {return errf("cycle detected in dependency graph", err)}} ?c.isVerifiedAcyclic = truereturn nil }
  • 檢驗循環的原理是遞歸遍歷該參數的提供者,如果該提供者出現過說明出現了循環,例如a ->b->c ->d->a ,d 的提供者是a ,但a 已經出現過了,所以出現了循環

pl.BuildList

該函數通過容器,查找到invoke 函數需要的參數值,然后通過下面的invokerFn進行調用。該函數返回有序的結果列表

// BuildList returns an ordered list of values which may be passed directly // to the underlying constructor. func (pl paramList) BuildList(c containerStore) ([]reflect.Value, error) {args := make([]reflect.Value, len(pl.Params))for i, p := range pl.Params {var err errorargs[i], err = p.Build(c)if err != nil {return nil, err}}return args, nil }

對象不用的參數p,Build 表現不也一樣,這里以paramSingle為例

func (ps paramSingle) Build(c containerStore) (reflect.Value, error) {if v, ok := c.getValue(ps.Name, ps.Type); ok { //從容器里面查找該名字和類型的參數,如果查到了就返回return v, nil}//如果上面一步沒有直接獲取到,那么就查找能提供這個key 的節點,ps.Name, ps.Type組合成的結構體為keyproviders := c.getValueProviders(ps.Name, ps.Type)if len(providers) == 0 { //如果提供的節點找不到,如果參數是可選的,那么直接返回零值if ps.Optional {return reflect.Zero(ps.Type), nil}//如果沒找到說明沒有這個類型直接返回return _noValue, newErrMissingTypes(c, key{name: ps.Name, t: ps.Type})} ?for _, n := range providers {err := n.Call(c)if err == nil {continue} ?// If we're missing dependencies but the parameter itself is optional,// we can just move on.if _, ok := err.(errMissingDependencies); ok && ps.Optional {return reflect.Zero(ps.Type), nil} ?return _noValue, errParamSingleFailed{CtorID: n.ID(),Key: key{t: ps.Type, name: ps.Name},Reason: err,}} ?// If we get here, it's impossible for the value to be absent from the// container.v, _ := c.getValue(ps.Name, ps.Type) //再嘗試找,如果查找到這里,那么一定是有值得return v, nil }

Call

call 調用節點的構造函數,獲得結果,然后存儲在該節點里面,這個過程可能會出現遞歸,比如a 依賴b,b 的參數依賴c,就會調用BuildList,一層一層往上找,找不到返回錯誤,找到了,最后調用a 的構造函數創建結果

// Call calls this node's constructor if it hasn't already been called and // injects any values produced by it into the provided container. func (n *node) Call(c containerStore) error {if n.called { //這里用來標識該節點是否被call 過return nil} ?if err := shallowCheckDependencies(c, n.paramList); err != nil {return errMissingDependencies{Func: n.location,Reason: err,}} ?args, err := n.paramList.BuildList(c) //一個遞歸過程,將該節點的參數進行BuildList,獲取該節點的參數if err != nil {return errArgumentsFailed{Func: n.location,Reason: err,}} ?receiver := newStagingContainerWriter()//然后調用該節點的構造函數,將剛剛獲取的參數傳進去進行調用,獲取調用后的resultsresults := c.invoker()(reflect.ValueOf(n.ctor), args)if err := n.resultList.ExtractList(receiver, results); err != nil {return errConstructorFailed{Func: n.location, Reason: err}}receiver.Commit(c)//將結果放入containern.called = true ?return nil }

ExtractList

ExtractList 將構造函數獲取的結果賦值到節點的Results

func (rl resultList) ExtractList(cw containerWriter, values []reflect.Value) error {for i, v := range values { //循環遍歷結果值if resultIdx := rl.resultIndexes[i]; resultIdx >= 0 {rl.Results[resultIdx].Extract(cw, v) //將結果值賦值到containerWriter里面去continue}//調用結構包含err,直接返回if err, _ := v.Interface().(error); err != nil {return err}} ?return nil }

Extract就是給containerWriter賦值,然后最后調用 receiver.Commit(c)將值復制到容器里面去

func (rs resultSingle) Extract(cw containerWriter, v reflect.Value) {cw.setValue(rs.Name, rs.Type, v) }

invokerFn

默認的調用,就是通過反射獲取invoke 函數的

// invokerFn specifies how the container calls user-supplied functions. type invokerFn func(fn reflect.Value, args []reflect.Value) (results []reflect.Value) ? func defaultInvoker(fn reflect.Value, args []reflect.Value) []reflect.Value {return fn.Call(args) }

項目實踐

下面我們將通過搭建一個http 服務器在項目中實踐來練習fx 的使用,項目目錄結構

server/main.go

package main ? import ("server/pkg/config""server/pkg/log""server/server" ) ? func main() {srv:=server.NewServer() //創建一個服務器srv.Provide(log.GetLogger, //依賴注入Loggerconfig.NewConfig,//依賴注入配置文件)srv.Run()//運行服務 } ? ?

server/pkg/router/router.go

package router ? import "gopkg.in/macaron.v1" ? func Register(router * macaron.Router) {router.Get("/hello", func(ctx *macaron.Context) {ctx.Write([]byte("hello"))}) }

server/http_server.go

package server ? import ("fmt""go.uber.org/zap""gopkg.in/macaron.v1""net/http""server/pkg/config" ) ? type HttpServer struct {cfg * config.Configlogger *zap.Loggermar * macaron.Macaron } ? func NewHttpServer(cfg * config.Config,logger *zap.Logger)*HttpServer {return &HttpServer{cfg: cfg,logger: logger.Named("http_server"),mar:macaron.Classic() ,} } func (srv* HttpServer)Run()error {router.Register(srv.mar.Router)addr:=fmt.Sprintf("0.0.0.0:%v",srv.cfg.HttpConfig.Port)srv.logger.Info("http run ",zap.String("addr",addr))return http.ListenAndServe(addr, srv.mar) }

server/server.go

package server ? import ("go.uber.org/fx""golang.org/x/sync/errgroup" ) ? type Server struct {group errgroup.Group //errgroup,參考我的文章,專門講這個原理app *fx.App //fx 實例provides []interface{}invokes []interface{}supplys []interface{}httSrv *HttpServer //該http server 可以換成fibber gin 之類的 } ? func NewServer()*Server {return &Server{ ?} } func(srv*Server) Run() {srv.app=fx.New(fx.Provide(srv.provides...),fx.Invoke(srv.invokes...),fx.Supply(srv.supplys...),fx.Provide(NewHttpServer),//注入http serverfx.Supply(srv),fx.Populate(&srv.httSrv), //給srv 實例賦值fx.NopLogger,//禁用fx 默認logger)srv.group.Go(srv.httSrv.Run) //啟動http 服務器err:=srv.group.Wait() //等待子協程退出if err!=nil{panic(err)} } func(srv*Server)Provide(ctr ...interface{}){srv.provides= append(srv.provides, ctr...) } func(srv*Server)Invoke(invokes ...interface{}){srv.invokes=append(srv.invokes,invokes...) } func(srv*Server)Supply(objs ...interface{}){srv.supplys=append(srv.supplys,objs...) }

server/pkg/config/config.go

package config ? import ("gopkg.in/yaml.v2""io/ioutil" ) ? type Config struct {HttpConfig struct{Port int `yaml:"port"`} `yaml:"http"`LogConfig struct{Output string`yaml:"output"`} `yaml:"log"` } ? func NewConfig()*Config {data,err:=ioutil.ReadFile("./config.yaml")if err!=nil{panic(err)}c:=&Config{}err=yaml.Unmarshal(data,c)if err!=nil{panic(err)}return c }

server/pkg/log/log.go

package log ? import ("github.com/natefinch/lumberjack""go.uber.org/zap""go.uber.org/zap/zapcore""os""server/pkg/config" ) ? func GetLogger(cfg *config.Config)*zap.Logger {writeSyncer := getLogWriter()encoder := getEncoder()switch cfg.LogConfig.Output {case "all":writeSyncer=zapcore.NewMultiWriteSyncer(os.Stdout,writeSyncer) //暫時不啟用文件case "file":default:writeSyncer=zapcore.NewMultiWriteSyncer(os.Stdout) //暫時不啟用文件} ?core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)logger := zap.New(core, zap.AddCaller())return logger } ? func getEncoder() zapcore.Encoder {encoderConfig := zap.NewProductionEncoderConfig()encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoderencoderConfig.EncodeLevel = zapcore.CapitalLevelEncoderreturn zapcore.NewConsoleEncoder(encoderConfig) } ? func getLogWriter() zapcore.WriteSyncer {lumberJackLogger := &lumberjack.Logger{Filename: "./data/server.log",MaxSize: 1,MaxBackups: 5,MaxAge: 30,Compress: false,}return zapcore.AddSync(lumberJackLogger) }

server/config.yaml

http:port: 9999 log:#console:終端,file:文件,all:所有output: "console"

啟動服務器:

go run main.go 01T19:51:55.169+0800 INFO http_server server/http_server.go:28 http run {"addr": "0.0.0.0:9999"}

瀏覽器輸入http://127.0.0.1:9999/hello,可以看見打印hello

總結

以上是生活随笔為你收集整理的深入解析go依赖注入库go.uber.org/fx的全部內容,希望文章能夠幫你解決所遇到的問題。

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

图片小说视频一区二区 | 99久久亚洲精品无码毛片 | 久久综合给久久狠狠97色 | 好爽又高潮了毛片免费下载 | 亚洲春色在线视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久精品人妻少妇一区二区三区 | 亚洲一区av无码专区在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 国产成人无码av片在线观看不卡 | 久久综合给合久久狠狠狠97色 | 久久久精品成人免费观看 | 色五月丁香五月综合五月 | 亚洲国产av美女网站 | 国语自产偷拍精品视频偷 | 国产午夜精品一区二区三区嫩草 | 无码帝国www无码专区色综合 | 女人高潮内射99精品 | 亚洲综合色区中文字幕 | 成人试看120秒体验区 | 亚洲 激情 小说 另类 欧美 | 白嫩日本少妇做爰 | 无码人妻精品一区二区三区不卡 | 无码纯肉视频在线观看 | 少妇愉情理伦片bd | 欧美丰满老熟妇xxxxx性 | 性做久久久久久久免费看 | 国产亚洲日韩欧美另类第八页 | 精品久久久中文字幕人妻 | 日本丰满熟妇videos | 国产综合久久久久鬼色 | 中文字幕无码乱人伦 | 激情国产av做激情国产爱 | 精品无码国产自产拍在线观看蜜 | 日欧一片内射va在线影院 | 亚洲精品www久久久 | 国产精品多人p群无码 | 亚洲无人区午夜福利码高清完整版 | 特黄特色大片免费播放器图片 | 西西人体www44rt大胆高清 | 亚洲欧美日韩国产精品一区二区 | 欧美人与牲动交xxxx | 亚洲精品国产第一综合99久久 | 国产av一区二区精品久久凹凸 | 国产卡一卡二卡三 | a国产一区二区免费入口 | 自拍偷自拍亚洲精品被多人伦好爽 | 免费无码的av片在线观看 | 男人和女人高潮免费网站 | 99久久人妻精品免费二区 | 中文无码精品a∨在线观看不卡 | 亚洲精品一区三区三区在线观看 | 亲嘴扒胸摸屁股激烈网站 | 在线播放无码字幕亚洲 | 亚洲日本一区二区三区在线 | 福利一区二区三区视频在线观看 | 久久久久99精品国产片 | 亚洲精品国产精品乱码不卡 | 日本在线高清不卡免费播放 | 天天av天天av天天透 | 成人三级无码视频在线观看 | 色窝窝无码一区二区三区色欲 | 亚洲精品久久久久久久久久久 | 又色又爽又黄的美女裸体网站 | 麻豆成人精品国产免费 | 天天摸天天透天天添 | 高潮喷水的毛片 | 久久久久免费精品国产 | 午夜福利试看120秒体验区 | 精品国产福利一区二区 | 色情久久久av熟女人妻网站 | 中文字幕无码视频专区 | 少妇高潮一区二区三区99 | 亚洲色欲久久久综合网东京热 | 亚洲国产综合无码一区 | 性欧美牲交在线视频 | 免费乱码人妻系列无码专区 | 精品国产国产综合精品 | 久久久精品成人免费观看 | 亚洲人交乣女bbw | 亚洲国产欧美日韩精品一区二区三区 | 天天躁日日躁狠狠躁免费麻豆 | 水蜜桃亚洲一二三四在线 | 纯爱无遮挡h肉动漫在线播放 | 欧美日韩一区二区综合 | 无码人妻精品一区二区三区下载 | 青青久在线视频免费观看 | 欧美阿v高清资源不卡在线播放 | 免费人成在线观看网站 | 国产无遮挡又黄又爽免费视频 | 一本色道久久综合狠狠躁 | 人人妻在人人 | 久久精品99久久香蕉国产色戒 | 性色av无码免费一区二区三区 | 熟妇人妻无码xxx视频 | 小sao货水好多真紧h无码视频 | 亚洲欧洲中文日韩av乱码 | 日本一卡二卡不卡视频查询 | 欧美freesex黑人又粗又大 | 丰满少妇人妻久久久久久 | 亚洲 欧美 激情 小说 另类 | 人人爽人人澡人人人妻 | 丰满少妇弄高潮了www | 麻豆蜜桃av蜜臀av色欲av | 蜜臀av无码人妻精品 | 一本大道伊人av久久综合 | 久久久久久久久蜜桃 | 伊人久久大香线焦av综合影院 | 99国产欧美久久久精品 | 性生交片免费无码看人 | 国产97色在线 | 免 | 午夜性刺激在线视频免费 | 正在播放老肥熟妇露脸 | 97色伦图片97综合影院 | 野狼第一精品社区 | 初尝人妻少妇中文字幕 | 无码av岛国片在线播放 | 亚洲另类伦春色综合小说 | 午夜福利试看120秒体验区 | 日本精品高清一区二区 | 亚洲人成无码网www | 鲁鲁鲁爽爽爽在线视频观看 | 丰满人妻被黑人猛烈进入 | 夜夜夜高潮夜夜爽夜夜爰爰 | 成人精品视频一区二区三区尤物 | 亚洲自偷自偷在线制服 | 亚洲熟熟妇xxxx | 正在播放老肥熟妇露脸 | 红桃av一区二区三区在线无码av | 99国产精品白浆在线观看免费 | 牲交欧美兽交欧美 | 国产精品美女久久久久av爽李琼 | 国产精品无码mv在线观看 | 性做久久久久久久免费看 | 欧美激情综合亚洲一二区 | 亚洲精品久久久久avwww潮水 | 日产国产精品亚洲系列 | 国产亚洲精品久久久久久 | 欧美国产日韩久久mv | 国产无av码在线观看 | 高清不卡一区二区三区 | 欧美午夜特黄aaaaaa片 | 国产后入清纯学生妹 | 人妻少妇被猛烈进入中文字幕 | 国产精品沙发午睡系列 | 久久99久久99精品中文字幕 | 亚洲 欧美 激情 小说 另类 | 中文字幕无码热在线视频 | 99久久人妻精品免费二区 | 亚洲综合在线一区二区三区 | 巨爆乳无码视频在线观看 | 动漫av网站免费观看 | 九月婷婷人人澡人人添人人爽 | 99er热精品视频 | 性生交大片免费看l | 3d动漫精品啪啪一区二区中 | 国产欧美亚洲精品a | 又黄又爽又色的视频 | 亚洲国产午夜精品理论片 | 国产精品18久久久久久麻辣 | 国产精品视频免费播放 | 亚洲精品久久久久久久久久久 | 国产人妻人伦精品1国产丝袜 | 大地资源网第二页免费观看 | 成人性做爰aaa片免费看 | 国产特级毛片aaaaaa高潮流水 | 九九久久精品国产免费看小说 | 国产午夜无码视频在线观看 | 免费乱码人妻系列无码专区 | 亚洲色欲久久久综合网东京热 | 日韩在线不卡免费视频一区 | 亚洲精品久久久久中文第一幕 | 亚洲の无码国产の无码步美 | 内射白嫩少妇超碰 | 极品嫩模高潮叫床 | 精品国产一区二区三区四区在线看 | 97夜夜澡人人爽人人喊中国片 | 精品国产青草久久久久福利 | 色婷婷香蕉在线一区二区 | 久久久成人毛片无码 | 无码人妻久久一区二区三区不卡 | 国产肉丝袜在线观看 | 日日摸夜夜摸狠狠摸婷婷 | 久久久久久av无码免费看大片 | 国产精品手机免费 | 人妻少妇被猛烈进入中文字幕 | 无码午夜成人1000部免费视频 | 免费观看黄网站 | 久久久久久久女国产乱让韩 | 国产人妻精品午夜福利免费 | 麻豆蜜桃av蜜臀av色欲av | 久久亚洲中文字幕精品一区 | √天堂资源地址中文在线 | 俺去俺来也在线www色官网 | 无码av岛国片在线播放 | 国产成人无码区免费内射一片色欲 | 1000部夫妻午夜免费 | 国产精品久久久久久亚洲毛片 | 日韩欧美成人免费观看 | 无码人妻精品一区二区三区下载 | 亚洲色在线无码国产精品不卡 | 2020最新国产自产精品 | 人妻体内射精一区二区三四 | 伊人色综合久久天天小片 | 精品无人区无码乱码毛片国产 | 亚洲人成无码网www | 麻豆av传媒蜜桃天美传媒 | 玩弄人妻少妇500系列视频 | www国产亚洲精品久久网站 | 欧美精品一区二区精品久久 | 国产精华av午夜在线观看 | 国产深夜福利视频在线 | 久久精品国产精品国产精品污 | 一本无码人妻在中文字幕免费 | 精品成在人线av无码免费看 | 精品久久久久久人妻无码中文字幕 | 亚洲日韩av片在线观看 | 亚洲欧美国产精品久久 | 久久精品国产精品国产精品污 | 午夜福利一区二区三区在线观看 | 人人妻人人澡人人爽精品欧美 | 日本高清一区免费中文视频 | 野狼第一精品社区 | 中国女人内谢69xxxx | a片免费视频在线观看 | 欧美人与牲动交xxxx | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲欧美精品aaaaaa片 | 内射老妇bbwx0c0ck | 国产人妻精品午夜福利免费 | 亚洲中文字幕在线无码一区二区 | 精品欧美一区二区三区久久久 | 久久久国产精品无码免费专区 | 中文字幕无码免费久久99 | 兔费看少妇性l交大片免费 | 免费无码一区二区三区蜜桃大 | 夜夜夜高潮夜夜爽夜夜爰爰 | 香港三级日本三级妇三级 | 国产色精品久久人妻 | 蜜桃视频插满18在线观看 | 久久久久成人片免费观看蜜芽 | 日本一区二区三区免费播放 | 欧美zoozzooz性欧美 | 亚洲欧洲日本综合aⅴ在线 | 欧美国产日韩久久mv | 国产午夜亚洲精品不卡下载 | 欧洲精品码一区二区三区免费看 | 伊在人天堂亚洲香蕉精品区 | a国产一区二区免费入口 | 国产精品怡红院永久免费 | 亚洲人亚洲人成电影网站色 | 强伦人妻一区二区三区视频18 | 久久久久久国产精品无码下载 | 波多野结衣一区二区三区av免费 | 全黄性性激高免费视频 | 国产av无码专区亚洲awww | 亚洲理论电影在线观看 | 久久zyz资源站无码中文动漫 | 成人亚洲精品久久久久软件 | 国产一区二区三区四区五区加勒比 | 日日碰狠狠躁久久躁蜜桃 | 无码成人精品区在线观看 | 久久精品国产精品国产精品污 | 无码一区二区三区在线 | 亚洲成av人综合在线观看 | 人人妻人人澡人人爽人人精品 | 欧美成人家庭影院 | 风流少妇按摩来高潮 | 亚洲人亚洲人成电影网站色 | 少妇无码av无码专区在线观看 | 国产精品久久久av久久久 | 成人精品视频一区二区 | 亚洲成a人片在线观看无码3d | 鲁大师影院在线观看 | 乱码av麻豆丝袜熟女系列 | 久久精品国产日本波多野结衣 | 国产 浪潮av性色四虎 | 77777熟女视频在线观看 а天堂中文在线官网 | 性欧美videos高清精品 | 久久国产精品精品国产色婷婷 | 国产亚洲视频中文字幕97精品 | 任你躁国产自任一区二区三区 | 欧洲vodafone精品性 | 在线播放无码字幕亚洲 | 国产乱人伦av在线无码 | 中文毛片无遮挡高清免费 | 性生交大片免费看l | 狠狠亚洲超碰狼人久久 | 人妻天天爽夜夜爽一区二区 | 麻豆国产97在线 | 欧洲 | 强开小婷嫩苞又嫩又紧视频 | 久久久久成人精品免费播放动漫 | 亚洲日韩av片在线观看 | 精品无人区无码乱码毛片国产 | 国产成人无码av一区二区 | 国产精品久久久久久久9999 | 狠狠综合久久久久综合网 | 天天av天天av天天透 | 玩弄中年熟妇正在播放 | 狠狠色噜噜狠狠狠狠7777米奇 | 内射欧美老妇wbb | 精品无码av一区二区三区 | 国产乱码精品一品二品 | 精品熟女少妇av免费观看 | 国精品人妻无码一区二区三区蜜柚 | 亚洲人成人无码网www国产 | 亚洲成av人综合在线观看 | 亚洲色偷偷偷综合网 | 亚洲成a人片在线观看无码 | 荫蒂被男人添的好舒服爽免费视频 | 天天综合网天天综合色 | 久久成人a毛片免费观看网站 | 久久久久99精品成人片 | 中文字幕无码免费久久99 | 国产精品毛多多水多 | 午夜男女很黄的视频 | 天天摸天天透天天添 | 久久久久av无码免费网 | 国产人妻久久精品二区三区老狼 | 欧美阿v高清资源不卡在线播放 | 国产成人无码一二三区视频 | 牲欲强的熟妇农村老妇女视频 | 国产在热线精品视频 | 丰满少妇弄高潮了www | 99久久精品无码一区二区毛片 | 国产人妻久久精品二区三区老狼 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产熟女一区二区三区四区五区 | 日本一区二区三区免费播放 | 国产另类ts人妖一区二区 | 国产一精品一av一免费 | 最近中文2019字幕第二页 | 内射后入在线观看一区 | 成人欧美一区二区三区 | 成人无码视频在线观看网站 | 久久久精品国产sm最大网站 | 免费国产黄网站在线观看 | 亚洲色在线无码国产精品不卡 | 亚洲国产一区二区三区在线观看 | 亚洲a无码综合a国产av中文 | 婷婷六月久久综合丁香 | 蜜桃视频插满18在线观看 | 色婷婷综合激情综在线播放 | 伊人久久大香线蕉午夜 | 无码纯肉视频在线观看 | 永久免费观看美女裸体的网站 | 亚洲 激情 小说 另类 欧美 | 欧美丰满少妇xxxx性 | 国产美女精品一区二区三区 | 欧美成人免费全部网站 | 国产精品无码永久免费888 | 中文字幕av无码一区二区三区电影 | 熟女体下毛毛黑森林 | 亚洲经典千人经典日产 | 最近免费中文字幕中文高清百度 | 久久精品国产一区二区三区肥胖 | 无码人妻精品一区二区三区下载 | 人妻aⅴ无码一区二区三区 | 女人被爽到呻吟gif动态图视看 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产精品理论片在线观看 | 色综合视频一区二区三区 | 亚洲码国产精品高潮在线 | 欧美日韩在线亚洲综合国产人 | 久久99久久99精品中文字幕 | 日本xxxx色视频在线观看免费 | 国产精品久久久久无码av色戒 | 亚洲男人av天堂午夜在 | 激情国产av做激情国产爱 | 免费播放一区二区三区 | 国产亚洲人成a在线v网站 | 波多野结衣aⅴ在线 | 亚洲aⅴ无码成人网站国产app | 国产成人精品三级麻豆 | 中文字幕无码视频专区 | 精品午夜福利在线观看 | 日产国产精品亚洲系列 | 天堂久久天堂av色综合 | 国产人妻大战黑人第1集 | 18禁黄网站男男禁片免费观看 | 国产人妻精品一区二区三区不卡 | 疯狂三人交性欧美 | 成人无码精品一区二区三区 | 欧美性生交活xxxxxdddd | 无码人妻少妇伦在线电影 | 88国产精品欧美一区二区三区 | 无码人中文字幕 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚无码乱人伦一区二区 | 波多野结衣一区二区三区av免费 | 欧美真人作爱免费视频 | 欧美一区二区三区视频在线观看 | 欧美日韩一区二区三区自拍 | 亚洲一区二区三区偷拍女厕 | 久久久精品456亚洲影院 | 欧洲欧美人成视频在线 | 亚洲人成影院在线无码按摩店 | 精品国产aⅴ无码一区二区 | 亚洲自偷自偷在线制服 | 国产欧美精品一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产人妻人伦精品1国产丝袜 | 亚洲综合久久一区二区 | 欧洲vodafone精品性 | 亚洲国产精品久久久天堂 | 亚洲精品国产品国语在线观看 | 精品国产成人一区二区三区 | 麻花豆传媒剧国产免费mv在线 | 中国大陆精品视频xxxx | 51国偷自产一区二区三区 | 无码人妻精品一区二区三区不卡 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲中文字幕无码一久久区 | 日韩无套无码精品 | 国产av剧情md精品麻豆 | 国产在线一区二区三区四区五区 | 亚洲aⅴ无码成人网站国产app | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 波多野结衣乳巨码无在线观看 | 亚洲第一网站男人都懂 | 成人无码视频免费播放 | 久久国产精品精品国产色婷婷 | 成人动漫在线观看 | 久久久久成人片免费观看蜜芽 | 好爽又高潮了毛片免费下载 | 蜜桃视频插满18在线观看 | 日本精品少妇一区二区三区 | 一本久久a久久精品亚洲 | 玩弄中年熟妇正在播放 | 精品夜夜澡人妻无码av蜜桃 | 欧美日韩色另类综合 | аⅴ资源天堂资源库在线 | 人人妻人人澡人人爽欧美一区 | 最新国产麻豆aⅴ精品无码 | 麻豆果冻传媒2021精品传媒一区下载 | 骚片av蜜桃精品一区 | 亚洲欧美日韩综合久久久 | 久久国语露脸国产精品电影 | a片免费视频在线观看 | 波多野结衣 黑人 | 一本色道久久综合亚洲精品不卡 | 红桃av一区二区三区在线无码av | 99久久婷婷国产综合精品青草免费 | 最新国产麻豆aⅴ精品无码 | 欧美人与物videos另类 | 亚洲成a人片在线观看无码 | 人妻有码中文字幕在线 | √天堂中文官网8在线 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 天天av天天av天天透 | 99riav国产精品视频 | 人人妻人人澡人人爽精品欧美 | 久久亚洲国产成人精品性色 | 国产精品无码永久免费888 | 免费观看又污又黄的网站 | 亚洲一区二区三区在线观看网站 | 国产xxx69麻豆国语对白 | 亚洲精品www久久久 | 成人免费视频视频在线观看 免费 | 中文字幕人妻无码一区二区三区 | 中文字幕亚洲情99在线 | 天天综合网天天综合色 | 色噜噜亚洲男人的天堂 | 国产在线精品一区二区高清不卡 | 一本久道高清无码视频 | 亚洲中文字幕在线无码一区二区 | 国产女主播喷水视频在线观看 | 国产精品福利视频导航 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲熟悉妇女xxx妇女av | av在线亚洲欧洲日产一区二区 | 亚洲男人av天堂午夜在 | 亚洲va欧美va天堂v国产综合 | 亚洲欧美色中文字幕在线 | 在线天堂新版最新版在线8 | 国产免费久久精品国产传媒 | 国产成人精品三级麻豆 | 精品少妇爆乳无码av无码专区 | 中文字幕人妻丝袜二区 | 永久免费观看国产裸体美女 | 国产激情精品一区二区三区 | 国产精品国产三级国产专播 | 日韩精品无码一区二区中文字幕 | 亚洲中文字幕在线无码一区二区 | 综合网日日天干夜夜久久 | 性史性农村dvd毛片 | 性史性农村dvd毛片 | 麻花豆传媒剧国产免费mv在线 | 亚洲精品一区二区三区大桥未久 | 波多野42部无码喷潮在线 | 国产一区二区不卡老阿姨 | 中文字幕色婷婷在线视频 | 国产成人无码a区在线观看视频app | 国产精品怡红院永久免费 | 婷婷综合久久中文字幕蜜桃三电影 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 无码一区二区三区在线观看 | 偷窥日本少妇撒尿chinese | 少妇人妻av毛片在线看 | 久久国产36精品色熟妇 | 免费视频欧美无人区码 | 蜜桃视频插满18在线观看 | 动漫av网站免费观看 | 又大又硬又黄的免费视频 | 兔费看少妇性l交大片免费 | 欧美怡红院免费全部视频 | 99久久精品无码一区二区毛片 | 天海翼激烈高潮到腰振不止 | 成人免费无码大片a毛片 | 亚洲va中文字幕无码久久不卡 | 日本护士xxxxhd少妇 | 一区二区三区高清视频一 | 亚洲色欲久久久综合网东京热 | 国产9 9在线 | 中文 | 亚洲欧美日韩成人高清在线一区 | 国产成人无码av片在线观看不卡 | 久久精品国产精品国产精品污 | 日韩精品成人一区二区三区 | 久久久精品人妻久久影视 | 极品尤物被啪到呻吟喷水 | 免费国产成人高清在线观看网站 | 人妻无码αv中文字幕久久琪琪布 | 久久视频在线观看精品 | 久久人人爽人人爽人人片av高清 | 成人性做爰aaa片免费看不忠 | 久久久久久久久蜜桃 | 久久国产劲爆∧v内射 | 成人免费视频在线观看 | 国产精品亚洲专区无码不卡 | 丰满人妻被黑人猛烈进入 | 欧美精品国产综合久久 | 给我免费的视频在线观看 | 激情国产av做激情国产爱 | 毛片内射-百度 | 狠狠噜狠狠狠狠丁香五月 | 性色av无码免费一区二区三区 | 成人精品天堂一区二区三区 | 亚洲春色在线视频 | 成人免费无码大片a毛片 | 国产莉萝无码av在线播放 | 亚洲の无码国产の无码影院 | 人妻少妇精品无码专区二区 | 丝袜足控一区二区三区 | 欧美freesex黑人又粗又大 | 亚洲天堂2017无码 | 欧美人与禽猛交狂配 | 十八禁视频网站在线观看 | 老头边吃奶边弄进去呻吟 | 久久国产精品萌白酱免费 | 欧美性生交活xxxxxdddd | 日本欧美一区二区三区乱码 | 国产超级va在线观看视频 | 天堂亚洲2017在线观看 | 日韩亚洲欧美中文高清在线 | 国产精品手机免费 | 熟女少妇在线视频播放 | 老太婆性杂交欧美肥老太 | 丰满少妇人妻久久久久久 | 久久精品国产一区二区三区肥胖 | 黑人玩弄人妻中文在线 | 亚洲狠狠婷婷综合久久 | 亚洲色欲色欲天天天www | 丰满护士巨好爽好大乳 | 男女下面进入的视频免费午夜 | 国产精品高潮呻吟av久久 | 无码福利日韩神码福利片 | 天天综合网天天综合色 | 午夜无码区在线观看 | 日本va欧美va欧美va精品 | 少妇无码吹潮 | 欧美freesex黑人又粗又大 | 天干天干啦夜天干天2017 | 成人试看120秒体验区 | √天堂中文官网8在线 | 中文字幕色婷婷在线视频 | 国产绳艺sm调教室论坛 | 乌克兰少妇xxxx做受 | 国产精品美女久久久 | 日韩精品无码一区二区中文字幕 | 亚洲日本va中文字幕 | 天堂无码人妻精品一区二区三区 | 亚洲爆乳大丰满无码专区 | 久久人人爽人人爽人人片av高清 | 丰满人妻一区二区三区免费视频 | 国产精品久久久久久亚洲影视内衣 | 女人被男人爽到呻吟的视频 | 内射后入在线观看一区 | 亚洲熟悉妇女xxx妇女av | aⅴ亚洲 日韩 色 图网站 播放 | 精品国产一区二区三区四区在线看 | 欧美人与禽zoz0性伦交 | 性欧美牲交xxxxx视频 | 免费看男女做好爽好硬视频 | 日韩精品一区二区av在线 | 特级做a爰片毛片免费69 | 久久久成人毛片无码 | 中文字幕av日韩精品一区二区 | 中文字幕 亚洲精品 第1页 | 初尝人妻少妇中文字幕 | 四十如虎的丰满熟妇啪啪 | 亚洲一区二区三区 | 男女超爽视频免费播放 | 亚洲男人av天堂午夜在 | 久久综合九色综合欧美狠狠 | 免费人成在线观看网站 | 日日干夜夜干 | 精品国产一区二区三区四区在线看 | 国产av一区二区精品久久凹凸 | 免费观看激色视频网站 | 99视频精品全部免费免费观看 | 大地资源中文第3页 | 丰满少妇熟乱xxxxx视频 | 日日天干夜夜狠狠爱 | 露脸叫床粗话东北少妇 | 四虎4hu永久免费 | 99久久久国产精品无码免费 | 亚洲男人av香蕉爽爽爽爽 | 国产精品成人av在线观看 | 精品一区二区三区波多野结衣 | 欧美日本精品一区二区三区 | 黑森林福利视频导航 | 亚洲s色大片在线观看 | 黑森林福利视频导航 | 曰本女人与公拘交酡免费视频 | 中文字幕人妻无码一区二区三区 | 午夜福利试看120秒体验区 | 国产精品无码mv在线观看 | 青青青手机频在线观看 | 久久综合久久自在自线精品自 | 美女张开腿让人桶 | 67194成是人免费无码 | 色噜噜亚洲男人的天堂 | 国产人妻久久精品二区三区老狼 | 无码人妻久久一区二区三区不卡 | 国产黑色丝袜在线播放 | 在线看片无码永久免费视频 | 日本www一道久久久免费榴莲 | 亚洲精品一区二区三区在线观看 | 国产97在线 | 亚洲 | 亚洲成色在线综合网站 | 日韩精品久久久肉伦网站 | 国产午夜精品一区二区三区嫩草 | 日韩精品a片一区二区三区妖精 | 任你躁国产自任一区二区三区 | 强辱丰满人妻hd中文字幕 | 啦啦啦www在线观看免费视频 | 樱花草在线播放免费中文 | 性开放的女人aaa片 | 国产亚洲精品久久久久久久久动漫 | 伊在人天堂亚洲香蕉精品区 | 成人精品一区二区三区中文字幕 | 纯爱无遮挡h肉动漫在线播放 | 国产内射老熟女aaaa | 自拍偷自拍亚洲精品被多人伦好爽 | 国产亲子乱弄免费视频 | 丝袜美腿亚洲一区二区 | 免费无码av一区二区 | 国产性生交xxxxx无码 | 亚洲国产精品久久人人爱 | 亚洲色大成网站www国产 | yw尤物av无码国产在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | √天堂资源地址中文在线 | 天堂а√在线地址中文在线 | 亚洲中文字幕av在天堂 | 两性色午夜免费视频 | 久久精品国产99久久6动漫 | 色综合久久久无码中文字幕 | 国产福利视频一区二区 | 国产超碰人人爽人人做人人添 | 日日鲁鲁鲁夜夜爽爽狠狠 | 高潮毛片无遮挡高清免费视频 | 无码人妻精品一区二区三区下载 | 欧美性生交活xxxxxdddd | 中文字幕人妻丝袜二区 | 精品无码一区二区三区爱欲 | 亚洲精品一区二区三区在线观看 | 免费无码午夜福利片69 | 久久综合网欧美色妞网 | 国产精品自产拍在线观看 | 麻豆国产丝袜白领秘书在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 久久午夜夜伦鲁鲁片无码免费 | 性色av无码免费一区二区三区 | 国产免费无码一区二区视频 | 亚洲国产精品久久久久久 | 高潮毛片无遮挡高清免费 | 久久久久se色偷偷亚洲精品av | 少妇无套内谢久久久久 | 人妻aⅴ无码一区二区三区 | 一本无码人妻在中文字幕免费 | 学生妹亚洲一区二区 | 国产激情无码一区二区 | 欧美性生交活xxxxxdddd | 精品无人区无码乱码毛片国产 | 天天摸天天碰天天添 | 欧美日韩一区二区三区自拍 | 国产精品无码一区二区三区不卡 | 99久久精品日本一区二区免费 | 国产乱人伦偷精品视频 | 欧美日韩人成综合在线播放 | 在线观看欧美一区二区三区 | 少妇性荡欲午夜性开放视频剧场 | 国产高清不卡无码视频 | 日韩欧美群交p片內射中文 | 台湾无码一区二区 | 婷婷综合久久中文字幕蜜桃三电影 | 蜜桃臀无码内射一区二区三区 | 久久综合狠狠综合久久综合88 | 日韩精品无码一本二本三本色 | 少妇厨房愉情理9仑片视频 | 无码中文字幕色专区 | 人妻体内射精一区二区三四 | 亚洲一区av无码专区在线观看 | 国产 精品 自在自线 | 亚洲国产av美女网站 | 老司机亚洲精品影院 | 国产午夜亚洲精品不卡 | 国产av一区二区精品久久凹凸 | 亚洲大尺度无码无码专区 | 麻豆人妻少妇精品无码专区 | 国产精品理论片在线观看 | 99精品无人区乱码1区2区3区 | 漂亮人妻洗澡被公强 日日躁 | 樱花草在线播放免费中文 | 老司机亚洲精品影院 | 欧美丰满老熟妇xxxxx性 | 兔费看少妇性l交大片免费 | 高潮毛片无遮挡高清免费视频 | 久热国产vs视频在线观看 | 亚洲精品国产品国语在线观看 | 亚洲国精产品一二二线 | 亚洲毛片av日韩av无码 | 中文字幕无码免费久久9一区9 | 精品国精品国产自在久国产87 | 国产成人无码av一区二区 | 丰满人妻一区二区三区免费视频 | 人妻少妇精品无码专区二区 | 成人片黄网站色大片免费观看 | 少妇性俱乐部纵欲狂欢电影 | 丰满肥臀大屁股熟妇激情视频 | 久久精品国产亚洲精品 | 一区二区三区高清视频一 | 丁香啪啪综合成人亚洲 | 成年美女黄网站色大免费全看 | 久久这里只有精品视频9 | 中文字幕人妻无码一区二区三区 | 国产精品永久免费视频 | 99久久久无码国产aaa精品 | 久久99精品国产.久久久久 | 精品厕所偷拍各类美女tp嘘嘘 | 色窝窝无码一区二区三区色欲 | 又大又硬又爽免费视频 | 亚洲 欧美 激情 小说 另类 | 人人澡人人透人人爽 | а√天堂www在线天堂小说 | 一本久久a久久精品亚洲 | 国产精品成人av在线观看 | 欧美日韩色另类综合 | 国产人妻人伦精品1国产丝袜 | 少妇无码av无码专区在线观看 | 久久精品人人做人人综合试看 | 人人妻人人澡人人爽欧美精品 | 我要看www免费看插插视频 | a在线观看免费网站大全 | 亚洲午夜久久久影院 | 无码人妻丰满熟妇区五十路百度 | 成人综合网亚洲伊人 | 精品国精品国产自在久国产87 | 欧美第一黄网免费网站 | 日本丰满熟妇videos | 精品一区二区三区无码免费视频 | 亚洲中文字幕无码中字 | 日本丰满护士爆乳xxxx | 国产香蕉97碰碰久久人人 | 中文字幕av无码一区二区三区电影 | 精品人妻人人做人人爽夜夜爽 | 国产亚洲美女精品久久久2020 | 日本成熟视频免费视频 | 偷窥日本少妇撒尿chinese | 国产av剧情md精品麻豆 | 小泽玛莉亚一区二区视频在线 | 无码av免费一区二区三区试看 | 无码av最新清无码专区吞精 | 丰满肥臀大屁股熟妇激情视频 | 精品人人妻人人澡人人爽人人 | 精品熟女少妇av免费观看 | 国产福利视频一区二区 | 免费网站看v片在线18禁无码 | 人妻尝试又大又粗久久 | 伊在人天堂亚洲香蕉精品区 | 扒开双腿吃奶呻吟做受视频 | 一区二区传媒有限公司 | 亚洲国产精品一区二区美利坚 | 欧美真人作爱免费视频 | 久久久久99精品成人片 | 亚洲 另类 在线 欧美 制服 | 成人试看120秒体验区 | 亚洲狠狠婷婷综合久久 | 国产激情精品一区二区三区 | 少妇人妻偷人精品无码视频 | 一本无码人妻在中文字幕免费 | 国产特级毛片aaaaaa高潮流水 | 国产日产欧产精品精品app | 国内综合精品午夜久久资源 | 麻豆人妻少妇精品无码专区 | 女人高潮内射99精品 | 国产精品欧美成人 | 一二三四在线观看免费视频 | 久久久久99精品国产片 | 欧美 日韩 亚洲 在线 | 欧美猛少妇色xxxxx | 亚洲の无码国产の无码影院 | 亚洲精品一区二区三区四区五区 | 国内精品久久毛片一区二区 | 18无码粉嫩小泬无套在线观看 | 国产乡下妇女做爰 | 久久精品国产精品国产精品污 | 亚洲精品一区三区三区在线观看 | 麻豆av传媒蜜桃天美传媒 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美精品无码一区二区三区 | 扒开双腿疯狂进出爽爽爽视频 | 久久人妻内射无码一区三区 | 狠狠亚洲超碰狼人久久 | 性生交片免费无码看人 | 国内综合精品午夜久久资源 | 妺妺窝人体色www婷婷 | 大肉大捧一进一出视频出来呀 | 国产无遮挡吃胸膜奶免费看 | 中文字幕亚洲情99在线 | 国产农村妇女高潮大叫 | 色婷婷av一区二区三区之红樱桃 | 人人妻人人澡人人爽欧美一区九九 | 动漫av一区二区在线观看 | 强奷人妻日本中文字幕 | 色综合久久久久综合一本到桃花网 | 日本大香伊一区二区三区 | 亚洲а∨天堂久久精品2021 | 人妻少妇精品无码专区动漫 | 亚洲 日韩 欧美 成人 在线观看 | 午夜福利不卡在线视频 | 三级4级全黄60分钟 | 亚洲春色在线视频 | 在线成人www免费观看视频 | 国产凸凹视频一区二区 | 欧美肥老太牲交大战 | 人人妻人人澡人人爽欧美一区 | 精品国产成人一区二区三区 | 国产亚洲人成在线播放 | 日本一区二区三区免费高清 | 国产真实乱对白精彩久久 | 亚洲国产精品久久久天堂 | 日韩精品久久久肉伦网站 | 全球成人中文在线 | 国产精品毛片一区二区 | 国产色在线 | 国产 | 精品人妻人人做人人爽 | 粉嫩少妇内射浓精videos | 久久精品无码一区二区三区 | 亚洲国产精品无码一区二区三区 | 东北女人啪啪对白 | 国产两女互慰高潮视频在线观看 | 人妻尝试又大又粗久久 | 亚洲精品久久久久avwww潮水 | 久久久亚洲欧洲日产国码αv | 免费视频欧美无人区码 | 精品一区二区三区无码免费视频 | 久久午夜无码鲁丝片 | 成人精品天堂一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 久久aⅴ免费观看 | 国产亚洲精品久久久久久国模美 | 久久久www成人免费毛片 | 日本免费一区二区三区最新 | 99久久久无码国产aaa精品 | 麻花豆传媒剧国产免费mv在线 | 日本一卡2卡3卡四卡精品网站 | 色诱久久久久综合网ywww | 国产精品自产拍在线观看 | 亚洲自偷自拍另类第1页 | 中文字幕无码视频专区 | 久久亚洲国产成人精品性色 | 日本一卡二卡不卡视频查询 | 麻花豆传媒剧国产免费mv在线 | av在线亚洲欧洲日产一区二区 | 国产成人精品三级麻豆 | 亚洲精品成人av在线 | 无码成人精品区在线观看 | 水蜜桃av无码 | 亚洲中文无码av永久不收费 | 一个人看的视频www在线 | 欧美日本免费一区二区三区 | 欧美国产日产一区二区 | 久久精品国产日本波多野结衣 | 中文字幕中文有码在线 | 亚洲欧美精品aaaaaa片 | 成人综合网亚洲伊人 | 久久精品人妻少妇一区二区三区 | 1000部夫妻午夜免费 | 亚洲欧美中文字幕5发布 | 国产午夜无码精品免费看 | 老熟妇乱子伦牲交视频 | 精品偷自拍另类在线观看 | 中文字幕中文有码在线 | 国产乡下妇女做爰 | 成人一在线视频日韩国产 | 精品久久久久香蕉网 | 色欲av亚洲一区无码少妇 | 国产免费无码一区二区视频 | 久久久久国色av免费观看性色 | 午夜丰满少妇性开放视频 | 亚洲中文字幕无码一久久区 | 亚洲色大成网站www国产 | 激情内射亚州一区二区三区爱妻 | 99国产精品白浆在线观看免费 | 久久久久成人片免费观看蜜芽 | 亚洲国产精品美女久久久久 | 好男人社区资源 | 色五月丁香五月综合五月 | 中文字幕乱码中文乱码51精品 | 奇米影视7777久久精品人人爽 | 乌克兰少妇性做爰 | 日本肉体xxxx裸交 | 精品国产麻豆免费人成网站 | 亚洲国产成人a精品不卡在线 | 婷婷五月综合激情中文字幕 | 欧美自拍另类欧美综合图片区 | 国产亚洲欧美在线专区 | 狠狠色丁香久久婷婷综合五月 | 熟妇女人妻丰满少妇中文字幕 | 日本免费一区二区三区最新 | 日本高清一区免费中文视频 | 大地资源网第二页免费观看 | 日本一区二区更新不卡 | 亚洲精品国产精品乱码视色 | 无码国模国产在线观看 | 欧美性黑人极品hd | 九九久久精品国产免费看小说 | 国产情侣作爱视频免费观看 | 欧美精品在线观看 | 欧美刺激性大交 | 无码人妻丰满熟妇区五十路百度 | 国产农村乱对白刺激视频 | 人妻少妇精品无码专区二区 | 国产亚洲精品精品国产亚洲综合 | 又湿又紧又大又爽a视频国产 | 熟妇女人妻丰满少妇中文字幕 | 午夜成人1000部免费视频 | 一本大道久久东京热无码av | 99久久亚洲精品无码毛片 | 日欧一片内射va在线影院 | 国产精品久久久久久无码 | 久久国产精品偷任你爽任你 | 亚洲七七久久桃花影院 | 人妻无码αv中文字幕久久琪琪布 | 精品国精品国产自在久国产87 | 300部国产真实乱 | 18禁黄网站男男禁片免费观看 | 亚洲欧美精品aaaaaa片 | 乱人伦人妻中文字幕无码久久网 | 老熟女重囗味hdxx69 | 99精品国产综合久久久久五月天 | 无码纯肉视频在线观看 | 久久成人a毛片免费观看网站 | 国产国语老龄妇女a片 | 强奷人妻日本中文字幕 | 国产精品自产拍在线观看 | 国产小呦泬泬99精品 | 波多野结衣一区二区三区av免费 | 性做久久久久久久久 | 国产成人无码a区在线观看视频app | 欧美精品无码一区二区三区 | 人妻aⅴ无码一区二区三区 | 欧美精品一区二区精品久久 | 欧美老妇交乱视频在线观看 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 18禁黄网站男男禁片免费观看 | 伊人久久大香线蕉午夜 | 国产97色在线 | 免 | 又紧又大又爽精品一区二区 | 97夜夜澡人人双人人人喊 | 无码帝国www无码专区色综合 | 亚洲 另类 在线 欧美 制服 | 久久精品中文字幕大胸 | 国产成人亚洲综合无码 | 欧美日韩一区二区综合 | 男女作爱免费网站 | 亚洲 激情 小说 另类 欧美 | 欧美日本精品一区二区三区 | 国产精品人人爽人人做我的可爱 | 亚洲爆乳大丰满无码专区 | 亚洲一区二区三区无码久久 | 国产亚洲人成a在线v网站 | 人妻体内射精一区二区三四 | 久久亚洲国产成人精品性色 | 性做久久久久久久久 | 中文字幕日韩精品一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 欧美35页视频在线观看 | 乱人伦人妻中文字幕无码久久网 | 国产人妻人伦精品 | 欧美日韩人成综合在线播放 | 任你躁在线精品免费 | 老子影院午夜伦不卡 | 亚洲熟妇色xxxxx欧美老妇y | 蜜桃无码一区二区三区 | 国产女主播喷水视频在线观看 | 永久免费观看国产裸体美女 | 熟妇人妻激情偷爽文 | 亚洲欧洲无卡二区视頻 | 亚洲乱码国产乱码精品精 | 亚洲一区二区三区国产精华液 | 曰本女人与公拘交酡免费视频 | 自拍偷自拍亚洲精品10p | 久久精品人妻少妇一区二区三区 | 亚洲精品欧美二区三区中文字幕 | 色诱久久久久综合网ywww | 高潮喷水的毛片 | 红桃av一区二区三区在线无码av | 伦伦影院午夜理论片 | 国产婷婷色一区二区三区在线 | 国产亚洲精品久久久闺蜜 | 性做久久久久久久免费看 | 欧美成人家庭影院 | 日本乱偷人妻中文字幕 | 亚洲日本va中文字幕 | 女人高潮内射99精品 | 国产激情无码一区二区app | 亚洲国产av精品一区二区蜜芽 | 永久黄网站色视频免费直播 | 大地资源网第二页免费观看 | 国产高潮视频在线观看 | 国产激情无码一区二区 | 亚洲狠狠色丁香婷婷综合 | 丝袜 中出 制服 人妻 美腿 | 老熟女重囗味hdxx69 | 国产又爽又猛又粗的视频a片 | 一本一道久久综合久久 | 欧美人与物videos另类 | 久久久久国色av免费观看性色 | 中文字幕人成乱码熟女app | 97夜夜澡人人爽人人喊中国片 | 妺妺窝人体色www在线小说 | 丰满妇女强制高潮18xxxx | 男人扒开女人内裤强吻桶进去 | 久久国产精品萌白酱免费 | 荫蒂被男人添的好舒服爽免费视频 | 无码人中文字幕 | 国产成人精品一区二区在线小狼 | 日本精品人妻无码免费大全 | 成熟女人特级毛片www免费 | 人妻与老人中文字幕 | 欧美色就是色 | 国产精品亚洲五月天高清 | 99精品无人区乱码1区2区3区 | 色欲综合久久中文字幕网 | 久热国产vs视频在线观看 | 久久五月精品中文字幕 | 在线观看欧美一区二区三区 | 18禁止看的免费污网站 | 精品久久久中文字幕人妻 | 国产日产欧产精品精品app | 国产精品亚洲专区无码不卡 | 国产av剧情md精品麻豆 | 色五月五月丁香亚洲综合网 | 久久久久国色av免费观看性色 | 日韩精品a片一区二区三区妖精 | av在线亚洲欧洲日产一区二区 | 久久精品中文字幕大胸 | 色综合久久88色综合天天 | 人人妻人人澡人人爽欧美精品 | 亚洲狠狠婷婷综合久久 | 亚洲日本一区二区三区在线 | 老子影院午夜伦不卡 | 欧美日韩在线亚洲综合国产人 | 成年女人永久免费看片 | 无码国产乱人伦偷精品视频 | 亚洲日本va中文字幕 | 欧美怡红院免费全部视频 | www国产亚洲精品久久久日本 | 精品无码国产自产拍在线观看蜜 | 大肉大捧一进一出好爽视频 | 自拍偷自拍亚洲精品10p | 少妇无码吹潮 | 宝宝好涨水快流出来免费视频 | a在线观看免费网站大全 | 波多野结衣高清一区二区三区 | 性欧美熟妇videofreesex | 国产特级毛片aaaaaaa高清 | 日韩少妇内射免费播放 | 丁香啪啪综合成人亚洲 | 中文精品久久久久人妻不卡 | 人妻体内射精一区二区三四 | 精品久久综合1区2区3区激情 | 少妇被黑人到高潮喷出白浆 | 一本加勒比波多野结衣 | 久久国产精品二国产精品 | 女人和拘做爰正片视频 | 国产精品久久久久无码av色戒 | 久久久亚洲欧洲日产国码αv | 自拍偷自拍亚洲精品被多人伦好爽 | 97精品人妻一区二区三区香蕉 | 丰满护士巨好爽好大乳 | v一区无码内射国产 | 国产亚洲日韩欧美另类第八页 | 国产三级久久久精品麻豆三级 | 久久亚洲a片com人成 | ass日本丰满熟妇pics | 色一情一乱一伦一区二区三欧美 | 久久久久亚洲精品中文字幕 | 少妇太爽了在线观看 | 免费无码av一区二区 | 亚洲精品一区二区三区四区五区 | 欧美精品一区二区精品久久 | 国产精华av午夜在线观看 | 国产精品久久久久久久9999 | 性欧美牲交xxxxx视频 | 成人影院yy111111在线观看 | www国产亚洲精品久久网站 | 亚洲成色在线综合网站 | 久久久久久av无码免费看大片 | 国产艳妇av在线观看果冻传媒 | 性欧美videos高清精品 | 伊人久久大香线焦av综合影院 | 玩弄人妻少妇500系列视频 | 国产精品久久久久影院嫩草 | 国产激情精品一区二区三区 | 欧美猛少妇色xxxxx | 131美女爱做视频 | 亚洲国产欧美国产综合一区 | 国语精品一区二区三区 | av人摸人人人澡人人超碰下载 | 亚洲成熟女人毛毛耸耸多 | 色欲人妻aaaaaaa无码 | 亚洲欧美日韩综合久久久 | 中文字幕无码日韩欧毛 | 成 人 免费观看网站 | 国产在线精品一区二区三区直播 | 丝袜人妻一区二区三区 | 精品久久久久香蕉网 | 97se亚洲精品一区 | 亚洲第一无码av无码专区 | 日本一本二本三区免费 | 亚洲精品欧美二区三区中文字幕 | 精品欧洲av无码一区二区三区 | 免费人成在线观看网站 | 久9re热视频这里只有精品 | 福利一区二区三区视频在线观看 | 老熟妇仑乱视频一区二区 | 亚洲日韩av一区二区三区中文 | 国产人妻精品一区二区三区不卡 | 帮老师解开蕾丝奶罩吸乳网站 | 久久国产精品_国产精品 | а天堂中文在线官网 | 亚洲色偷偷偷综合网 | 免费观看的无遮挡av | 少妇厨房愉情理9仑片视频 | 国产午夜亚洲精品不卡 | 天天做天天爱天天爽综合网 | 乱中年女人伦av三区 | 99久久久无码国产aaa精品 | 国产精品久免费的黄网站 | 色欲人妻aaaaaaa无码 | 久久精品成人欧美大片 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲高清偷拍一区二区三区 | 久在线观看福利视频 | 亚洲色欲色欲天天天www | 亚洲天堂2017无码 | 国产偷抇久久精品a片69 | 国产精品亚洲一区二区三区喷水 | 无码人妻av免费一区二区三区 | 1000部夫妻午夜免费 | 99久久亚洲精品无码毛片 | 亚洲日韩av一区二区三区四区 | 少妇被粗大的猛进出69影院 | 熟女俱乐部五十路六十路av | 蜜臀aⅴ国产精品久久久国产老师 | 麻豆成人精品国产免费 | 欧美刺激性大交 | 中国女人内谢69xxxx | 日日摸日日碰夜夜爽av | 日韩欧美成人免费观看 | 亚洲国产精品久久人人爱 | 精品久久久久久人妻无码中文字幕 | 51国偷自产一区二区三区 | 国产人妻大战黑人第1集 | 国产精品人妻一区二区三区四 | 亚洲七七久久桃花影院 | 亚洲国产精品美女久久久久 | 日日摸日日碰夜夜爽av | 国产午夜视频在线观看 | 日欧一片内射va在线影院 | 国产熟妇另类久久久久 | 久久亚洲精品中文字幕无男同 | 欧美日韩人成综合在线播放 | 久久久久久久人妻无码中文字幕爆 | 国产综合色产在线精品 | 中文字幕无码日韩欧毛 | 亚洲爆乳大丰满无码专区 | 免费观看激色视频网站 | 国产又粗又硬又大爽黄老大爷视 | 丰满少妇弄高潮了www | 夜夜躁日日躁狠狠久久av | √天堂资源地址中文在线 | 亚洲国产精品无码久久久久高潮 | 日本熟妇浓毛 | 色欲av亚洲一区无码少妇 | 两性色午夜免费视频 | 国产精品亚洲а∨无码播放麻豆 | 在线播放免费人成毛片乱码 | 日韩在线不卡免费视频一区 | 在线精品亚洲一区二区 | 又紧又大又爽精品一区二区 | 成人性做爰aaa片免费看 | 国产手机在线αⅴ片无码观看 | 99国产精品白浆在线观看免费 | 精品久久综合1区2区3区激情 | 天天躁日日躁狠狠躁免费麻豆 | 少妇太爽了在线观看 | 国产av剧情md精品麻豆 | 色欲av亚洲一区无码少妇 | 国产精品第一国产精品 | 婷婷丁香六月激情综合啪 | 国产suv精品一区二区五 | 国产精华av午夜在线观看 | 99麻豆久久久国产精品免费 | 51国偷自产一区二区三区 | 人妻少妇精品久久 | av无码久久久久不卡免费网站 | 国内精品人妻无码久久久影院蜜桃 | 蜜臀av无码人妻精品 | 欧美变态另类xxxx | 国产精品99爱免费视频 | 国产97人人超碰caoprom | 一二三四在线观看免费视频 | 老熟妇乱子伦牲交视频 | 久久久久成人片免费观看蜜芽 | 亚洲精品国产精品乱码视色 | 亚洲国产av精品一区二区蜜芽 | 中文精品无码中文字幕无码专区 | 大色综合色综合网站 | 色婷婷久久一区二区三区麻豆 | 国内精品久久毛片一区二区 | 色情久久久av熟女人妻网站 | 欧美老熟妇乱xxxxx | 色一情一乱一伦一视频免费看 | 国产办公室秘书无码精品99 | 夜先锋av资源网站 | 激情内射日本一区二区三区 | 噜噜噜亚洲色成人网站 | 国产女主播喷水视频在线观看 | 国产97色在线 | 免 | 午夜无码人妻av大片色欲 | 欧洲欧美人成视频在线 | 国产内射老熟女aaaa | 老司机亚洲精品影院无码 | 成年美女黄网站色大免费全看 | 亚洲精品鲁一鲁一区二区三区 | 久久伊人色av天堂九九小黄鸭 | 亚洲国产av精品一区二区蜜芽 | 午夜男女很黄的视频 | 兔费看少妇性l交大片免费 | 国产乱人伦偷精品视频 | 免费人成在线观看网站 | 久久99久久99精品中文字幕 | 在线观看国产午夜福利片 | 免费播放一区二区三区 | av在线亚洲欧洲日产一区二区 | 亚洲s码欧洲m码国产av | 四虎4hu永久免费 | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲码国产精品高潮在线 | 久久精品国产99精品亚洲 | 国产亚洲人成a在线v网站 | 国产欧美精品一区二区三区 | 国产精品亚洲专区无码不卡 | 黑人巨大精品欧美一区二区 | 成人毛片一区二区 | 四十如虎的丰满熟妇啪啪 | 99久久无码一区人妻 | 一本一道久久综合久久 | 国内揄拍国内精品少妇国语 | 色 综合 欧美 亚洲 国产 | 野狼第一精品社区 | 大地资源中文第3页 | 久久综合香蕉国产蜜臀av | 中文字幕无码av激情不卡 | 在线播放免费人成毛片乱码 | 高清国产亚洲精品自在久久 | 自拍偷自拍亚洲精品10p | 成人精品视频一区二区三区尤物 | 在线 国产 欧美 亚洲 天堂 | 亚洲日韩精品欧美一区二区 | 小泽玛莉亚一区二区视频在线 | 一本大道伊人av久久综合 | 黑人玩弄人妻中文在线 | 日产精品99久久久久久 | 色综合久久久久综合一本到桃花网 | 在线播放无码字幕亚洲 | 欧洲vodafone精品性 | 51国偷自产一区二区三区 | 人妻人人添人妻人人爱 | 亚洲精品一区二区三区在线观看 | 国产 浪潮av性色四虎 | 久久久中文久久久无码 | 少妇高潮一区二区三区99 | 日韩精品无码一区二区中文字幕 | 中文字幕av伊人av无码av | 国产精品人人妻人人爽 | 久久久久久亚洲精品a片成人 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 欧美成人免费全部网站 | 婷婷综合久久中文字幕蜜桃三电影 | 欧美性色19p | 亚洲男人av香蕉爽爽爽爽 | 日韩精品无码一区二区中文字幕 | 久久久www成人免费毛片 | 亚洲国产精品一区二区美利坚 | 男女超爽视频免费播放 | 亚洲一区二区三区含羞草 | 天天拍夜夜添久久精品 | 亚洲中文字幕无码中字 | 国产口爆吞精在线视频 | 无码精品人妻一区二区三区av | 国产亚洲精品久久久久久国模美 | 国产亚洲人成在线播放 | 日日碰狠狠躁久久躁蜜桃 | 日本肉体xxxx裸交 | 台湾无码一区二区 | 久久99久久99精品中文字幕 | 亚洲第一网站男人都懂 | 99久久久国产精品无码免费 | 丰满护士巨好爽好大乳 | 亚洲中文字幕无码一久久区 | 日本熟妇人妻xxxxx人hd | 日韩精品一区二区av在线 | 99国产精品白浆在线观看免费 | 无码午夜成人1000部免费视频 | 最新版天堂资源中文官网 | 欧美乱妇无乱码大黄a片 | 在教室伦流澡到高潮hnp视频 | 青青青爽视频在线观看 | 亚洲综合精品香蕉久久网 | 又湿又紧又大又爽a视频国产 | 女人高潮内射99精品 | 熟妇激情内射com | 在线精品国产一区二区三区 | 国内精品久久久久久中文字幕 | 中文字幕精品av一区二区五区 | 女人被男人爽到呻吟的视频 | 久久精品无码一区二区三区 | 欧美精品一区二区精品久久 | 九一九色国产 | 久久亚洲a片com人成 | 国产精品二区一区二区aⅴ污介绍 | 真人与拘做受免费视频 | 亚洲高清偷拍一区二区三区 | 国产成人无码a区在线观看视频app | 永久黄网站色视频免费直播 | 呦交小u女精品视频 | 亚洲日韩中文字幕在线播放 | 亚洲精品鲁一鲁一区二区三区 | 久久久久久亚洲精品a片成人 | 国产av人人夜夜澡人人爽麻豆 | 女人被爽到呻吟gif动态图视看 | 亚洲成a人片在线观看无码3d | 中文无码成人免费视频在线观看 | 久久精品视频在线看15 | 精品无码成人片一区二区98 | 久久午夜无码鲁丝片午夜精品 | 蜜桃视频韩日免费播放 | 精品无码国产自产拍在线观看蜜 | 亚洲 a v无 码免 费 成 人 a v | 97久久精品无码一区二区 | 久久久久成人精品免费播放动漫 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 久久99精品国产麻豆蜜芽 | 一本一道久久综合久久 | 精品水蜜桃久久久久久久 | 丝袜人妻一区二区三区 | 18精品久久久无码午夜福利 | 男人扒开女人内裤强吻桶进去 | 沈阳熟女露脸对白视频 | 国产亚洲精品久久久ai换 | 亚洲男人av香蕉爽爽爽爽 | 老熟女重囗味hdxx69 | 永久免费观看国产裸体美女 | 夜夜影院未满十八勿进 | 人人妻人人澡人人爽精品欧美 | a在线亚洲男人的天堂 | 亚洲a无码综合a国产av中文 | 国产人妻大战黑人第1集 | 欧美性生交xxxxx久久久 | 国产黄在线观看免费观看不卡 | 老子影院午夜伦不卡 | v一区无码内射国产 | 亚洲日韩一区二区三区 | 国产精品igao视频网 | 国语自产偷拍精品视频偷 | 永久黄网站色视频免费直播 | 熟女体下毛毛黑森林 | 亚洲熟悉妇女xxx妇女av | 久久久久久久久888 | 日本精品人妻无码77777 天堂一区人妻无码 | 美女毛片一区二区三区四区 | 精品乱子伦一区二区三区 | 成人无码视频在线观看网站 | 三级4级全黄60分钟 | 精品无码国产自产拍在线观看蜜 | 大色综合色综合网站 | 午夜精品久久久久久久 | 国产xxx69麻豆国语对白 | 久久久久久久人妻无码中文字幕爆 | 宝宝好涨水快流出来免费视频 | 亚洲成av人片天堂网无码】 | 成人一区二区免费视频 | 色 综合 欧美 亚洲 国产 | 国产成人无码a区在线观看视频app | 亚洲国产一区二区三区在线观看 | 在线播放免费人成毛片乱码 | 亚洲精品成a人在线观看 | 国产精品办公室沙发 | 一本大道久久东京热无码av | 国产疯狂伦交大片 | 国产极品美女高潮无套在线观看 | 久久久久se色偷偷亚洲精品av | 精品成在人线av无码免费看 | 欧美精品在线观看 | 亚洲理论电影在线观看 | 亚洲精品中文字幕久久久久 | 中国大陆精品视频xxxx | av人摸人人人澡人人超碰下载 | 亚洲天堂2017无码中文 | 国产真实夫妇视频 | 成人性做爰aaa片免费看 | 无码av最新清无码专区吞精 | 丝袜足控一区二区三区 | 久久久久99精品成人片 | 欧美丰满少妇xxxx性 | 亚洲欧美日韩综合久久久 | 久久人人爽人人爽人人片av高清 | 中文无码精品a∨在线观看不卡 | 97无码免费人妻超级碰碰夜夜 | 色综合久久网 | 两性色午夜视频免费播放 | 亚洲欧美日韩成人高清在线一区 | 日本va欧美va欧美va精品 | 九月婷婷人人澡人人添人人爽 | 亚洲色偷偷偷综合网 | 亚洲综合无码久久精品综合 | 精品国产一区av天美传媒 | 日本一区二区三区免费高清 | 精品熟女少妇av免费观看 | 亚洲欧美日韩综合久久久 | 大乳丰满人妻中文字幕日本 | 亚洲国产欧美国产综合一区 | 国产婷婷色一区二区三区在线 | 精品国产乱码久久久久乱码 | 国产超级va在线观看视频 | 成人三级无码视频在线观看 | 福利一区二区三区视频在线观看 | 亚洲а∨天堂久久精品2021 | 漂亮人妻洗澡被公强 日日躁 | 欧美野外疯狂做受xxxx高潮 | av无码不卡在线观看免费 | 亚洲成a人一区二区三区 | 人妻体内射精一区二区三四 | 人妻少妇精品无码专区二区 | 强辱丰满人妻hd中文字幕 | 亚洲最大成人网站 | 国产成人无码专区 | 亚洲啪av永久无码精品放毛片 | 少妇性俱乐部纵欲狂欢电影 | 久久久www成人免费毛片 | 亚洲国产精品久久久天堂 | 日本欧美一区二区三区乱码 | 欧美日韩久久久精品a片 | 无码成人精品区在线观看 | 午夜免费福利小电影 | 少妇无码吹潮 | 永久免费观看美女裸体的网站 | aa片在线观看视频在线播放 | 精品成在人线av无码免费看 | 亚洲一区av无码专区在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲中文无码av永久不收费 | 精品国产aⅴ无码一区二区 | 全球成人中文在线 | 极品嫩模高潮叫床 | 国产午夜无码视频在线观看 | 婷婷综合久久中文字幕蜜桃三电影 | 无码纯肉视频在线观看 | 久久国产36精品色熟妇 | 中文字幕精品av一区二区五区 | 精品无人国产偷自产在线 | 久久国产36精品色熟妇 | 日韩欧美群交p片內射中文 | 午夜不卡av免费 一本久久a久久精品vr综合 | 人人超人人超碰超国产 | 1000部啪啪未满十八勿入下载 | 久久精品一区二区三区四区 | 图片小说视频一区二区 | 丰满诱人的人妻3 | 最近的中文字幕在线看视频 | 国产香蕉尹人综合在线观看 | 久久精品成人欧美大片 | 在线精品亚洲一区二区 | 国产精品人妻一区二区三区四 | 成人动漫在线观看 | 久久99精品久久久久久动态图 | 狠狠cao日日穞夜夜穞av | 欧美丰满熟妇xxxx | 亚洲日韩av一区二区三区四区 | 美女极度色诱视频国产 | 最近中文2019字幕第二页 | 性生交片免费无码看人 | 免费人成网站视频在线观看 | √天堂中文官网8在线 | av无码不卡在线观看免费 | 白嫩日本少妇做爰 | 99精品国产综合久久久久五月天 | 久久人人97超碰a片精品 | 红桃av一区二区三区在线无码av | 午夜精品一区二区三区在线观看 | 色婷婷综合激情综在线播放 | 免费视频欧美无人区码 | 女人被爽到呻吟gif动态图视看 | 亚洲欧美日韩综合久久久 | 欧美日韩色另类综合 | 日韩无套无码精品 | 精品成人av一区二区三区 | 亚洲精品一区二区三区在线观看 | 亚洲国产精品无码久久久久高潮 | 少妇无码一区二区二三区 | 国产办公室秘书无码精品99 | 性欧美videos高清精品 | 国产性生大片免费观看性 | 亚洲一区二区三区四区 | 熟女少妇人妻中文字幕 | 精品国产一区二区三区av 性色 | 中文字幕乱码人妻二区三区 | 久久99精品久久久久久 | 午夜精品久久久内射近拍高清 | 亚洲熟熟妇xxxx | 国产乱人伦av在线无码 | 中文久久乱码一区二区 | 国内少妇偷人精品视频免费 | 性欧美videos高清精品 | 偷窥村妇洗澡毛毛多 | 成人无码精品一区二区三区 | 又大又硬又黄的免费视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 乌克兰少妇xxxx做受 | 日产精品高潮呻吟av久久 | 偷窥村妇洗澡毛毛多 | 四虎国产精品免费久久 | 国产午夜亚洲精品不卡 | 亚洲天堂2017无码中文 | 久久国产精品_国产精品 | 成人欧美一区二区三区 | 人人妻人人藻人人爽欧美一区 | 欧洲vodafone精品性 | 宝宝好涨水快流出来免费视频 | 亚洲欧洲无卡二区视頻 | 日日碰狠狠躁久久躁蜜桃 | 国产成人久久精品流白浆 | 久久精品国产日本波多野结衣 | 内射后入在线观看一区 | 国产av人人夜夜澡人人爽麻豆 | 亚洲色成人中文字幕网站 | 在线视频网站www色 | 亚洲一区二区三区香蕉 | 无码一区二区三区在线 | 99久久人妻精品免费二区 | 中文无码精品a∨在线观看不卡 | 又紧又大又爽精品一区二区 | 日韩少妇内射免费播放 | 国产午夜亚洲精品不卡下载 | 国产香蕉尹人综合在线观看 | 日本www一道久久久免费榴莲 | 欧美xxxx黑人又粗又长 | 亚洲中文字幕乱码av波多ji | 骚片av蜜桃精品一区 | 国产精品国产自线拍免费软件 | 少妇久久久久久人妻无码 | 少妇无套内谢久久久久 | 亚洲一区二区三区含羞草 | 亚洲乱码中文字幕在线 | 国产亚洲人成在线播放 | 日本爽爽爽爽爽爽在线观看免 | 狂野欧美激情性xxxx | 131美女爱做视频 | 老司机亚洲精品影院无码 | 麻豆国产97在线 | 欧洲 | 日韩av无码一区二区三区不卡 | 99精品无人区乱码1区2区3区 | 强辱丰满人妻hd中文字幕 | 在线看片无码永久免费视频 | 成年美女黄网站色大免费视频 | 亚洲一区av无码专区在线观看 | 欧洲极品少妇 | 国产精品香蕉在线观看 | 性生交大片免费看女人按摩摩 | 国产偷自视频区视频 | 国产一区二区三区影院 | 荫蒂被男人添的好舒服爽免费视频 | 99久久婷婷国产综合精品青草免费 | 欧美国产日韩久久mv | 欧美亚洲国产一区二区三区 | 熟女俱乐部五十路六十路av | 国产成人久久精品流白浆 | 欧美精品无码一区二区三区 | 台湾无码一区二区 | 黑人巨大精品欧美一区二区 | av无码电影一区二区三区 | 1000部啪啪未满十八勿入下载 | 久久久久99精品国产片 | 亚洲区小说区激情区图片区 | 伊人久久大香线焦av综合影院 | 久久午夜夜伦鲁鲁片无码免费 | 夜夜影院未满十八勿进 | 俄罗斯老熟妇色xxxx | 成人三级无码视频在线观看 | 久激情内射婷内射蜜桃人妖 | 久久久久99精品成人片 | 国产农村乱对白刺激视频 | 鲁一鲁av2019在线 | 激情内射亚州一区二区三区爱妻 | 国产婷婷色一区二区三区在线 | 久久精品国产精品国产精品污 | 牲交欧美兽交欧美 | 内射欧美老妇wbb | 国产成人综合在线女婷五月99播放 | 东京无码熟妇人妻av在线网址 | 国产av一区二区三区最新精品 | 伦伦影院午夜理论片 | 97久久精品无码一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 乱人伦人妻中文字幕无码 | 国产人成高清在线视频99最全资源 | 国产精品欧美成人 | 国产精品a成v人在线播放 | 少妇人妻偷人精品无码视频 | 麻豆国产97在线 | 欧洲 | 亲嘴扒胸摸屁股激烈网站 | 国产av无码专区亚洲awww | 国产精品无码永久免费888 | 国产sm调教视频在线观看 | 18精品久久久无码午夜福利 | 噜噜噜亚洲色成人网站 | 俺去俺来也在线www色官网 | 色诱久久久久综合网ywww | 曰韩无码二三区中文字幕 | 一本久久a久久精品亚洲 | 高潮喷水的毛片 | 国产精品igao视频网 | 天天燥日日燥 | 中文字幕无码日韩专区 | 国产极品美女高潮无套在线观看 | 中文字幕精品av一区二区五区 | 国产suv精品一区二区五 | 亚洲国产一区二区三区在线观看 | 性生交大片免费看女人按摩摩 | 国产亚洲日韩欧美另类第八页 | 乱码av麻豆丝袜熟女系列 | 久久综合狠狠综合久久综合88 | 亚洲の无码国产の无码影院 | 中文字幕久久久久人妻 | 老熟妇乱子伦牲交视频 | 无码人妻出轨黑人中文字幕 | 老头边吃奶边弄进去呻吟 | 日韩欧美群交p片內射中文 | 中文亚洲成a人片在线观看 | 天堂在线观看www |