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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

e盾服务端源码_gRPC服务注册发现及负载均衡的实现方案与源码解析

發布時間:2023/12/4 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 e盾服务端源码_gRPC服务注册发现及负载均衡的实现方案与源码解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天聊一下gRPC的服務發現和負載均衡原理相關的話題,不同于Nginx、Lvs或者F5這些服務端的負載均衡策略,gRPC采用的是客戶端實現的負載均衡。什么意思呢,對于使用服務端負載均衡的系統,客戶端會首先訪問負載均衡的域名/IP,再由負載均衡按照策略分發請求到后端具體某個服務節點上。而對于客戶端的負載均衡則是,客戶端從可用的后端服務節點列表中根據自己的負載均衡策略選擇一個節點直連后端服務器。

Etcd軟件包的naming組件里提供了一個命名解析器(naming resolver)結合gRPC本身自帶的RoundRobin 輪詢調度負載均衡器,讓使用者能方便地搭建起一套服務注冊/發現和負載均衡體系。如果輪詢調度滿足不了調度需求或者不想使用Etcd作為服務的注冊中心和命名解析器的話,可以通過寫代碼實現gRPC定義的Resolver和Balancer接口來滿足系統的自定義需求。

本文引用的源碼對應的版本為:gRPC v1.2.x、 Etcd v3.3
如果你對gRPC和Etcd還不了解,可以先看看我很早之前寫的gRPC入門和Etcd入門 系列的文章。

gRPC服務注冊發現

先來簡單的說明一下用Etcd實現服務注冊和發現的原理。服務注冊和發現這個流程可以用下面這個示意圖簡單描述出來:

上圖的服務A包含了兩個節點,服務在節點上啟動后,會以包含服務名加節點IP的唯一標識作為Key(比如/service/a/114.128.45.117),服務節點IP和端口信息作為值存儲到Etcd上。這些Key都是帶租約的Key,需要我們的服務自己去定期續租,一旦服務節點本身宕掉,比如node2上的服務宕掉,無法完成續租后,那么它對應的Key:/service/a/114.128.45.117 就會過期,客戶端也就無法再從Etcd上獲取到這個服務節點的信息了。

與此同時客戶端也會利用Etcd的Watch功能監聽以/servive/a為前綴的所有Key的變化,如果有新增或者刪除節點Key的事件發生Etcd都會通過WatchChan發送給客戶端,WatchChan在編程語言上的實現就是Go的Channel。

服務注冊

關于Etcd的服務注冊,官方提供的軟件包里并沒有提供統一的注冊函數供調用。那么我們在新增服務節點后怎么把節點的信息存儲到Etcd上并通知給命名解析器呢?在Etcd源碼包的naming/grpc.go里可以發現提供了一個Update方法,這個Update既能執行添加也能執行刪除操作:

func (gr *GRPCResolver) Update(ctx context.Context, target string, nm naming.Update, opts ...etcd.OpOption) (err error) {switch nm.Op {case naming.Add:var v []byteif v, err = json.Marshal(nm); err != nil {return status.Error(codes.InvalidArgument, err.Error())}_, err = gr.Client.KV.Put(ctx, target+"/"+nm.Addr, string(v), opts...)case naming.Delete:_, err = gr.Client.Delete(ctx, target+"/"+nm.Addr, opts...)default:return status.Error(codes.InvalidArgument, "naming: bad naming op")}return err }

服務在啟動完成后可以通過Update方法把自己的服務地址和端口Put到自定義的target為前綴的key里,針對上面圖示里的例子,變量target就應該是我們定義的服務名/service/a。一般在具體實踐里都是自己根據系統的需求封裝Update方法完成服務注冊,以及服務節點Key在Etcd上的定期續租,這塊每個公司的實踐都不一樣,我就不放具體的代碼了,一般續租都是通過Etcd租約里的KeepAlive方法實現的(Lease.KeepAlive)。

服務發現

在注冊完新節點、或者是原來的節點停掉后,客戶端是怎么知道的呢?這塊就需要命名解析器Resolver來幫助實現了,Resolver的作用可以理解為從一個字符串映射到一組IP端口等信息。

gRPC對Resolver的接口定義如下:

type Resolver interface {// Resolve creates a Watcher for target.Resolve(target string) (Watcher, error) }

命名解析器的Resolve方法會返回一個Watcher,這個Watcher可以監聽命名解析器發來的target(類似上面例子里說的與服務名相對應的Key)對應的后端服務器地址信息變化,通知Balancer對自己維護的地址進行動態地增刪。

Watcher接口的定義如下:

//源碼地址 https://github.com/grpc/grpc-go/blob/v1.2.x/naming/naming.go type Watcher interface {Next() ([]*Update, error)// Close closes the Watcher.Close() }

Etcd為這兩個接口都提供了實現:

// 源碼地址:https://github.com/etcd-io/etcd/blob/release-3.3/clientv3/naming/grpc.go// GRPCResolver 實現了grpc的naming.Resolver接口 type GRPCResolver struct {// Client is an initialized etcd client.Client *etcd.Client }func (gr *GRPCResolver) Resolve(target string) (naming.Watcher, error) {ctx, cancel := context.WithCancel(context.Background())w := &gRPCWatcher{c: gr.Client, target: target + "/", ctx: ctx, cancel: cancel}return w, nil }// 實現了grpc的naming.Watcher接口 type gRPCWatcher struct {c *etcd.Clienttarget stringctx context.Contextcancel context.CancelFuncwch etcd.WatchChanerr error }func (gw *gRPCWatcher) Next() ([]*naming.Update, error) {if gw.wch == nil {// first Next() returns all addressesreturn gw.firstNext()}// process new events on target/*wr, ok := <-gw.wchif !ok {...updates := make([]*naming.Update, 0, len(wr.Events))for _, e := range wr.Events {var jupdate naming.Updatevar err errorswitch e.Type {case etcd.EventTypePut:err = json.Unmarshal(e.Kv.Value, &jupdate)jupdate.Op = naming.Addcase etcd.EventTypeDelete:err = json.Unmarshal(e.PrevKv.Value, &jupdate)jupdate.Op = naming.Deletedefault:continue}if err == nil {updates = append(updates, &jupdate)}}return updates, nil }func (gw *gRPCWatcher) firstNext() ([]*naming.Update, error) {// 獲取前綴為gw.target的所有Key的值,放到現有數組里resp, err := gw.c.Get(gw.ctx, gw.target, etcd.WithPrefix(), etcd.WithSerializable())if gw.err = err; err != nil {return nil, err}updates := make([]*naming.Update, 0, len(resp.Kvs))for _, kv := range resp.Kvs {var jupdate naming.Updateif err := json.Unmarshal(kv.Value, &jupdate); err != nil {continue}updates = append(updates, &jupdate)}opts := []etcd.OpOption{etcd.WithRev(resp.Header.Revision + 1), etcd.WithPrefix(), etcd.WithPrevKV()}// watch 監聽這些Key的變化,包括前綴相同的新Key的加入gw.wch = gw.c.Watch(gw.ctx, gw.target, opts...)return updates, nil }func (gw *gRPCWatcher) Close() { gw.cancel() }

這部分GRPCResolver和gRPCWatcher類型的每個方法的功能和起到的作用都和RoundRobin這個gRPC Balancer結合地比較緊密,我準備放到下面和負載均衡的源碼實現一起說明。

負載均衡

首先我們來看一下gRPC對負載均衡的接口定義:

type Balancer interface {Start(target string, config BalancerConfig) errorUp(addr Address) (down func(error))Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error)Notify() <-chan []Address// Close shuts down the balancer.Close() error }

在gRPC 客戶端與服務端之間建立連接時調用的Dail方法里可以用WithBalancer方法在DiaplOption里指定負載均衡組件:

client, err := etcd.Client()...resolver := &naming.GRPCResolver{Client: client}b := grpc.RoundRobin(resolver)opt0 := grpc.WithBalancer(b)grpc.Dial(target, opt0 , opt1, ...) // 后面省略了

上面的例子使用了gRPC自帶的Balancer實現RoundRobin,RoundRobin除了實現了Balancer接口外自己內置了Resolver用來從名字獲取其后綁定的IP信息以及服務的更新事件(增加刪除服務節點這些事件) 。上面的例子里給RoundRobin指定了Etcd提供的name.GRPCResolver做為它的命名解析器,這個命名解析器就是上一節說的Etcd軟件包里提供的gRPCnaming.Resolver接口實現。

RoundRobin

下面我們研究一下gRPC包里提供的RoundRobin代碼實現,主要關注負載均衡和利用Resolver進行服務發現及節點更新這兩個功能的代碼實現原理

RoundRobin結構體定義如下:

// 源碼在:https://github.com/grpc/grpc-go/blob/v1.2.x/balancer.go type roundRobin struct {r naming.Resolverw naming.Watcheraddrs []*addrInfo // 客戶端可以嘗試連接的所有地址mu sync.MutexaddrCh chan []Address // 用于通知gRPC內部的,客戶端可連接地址的信道next int // index of the next address to return for Get()waitCh chan struct{} // the channel to block when there is no connected address availabledone bool // The Balancer is closed. }
  • r是命名解析器,可以定義自己的命名解析器,如Etcd命名解析器。如果r為nil,那么Dial中參數target將直接作為可請求地址添加到addrs中。
  • w是命名解析器Resolve方法返回的watcher,該watcher可以監聽命名解析器發來的地址信息變化,通知roundRobin對addrs中的地址進行動態的增刪。
  • addrs是從命名解析器獲取地址信息數組,數組中每個地址不僅有地址信息,還有gRPC與該地址是否已經創建了ready狀態的連接的標記。
  • addrCh是地址數組的Channel,該Channel會在每次命名解析器發來地址信息變化后,將所有地址更新通知到gRPC內部的lbWatcher,lbWatcher是統一管理地址連接狀態的協程,負責新地址的連接與被刪除地址的關閉操作。
  • next是roundRobin的Index,即輪詢調度遍歷到addrs數組中的哪個位置了。
  • waitCh是當addrs中地址為空時,grpc調用Get()方法希望獲取到一個到target的連接,如果設置了gRPC的failfast為false,那么Get()方法會阻塞在此Channel上,直到有ready的連接。

啟動RoundRobin

啟動RoundRobin就是實現Balancer接口的Start方法,該方法是由一開始通過grpc.WithBalancer把負載均衡器指定給的BalancerWrapperBuilder在創建BalancerWrapper時觸發的:

func (bwb *balancerWrapperBuilder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer {// 這里觸發Balancer的Start方法bwb.b.Start(opts.Target.Endpoint, BalancerConfig{DialCreds: opts.DialCreds,Dialer: opts.Dialer,})_, pickfirst := bwb.b.(*pickFirst)bw := &balancerWrapper{......}cc.UpdateBalancerState(connectivity.Idle, bw)go bw.lbWatcher() // 監聽Balancer 通知過來的地址變化return bw }

Start方法其主要功能就是通過RoundRobin的命名解析器的Resolve方法拿到監聽命名解析器后端變化的Watcher。與此同時還會新建一個addrChan用于向gRPC內部的lbWatcher推送Watcher監聽到的地址變化。

func (rr *roundRobin) Start(target string, config BalancerConfig) error {rr.mu.Lock()defer rr.mu.Unlock()if rr.done {return ErrClientConnClosing}if rr.r == nil {// 如果沒有解析器,那么直接將target加入addrs地址數組rr.addrs = append(rr.addrs, &addrInfo{addr: Address{Addr: target}})return nil}// Resolve接口會返回一個watcher,watcher可以監聽解析器的地址變化w, err := rr.r.Resolve(target)if err != nil {return err}rr.w = w// 創建一個channel,當watcher監聽到地址變化時,通知grpc內部lbWatcher去連接該地址rr.addrCh = make(chan []Address, 1)// go 創建新協程監聽watcher,監聽地址變化。go func() {for {if err := rr.watchAddrUpdates(); err != nil {return}}}()return nil }

創建完addrCh后在Start方法最后會開啟一個goroutine,這個goroutine會不停地循環調用watchAddrUpdates查詢是否有命名解析器的Watcher傳遞過來的更新。

監聽服務端地址的更新

在watchAddrUpdates方法里就是通過上面Start方法里創建的Resolver Watcher的Next方法來監聽Etcd上后端服務節點的更新,這個Watcher的實現就是上面服務發現章節里說的Etcd軟件包里提供的gRPCWatcher類型,它的Next方法里會去通過監聽Etcd上由服務名組成的Key的變化,然后在這里把這些信息傳遞給上面Start方法里創建好的addrChan通道。

func (rr *roundRobin) watchAddrUpdates() error {// watcher的next方法會阻塞,直至有地址變化信息過來,updates即為變化信息updates, err := rr.w.Next()if err != nil {return err}// 對于addrs地址數組的操作,顯然是要加鎖的,因為有多個goroutine在同時操作rr.mu.Lock()defer rr.mu.Unlock()for _, update := range updates {addr := Address{Addr: update.Addr,Metadata: update.Metadata,}switch update.Op {case naming.Add://對于新增類型的地址,注意這里不會重復添加。var exist boolfor _, v := range rr.addrs {if addr == v.addr {exist = truebreak}}if exist {continue}rr.addrs = append(rr.addrs, &addrInfo{addr: addr})case naming.Delete://對于刪除的地址,直接在addrs中刪除就行了for i, v := range rr.addrs {if addr == v.addr {copy(rr.addrs[i:], rr.addrs[i+1:])rr.addrs = rr.addrs[:len(rr.addrs)-1]break}}default:grpclog.Errorln("Unknown update.Op ", update.Op)}}// 這里復制了整個addrs地址數組,然后丟到addrCh channel中通知grpc內部lbWatcher,// lbWatcher會關閉刪除的地址,連接新增的地址。// 連接ready后會有專門的goroutine調用Up方法修改addrs中地址的狀態。open := make([]Address, len(rr.addrs))for i, v := range rr.addrs {open[i] = v.addr}if rr.done {return ErrClientConnClosing}select {case <-rr.addrCh:default:}rr.addrCh <- openreturn nil }

建立連接

Up方法是gRPC內部負載均衡的watcher調用的,該watcher會讀全局的連接狀態隊列,改變RoundRobin維護的連接列表的里連接的狀態 (會有單獨的goroutine向目標服務發起連接嘗試,嘗試成功后才會把連接對象的連接狀態改為connected),如果是已連接狀態的連接 ,會調用Up方法來改變addrs地址數組中該地址的狀態為已連接。

func (rr *roundRobin) Up(addr Address) func(error) {rr.mu.Lock()defer rr.mu.Unlock()var cnt int//將地址數組中的addr置為已連接狀態,這樣這個地址就可以被client使用了。for _, a := range rr.addrs {if a.addr == addr {if a.connected {return nil}a.connected = true}if a.connected {cnt++}}// 當有一個可用地址時,之前可能是0個,可能要很多client阻塞在獲取連接地址上,這里通知所有的client有可用連接啦。// 為什么只等于1時通知?因為可用地址數量>1時,client是不會阻塞的。if cnt == 1 && rr.waitCh != nil {close(rr.waitCh)rr.waitCh = nil}//返回禁用該地址的方法return func(err error) {rr.down(addr, err)} }

關閉連接

關閉連接使用的是Down方法,這個方法就簡單, 直接找到addr置為不可用就行了。

func (rr *roundRobin) down(addr Address, err error) {rr.mu.Lock()defer rr.mu.Unlock()for _, a := range rr.addrs {if addr == a.addr {a.connected = falsebreak}} }

客戶端獲取連接

客戶端在調用gRPC具體Method的Invoke方法里,會去RoundRobin的連接池addrs里獲取連接,如果addrs為空,或者addrs里的地址都不可用,Get()方法會返回錯誤。但是如果設置了failfast = false,Get()方法會阻塞在waitCh這個通道上,直至Up方法給到通知,然后輪詢調度可用的地址。

func (rr *roundRobin) Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) {var ch chan struct{}rr.mu.Lock()if rr.done {rr.mu.Unlock()err = ErrClientConnClosingreturn}if len(rr.addrs) > 0 {// addrs的長度可能變化,如果next值超出了,就置為0,從頭開始調度。if rr.next >= len(rr.addrs) {rr.next = 0}next := rr.next//遍歷整個addrs數組,直到選出一個可用的地址for {a := rr.addrs[next]// next值加一,當然是循環的,到len(addrs)后,變為0next = (next + 1) % len(rr.addrs)if a.connected {addr = a.addrrr.next = nextrr.mu.Unlock()return}if next == rr.next {// 遍歷完一圈了,還沒找到,走下面邏輯break}}}if !opts.BlockingWait { //如果是非阻塞模式,如果沒有可用地址,那么報錯if len(rr.addrs) == 0 {rr.mu.Unlock()err = status.Errorf(codes.Unavailable, "there is no address available")return}// Returns the next addr on rr.addrs for failfast RPCs.addr = rr.addrs[rr.next].addrrr.next++rr.mu.Unlock()return}// Wait on rr.waitCh for non-failfast RPCs.// 如果是阻塞模式,那么需要阻塞在waitCh上,直到Up方法給通知if rr.waitCh == nil {ch = make(chan struct{})rr.waitCh = ch} else {ch = rr.waitCh}rr.mu.Unlock()for {select {case <-ctx.Done():err = ctx.Err()returncase <-ch:rr.mu.Lock()if rr.done {rr.mu.Unlock()err = ErrClientConnClosingreturn}if len(rr.addrs) > 0 {if rr.next >= len(rr.addrs) {rr.next = 0}next := rr.nextfor {a := rr.addrs[next]next = (next + 1) % len(rr.addrs)if a.connected {addr = a.addrrr.next = nextrr.mu.Unlock()return}if next == rr.next {// 遍歷完一圈了,還沒找到,可能剛Up的地址被down掉了,重新等待。break}}}// The newly added addr got removed by Down() again.if rr.waitCh == nil {ch = make(chan struct{})rr.waitCh = ch} else {ch = rr.waitCh}rr.mu.Unlock()}} }

總結

整個gRPC基于Etcd實現服務注冊/發現以及負載均衡的流程和關鍵的源碼實現就梳理完了,其實源碼實現的細節遠比我這里列舉的要復雜,這篇文章的目的也是希望能記錄下一學習和實踐gRPC的負載均衡和服務解析時的一些關鍵路徑。另外需要注意的是本文里使用的是gRPC v1.2.x的代碼,在1.3版本后官方包重新調整了目錄和包名,與本文里列舉的源碼以及Balancer的使用上都會有些出入,不過原理還是大致一樣的,只不過每一版都一直在此基礎上演進。

看到這里了,如果喜歡我的文章可以幫我點個贊,我會每周通過技術文章分享我的所學所見和第一手實踐經驗,感謝你的支持。微信搜索關注公眾號「網管叨bi叨」第一時間獲取我的文章推送。

總結

以上是生活随笔為你收集整理的e盾服务端源码_gRPC服务注册发现及负载均衡的实现方案与源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

99一区二区三区 | 精品欧美一区二区三区久久久 | 成人h电影 | 久久极品| 91av短视频 | 91成人精品 | 中文字幕观看av | 中文字幕精品一区 | 国产电影黄色av | 亚洲日本一区二区在线 | 久久久久日本精品一区二区三区 | 色婷丁香 | 成人av电影在线 | 免费观看十分钟 | 欧美一区二区三区在线视频观看 | 操操操天天操 | 日韩精品短视频 | 婷婷色伊人 | 日日干网址| 麻豆国产在线播放 | 中文字幕在线观看免费 | 欧美日韩国产一区 | 日本公妇在线观看高清 | 日韩中文三级 | 亚洲四虎影院 | 亚洲色图色| 国产一区二区三区在线免费观看 | 在线观看黄色 | 久久免费影院 | 国产 成人 久久 | 久久久久久久久久免费 | 国产成人福利片 | 极品国产91在线网站 | 国产精品一区二区久久精品爱涩 | 在线观看免费黄视频 | 69视频永久免费观看 | 亚洲成人精品在线观看 | 最近字幕在线观看第一季 | 久久久国产影院 | 天堂av观看 | 少妇搡bbbb搡bbb搡aa | 国产一卡久久电影永久 | 亚洲最新av网址 | 成人影片在线免费观看 | www.久草视频 | 曰本免费av | 日韩电影中文字幕在线观看 | 亚洲综合欧美日韩狠狠色 | 91大神dom调教在线观看 | 在线观看日韩免费视频 | 69精品在线 | 欧美91视频 | 免费观看av | 婷婷精品国产一区二区三区日韩 | 国产精品久久久久久五月尺 | av在线免费网站 | 热久久国产 | bbb搡bbb爽爽爽 | 国产精品嫩草69影院 | 狠狠狠狠狠狠狠狠干 | 久久久国产99久久国产一 | 欧美一区日韩精品 | 免费观看一区二区三区视频 | 欧美黑人巨大xxxxx | 国产一区二区三区网站 | 日韩区视频 | 中文字幕乱码电影 | 中文字幕国产精品一区二区 | 国产专区精品 | 久久av网址 | 欧日韩在线视频 | 国产一区二区三区四区在线 | 日本中文字幕在线视频 | 久久亚洲专区 | 成人黄在线 | 婷婷丁香在线观看 | 99婷婷狠狠成为人免费视频 | 久草精品视频在线观看 | 日韩av成人在线观看 | 日韩高清成人 | 久久a级片 | 国产一级久久久 | 在线韩国电影免费观影完整版 | 久久亚洲区 | 在线免费观看一区二区三区 | 中文字幕资源网 国产 | 色诱亚洲精品久久久久久 | 久久免费在线观看视频 | 精品久久久网 | 精品久久九九 | 久草在线中文视频 | 97国产在线播放 | 日本午夜免费福利视频 | 日韩精品不卡 | 国产美女精品视频 | 久青草视频在线观看 | 久久精品中文 | av电影免费在线看 | 97品白浆高清久久久久久 | 最新日韩视频 | 日韩精品中文字幕一区二区 | 999久久国产精品免费观看网站 | av黄色成人 | 99精品久久99久久久久 | 国产破处在线播放 | 免费在线一区二区 | 日韩黄色中文字幕 | 亚洲精品一区二区18漫画 | 91天堂影院 | 国产高清视频免费在线观看 | 粉嫩一区二区三区粉嫩91 | 一区二区视频在线看 | 一区二区三区在线免费观看视频 | 成人av中文字幕在线观看 | 国产精品日韩高清 | 日韩免费av在线 | 色婷婷久久 | 亚洲午夜久久久久 | 最新日韩在线 | 久久久久成人精品 | 婷婷5月激情5月 | 欧美一级久久久久 | 色综合久久久网 | 婷婷av色综合 | 日韩欧美在线视频一区二区三区 | 国产成人精品999在线观看 | 天天操夜夜操夜夜操 | 中文字幕视频网站 | 五月综合激情 | 国内精品久久久久久久久 | 国产成人精品午夜在线播放 | 996久久国产精品线观看 | 国产视频一区二区在线 | 国产精品免费观看久久 | 最近中文字幕国语免费高清6 | 日本精品二区 | 婷婷六月天丁香 | 天天天天天天干 | 国产黄在线 | 亚洲久草网 | 日韩欧在线 | 99热国产在线 | 91九色自拍 | 日韩精品一区二区三区不卡 | 婷婷丁香导航 | 99久久国产免费,99久久国产免费大片 | 五月花婷婷 | 99色人 | 中文字幕一区二区在线观看 | 中日韩三级视频 | 看av免费| 日韩精品中文字幕av | 亚洲精品一区二区网址 | 中文字幕综合在线 | 深爱激情亚洲 | 天天色天天干天天色 | 日本久久高清视频 | 91网址在线观看 | 国产精品永久久久久久久久久 | 久久香蕉一区 | 中文在线a√在线 | 美女网站色在线观看 | 久久伊人婷婷 | 五月天六月婷婷 | 一区二区不卡高清 | 日本久久综合网 | 日韩三级视频在线观看 | 69av在线视频 | 久久久久久久久久久久影院 | 97超碰国产精品女人人人爽 | 久久久久久久久艹 | 中文字幕在线成人 | 97激情影院 | 波多野结衣最新 | 这里只有精品视频在线观看 | 久久精品99国产精品 | 中文字幕最新精品 | 国产精品久久久久久久久搜平片 | 欧美日韩一区二区三区视频 | 天天草天天爽 | 国产精品a成v人在线播放 | 国产你懂的在线 | 九九热免费视频在线观看 | 久久免费视频在线观看6 | 五月婷婷av| 久久大片| 亚洲日本成人网 | 2019精品手机国产品在线 | 五月天亚洲综合 | 国产91影院| 免费在线观看一区二区三区 | 亚洲免费国产 | 久久丁香 | 久草视频精品 | 久久综合狠狠狠色97 | 精品在线亚洲视频 | 国产香蕉久久精品综合网 | 日韩欧美电影在线 | 亚洲精品视频偷拍 | 免费又黄又爽 | 国产91欧美 | 欧美大荫蒂xxx | 精品国产乱码一区二区三区在线 | 日韩电影中文,亚洲精品乱码 | 欧美肥妇free | 天天弄天天干 | 69国产盗摄一区二区三区五区 | 日韩免费在线观看视频 | 天天综合亚洲 | 亚洲最大在线视频 | 天天操天天操天天爽 | 亚洲第一伊人 | 成片免费观看视频大全 | 亚洲欧美一区二区三区孕妇写真 | 91视频 - 88av | 日韩一级黄色片 | 久久成人18免费网站 | 国产精品久久久久久久久搜平片 | 一区二区三区免费看 | 中文字幕永久在线 | 国产色啪 | 精品夜夜嗨av一区二区三区 | 日韩欧美精品在线观看视频 | 亚洲欧美观看 | 日日摸日日添夜夜爽97 | www.天天干.com | 激情片av| 综合精品在线 | www.国产毛片 | 亚洲激情小视频 | 成人中文字幕在线 | 麻豆免费观看视频 | 久久久久久久电影 | 成人九九视频 | 一区二区激情 | 亚洲精品福利视频 | 久草爱视频 | 午夜精品一区二区三区可下载 | 中文字幕av一区二区三区四区 | 欧美日韩一二三四区 | 夜夜夜夜爽 | 奇米网网址 | 久久久久久久久久久综合 | 午夜在线观看 | 久久久免费视频播放 | 高清av网| 福利一区视频 | 欧美精品久久久久久久亚洲调教 | 视频在线国产 | 天天干天天操天天拍 | 五月天婷亚洲天综合网鲁鲁鲁 | 精品国产福利在线 | 激情欧美一区二区三区免费看 | 成人av免费电影 | 国产一区二区久久精品 | 九九精品在线观看 | 色99在线 | 精品国产乱码一区二区三区在线 | 久久久免费播放 | 天堂素人在线 | 97人人澡人人爽人人模亚洲 | 日韩av一区二区在线影视 | 成人av.com | 国产精品久久久一区二区 | 国产精品一区二区果冻传媒 | 久久国产精品99久久久久久丝袜 | 国产精品久久久久久久免费 | 国产精品久久久久久久久软件 | 亚洲国产精品va在线看黑人动漫 | 亚洲高清av在线 | 午夜精品久久一牛影视 | 亚洲精品短视频 | av在线官网| 久久久精选 | 精品国产一区二区三区久久久 | 日韩无在线| 久久综合九色综合97婷婷女人 | 美女精品在线观看 | 青青河边草免费直播 | 99热这里只有精品免费 | 97超碰中文字幕 | 亚洲精品国产精品国自产在线 | 蜜臀av性久久久久av蜜臀妖精 | 欧美精品一区二区免费 | 久草综合视频 | 香蕉视频18 | 欧美综合久久 | 九九导航| 91亚色视频在线观看 | 亚洲乱码精品久久久 | 免费视频 三区 | 99热这里只有精品久久 | 国产免费成人av | 欧美一级久久久久 | 久青草国产在线 | 奇米导航 | 国产无遮挡猛进猛出免费软件 | 蜜臀久久99精品久久久酒店新书 | 国产精品一区专区欧美日韩 | av网站手机在线观看 | 一本—道久久a久久精品蜜桃 | 黄色软件大全网站 | 国产成人精品区 | 亚洲欧美乱综合图片区小说区 | 午夜.dj高清免费观看视频 | 成人av在线影视 | 中文字幕日本在线观看 | 日韩免费在线视频观看 | 亚洲性视频| 欧美黑人xxxx猛性大交 | 色吊丝在线永久观看最新版本 | 日本久久91 | 人人爱在线视频 | 91丨九色丨蝌蚪丨对白 | 成人黄大片 | 精品久久久久久亚洲综合网站 | 久久久久国产精品免费网站 | 中文字幕免费高清av | 色橹橹欧美在线观看视频高清 | 成人在线免费看视频 | 国产精品 国内视频 | 西西www4444大胆在线 | 日韩一区二区三区免费电影 | 999国产| 色综合久久久久久中文网 | 国产一区二区综合 | 精品免费在线视频 | 91porny九色在线播放 | 亚洲欧洲精品一区二区 | 国产网红在线 | 中文字幕在线观看视频网站 | 亚洲精品视频在线免费 | 亚洲精品国产精品乱码不99热 | 激情av五月婷婷 | 日韩乱码中文字幕 | 国产91大片| 久久久91精品国产一区二区三区 | 黄色免费网站 | 婷婷久久网| 丁香婷婷激情网 | 99精品在线观看视频 | 成年人在线观看免费视频 | 日韩欧美精品免费 | 成人黄在线观看 | 国产精品短视频 | 国产精品网在线观看 | 国产精品中文字幕av | 免费高清在线观看成人 | 精品亚洲免a | 91chinese在线| 国产精品麻豆99久久久久久 | 成人高清在线观看 | www.com.日本一级 | 麻豆视频大全 | 亚洲婷婷伊人 | 一区二区三区免费在线观看 | 久久久久久综合网天天 | 99精品国产高清在线观看 | 人人狠狠综合久久亚洲婷 | 爱情影院aqdy鲁丝片二区 | 手机av在线网站 | 4p变态网欧美系列 | 成人av电影在线播放 | 国产精品网站一区二区三区 | 成人在线观看你懂的 | 在线免费观看国产黄色 | 国产精品美女www爽爽爽视频 | 欧美一二三区播放 | 91亚洲国产成人久久精品网站 | 天天操 夜夜操 | 国产中文在线播放 | 久久热首页 | 亚洲精品乱码久久久久久 | 日韩爱爱片 | av888.com| 九九交易行官网 | 免费在线观看91 | 日韩av一区二区在线影视 | 人人玩人人添人人澡超碰 | 天天插天天狠天天透 | 最近中文国产在线视频 | 国产精品毛片久久久久久 | 91一区二区三区在线观看 | 免费av在线播放 | 二区视频在线观看 | 日韩在线一区二区免费 | 久久久受www免费人成 | 久久理论影院 | 日韩av片免费在线观看 | av官网在线| 免费三级大片 | 精品视频123区在线观看 | 天天操天天玩 | 亚洲国产精品资源 | 在线国产小视频 | 午夜精品一区二区三区在线 | 久草com| 国产精品久久毛片 | 婷婷看片| 香蕉久草在线 | 日韩在线视 | 日韩精品久久久久久久电影99爱 | 免费污片 | 午夜免费福利视频 | 久久免费精彩视频 | 久久激情小视频 | 欧美日韩激情视频8区 | 一区二区在线影院 | 免费欧美精品 | 天天操,夜夜操 | 99久久毛片 | 国产一区二区在线影院 | a视频在线看 | 国产乱码精品一区二区蜜臀 | 婷婷久久亚洲 | www.综合网.com| 国产在线a | 99精品视频在线免费观看 | 国产1区2 | 在线观看日韩视频 | www亚洲国产 | 激情五月综合网 | 国产精品久久久久久一区二区 | 日韩资源在线观看 | 亚洲免费精彩视频 | 操操操影院 | 国产精品一区一区三区 | 亚洲 精品在线视频 | 在线日本v二区不卡 | 亚洲一区视频在线播放 | 91网站观看 | 啪啪精品 | 午夜色影院 | 丁香激情综合 | 99精品在线观看 | 天天色.com | 久久精品国产精品 | 国产在线精品一区二区不卡了 | av观看免费在线 | 欧美精品一区二区在线观看 | 国产一级a毛片视频爆浆 | 狠狠操影视 | 99精品欧美一区二区三区黑人哦 | 91成人免费在线视频 | 九九交易行官网 | 91天天操 | 日韩免费视频一区二区 | 国产盗摄精品一区二区 | 午夜久操 | 午夜国产一区 | 免费看一级特黄a大片 | 午夜视频在线观看一区 | 成人毛片a | 国产精品九九久久久久久久 | 国产精品18毛片一区二区 | 国产精品久久人 | 国产成人一区二区三区影院在线 | 国产一级二级在线观看 | 91成人看片 | 香蕉视频4aa| 欧美精品久久天天躁 | 亚洲国产日韩欧美 | 欧美精选一区二区三区 | 国产精品video爽爽爽爽 | 九色视频网 | av网站免费线看精品 | 精品国产一区二区三区四区vr | 久久久视屏| 激情动态| 奇米影视777四色米奇影院 | 91av精品| 人人揉人人揉人人揉人人揉97 | 欧洲视频一区 | 中文字幕区 | 亚洲第一中文网 | 午夜精品导航 | 超薄丝袜一二三区 | 精品国产一区二区三区免费 | 色多多污污在线观看 | 天堂久久电影网 | 中文字幕在线播放第一页 | 久草在线最新 | 亚洲免费色 | 视频一区二区三区视频 | 成人免费在线电影 | 国产精品久久久久久久久久尿 | 日韩免费在线观看 | 999ZYZ玖玖资源站永久 | 欧美另类z0zx | 在线免费观看的av网站 | 九九99 | 欧美精品三级在线观看 | 91成人精品一区在线播放69 | 免费开视频 | 日韩亚洲精品电影 | 久久综合精品国产一区二区三区 | 精品一区 在线 | 国产一级电影在线 | 国产裸体视频bbbbb | 欧美一区二区伦理片 | 国产一级片一区二区三区 | 在线观看一区二区精品 | 蜜臀av夜夜澡人人爽人人 | 国产黄免费在线观看 | 欧美91精品 | 天天综合久久 | 狠狠狠狠狠狠狠干 | 亚洲在线成人精品 | 久久免费电影网 | 91一区二区三区在线观看 | 美女一级毛片视频 | 人人爽人人爽人人片av免 | 13日本xxxxxⅹxxx20 | 午夜视频在线瓜伦 | 国产亚洲精品久久久久动 | 日日干 天天干 | 国产精品免费在线播放 | 久久久久久久久久久电影 | 国产91免费观看 | 亚洲伊人色 | 亚洲免费精品一区二区 | 中文字幕亚洲欧美日韩 | 国产人免费人成免费视频 | 欧美日韩在线电影 | 久久久黄色av | 中文字幕日韩免费视频 | 91中文视频 | www欧美色 | 色婷五月 | 欧美另类交在线观看 | 日韩三级视频在线观看 | 久草在线视频新 | 国内揄拍国产精品 | 成人免费观看完整版电影 | www激情网 | 婷婷丁香自拍 | 久久社区视频 | 欧美性另类 | 在线观看免费高清视频大全追剧 | 在线日韩av | 成年免费在线视频 | 亚洲欧洲日韩在线观看 | 中文字幕第一页av | 国产成人99久久亚洲综合精品 | 草久在线播放 | 亚洲成av人电影 | 亚洲国产三级在线观看 | 色综合天天综合在线视频 | 天天摸天天操天天爽 | 久久er99热精品一区二区三区 | 亚洲天天在线 | 91香蕉视频色版 | 一区二区三区在线播放 | 精品黄色片 | 波多野结衣一区二区三区中文字幕 | 综合天天久久 | 国产高清在线不卡 | 亚洲热久久 | 麻豆极品| 成年人在线播放视频 | 午夜精品一区二区国产 | 久久久av免费 | 久久久久免费精品 | 91在线成人 | av线上看 | 国产精品ssss在线亚洲 | av永久网址 | 丁香五月缴情综合网 | 日日夜夜精品免费观看 | 久久情侣偷拍 | 精品久久久久久久久久久久久 | 狠狠色噜噜狠狠狠狠 | 91漂亮少妇露脸在线播放 | 四虎最新域名 | 日韩精品一二三 | 天天做日日爱夜夜爽 | 97夜夜澡人人爽人人免费 | 天天色成人 | 蜜臀久久99精品久久久无需会员 | 中文字幕在线乱 | 久久玖 | 国内少妇自拍视频一区 | av中文字幕在线看 | 日韩欧美一区视频 | 一区二区三区电影在线播 | 日日干夜夜操视频 | 99久久精品免费看国产四区 | 精品国产一区二区三区在线观看 | 精品在线播放视频 | 天天曰夜夜操 | 九九久 | 碰超在线观看 | 美女一级毛片视频 | 8x成人免费视频 | 日本精品一区二区三区在线播放视频 | 成人在线免费看 | 三上悠亚一区二区在线观看 | 欧美一区二区三区免费看 | 国产乱老熟视频网88av | 激情丁香在线 | 不卡国产在线 | 亚州视频在线 | 亚洲天堂网在线观看视频 | 久久高视频 | 欧美日本一区 | 亚洲精品高清在线 | 精品久久精品 | 久久久免费观看 | 欧美成天堂网地址 | 国产尤物视频在线 | 97免费视频在线播放 | 缴情综合网五月天 | 午夜色性片 | 日韩免费三级 | 久久婷婷国产色一区二区三区 | 亚洲午夜精品一区二区三区电影院 | 亚洲精品乱码久久久久久9色 | av电影一区二区三区 | 精品在线观看一区二区三区 | 国产1级毛片 | 91av电影在线观看 | 99久久综合精品五月天 | 伊人激情综合 | 九九色视频 | 色婷婷午夜| 欧美成人视 | 亚洲精品99久久久久久 | 亚洲国内精品视频 | 国产精品乱码一区二区视频 | 国产日韩精品在线 | 美腿丝袜一区二区三区 | 久久无码av一区二区三区电影网 | 欧美成人基地 | 五月婷婷综合色拍 | 中文字幕日韩av | 91精品免费| 午夜电影 电影 | 性色av香蕉一区二区 | 欧美福利片在线观看 | 二区在线播放 | 成人av免费在线 | 综合色站导航 | 国产精品短视频 | 中文视频在线播放 | 久久久久久片 | 日本久久久久久科技有限公司 | 亚洲最新av在线网址 | 国产黄色片免费观看 | 日本在线观看一区二区三区 | 中午字幕在线 | 综合伊人av | 在线观看日韩 | 国产在线一区二区三区播放 | av中文字幕av| 免费看的黄网站软件 | 91在线看黄 | 在线看成人 | 婷婷 中文字幕 | 欧美在线视频第一页 | 天天操天天射天天爱 | 97超碰精品 | 国产破处在线播放 | 女人魂免费观看 | 国产精品尤物视频 | 91精品老司机久久一区啪 | 欧美激情视频一区二区三区 | 日韩综合精品 | 国产精品欧美激情在线观看 | 久久视频这里只有精品 | 国产.精品.日韩.另类.中文.在线.播放 | 精品一区二区综合 | 人人澡人人草 | 美国av片在线观看 | 国产亚洲久一区二区 | 国产成人精品一区二区三区福利 | 免费观看www7722午夜电影 | 人人超碰在线 | 久久超| 国产精品人成电影在线观看 | 亚洲欧美日韩精品久久久 | 激情狠狠干| 国产成在线观看免费视频 | 日本中文字幕电影在线免费观看 | 精品亚洲一区二区三区 | 国产高清视频在线播放 | 国产免费中文字幕 | 人人揉人人揉人人揉人人揉97 | 粉嫩aⅴ一区二区三区 | 日韩欧美视频在线免费观看 | 九草在线观看 | 中文字幕在线视频一区二区三区 | 色婷婷视频网 | 国产精品片 | 69国产精品视频 | 日韩伦理片hd | 日韩天堂网 | 黄色a在线观看 | 97超碰伊人 | 中文在线中文资源 | 精品在线不卡 | wwwwww黄| 韩国av免费在线观看 | 色狠狠婷婷 | 区一区二区三区中文字幕 | 国产伦理久久精品久久久久_ | 免费黄色激情视频 | 在线视频欧美日韩 | 亚洲精品在线观看免费 | 久草视频手机在线 | 国产精品免费大片视频 | 精品uu | 久久久免费观看完整版 | 亚洲成av人影院 | 在线91网 | 亚洲精品视频免费 | 日韩大片免费观看 | 日韩影视在线观看 | 国产精品黑丝在线观看 | 国产视频一级 | 久久精品一级片 | 国产成人免费av电影 | 日韩精品一区二区三区三炮视频 | 干干夜夜 | 国产伦理久久 | 久久人人97超碰国产公开结果 | 天天碰天天操视频 | 狠狠操狠狠干2017 | 97电影院网 | 亚洲精品免费在线 | 天天躁日日躁狠狠躁 | 天天插夜夜操 | 欧美精品三级在线观看 | 夜色成人网 | 精品国偷自产国产一区 | 久草在线国产 | 91视频首页 | 国产在线观看高清视频 | 69xx视频| 国产手机av在线 | 亚洲国产精品第一区二区 | 欧美日韩一区二区三区在线观看视频 | 免费在线成人 | 亚洲干视频在线观看 | 国产精品美女久久久久久免费 | 亚洲专区在线视频 | 日批视频国产 | 国产精品v欧美精品v日韩 | 国产精品一区二区电影 | 涩涩网站在线 | 久久99精品久久久久久清纯直播 | 国产精品一区二区麻豆 | 日狠狠| 亚洲精品视频一二三 | 激情久久五月 | 天天操天天色天天射 | 国产二级视频 | 国内精品久久久久久久久久久久 | 四虎在线免费观看视频 | 日本在线观看黄色 | 精品视频免费在线 | 超碰国产在线播放 | 99综合影院在线 | 国产成人久久精品77777综合 | 91亚瑟视频 | 亚洲国内精品在线 | 婷婷激情5月天 | 99热这里只有精品1 av中文字幕日韩 | 国产精品一区二区在线免费观看 | 热久久这里只有精品 | 欧美一级电影免费观看 | 日韩av影视 | 91成年人网站 | 日韩有码中文字幕在线 | 91男人影院 | 啪啪小视频网站 | 精品91| 中文字幕乱在线伦视频中文字幕乱码在线 | av成人免费观看 | 麻豆国产精品va在线观看不卡 | 人人舔人人插 | 91在线国产观看 | 99麻豆视频 | 中文字幕一区二区三区久久蜜桃 | 国产精品中文 | av福利在线看 | 在线 国产一区 | 亚洲精品www久久久久久 | 精品国产自在精品国产精野外直播 | 在线观看色网 | 成人国产精品一区二区 | av亚洲产国偷v产偷v自拍小说 | 国产 日韩 在线 亚洲 字幕 中文 | 久草在线手机观看 | 中文字幕中文字幕中文字幕 | 久久精品在线免费观看 | 欧产日产国产69 | 韩国精品福利一区二区三区 | 久久a v电影| 香蕉网在线 | 高清av中文在线字幕观看1 | 在线精品一区二区 | 不卡电影免费在线播放一区 | 麻豆视频免费入口 | 男女全黄一级一级高潮免费看 | 久久av网址 | 男女视频国产 | 精品毛片一区二区免费看 | 人人舔人人射 | 精品视频一区在线 | 国产录像在线观看 | 天天天天天干 | 亚洲一级电影 | 国产精品久久电影网 | 国产三级精品三级在线观看 | 久草免费福利在线观看 | 日日操夜 | 在线亚洲天堂网 | 日韩二区三区 | 欧洲亚洲激情 | 国产免费不卡av | 亚洲激情在线 | 99在线看| 国产精品成久久久久 | 欧美性色19p | 999久久| 五月天激情电影 | 亚在线播放中文视频 | 热99久久精品| 狠狠色丁香婷婷综合最新地址 | 国产精品手机在线播放 | 五月天亚洲精品 | 天天天色综合 | 久久撸在线视频 | 亚洲国产精品久久久久久 | 欧美国产视频在线 | 在线免费日韩 | 久久久www | 免费毛片一区二区三区久久久 | 国产分类视频 | 黄色一级大片在线免费看国产一 | 久热电影 | 国产成人免费网站 | 成人91在线| 人人干干人人 | 亚洲小视频在线 | 免费黄色在线网站 | 精品免费在线视频 | 欧亚日韩精品一区二区在线 | 日本精品一区二区在线观看 | 中文在线免费一区三区 | 久久国产精品小视频 | 欧美精品久久人人躁人人爽 | av一级久久 | 国产理论片在线观看 | 亚洲视频 一区 | 日韩在线观看影院 | 亚州av成人 | 久久久国产精品亚洲一区 | 色停停五月天 | 五月天色中色 | 久久久久国产精品午夜一区 | 亚洲最大成人免费网站 | 国产精品亚洲人在线观看 | 久久免费看片 | 成人app在线播放 | 高清在线观看av | 成人av一区二区兰花在线播放 | 视频三区 | 国产黄色免费观看 | 久久精品永久免费 | 国产精品手机在线播放 | 天天se天天cao天天干 | 黄色免费观看网址 | www色网站 | 在线观看久久 | 国产一二区精品 | 中文字幕高清av | 又黄又爽免费视频 | 天天天干 | 国产视频 亚洲精品 | 日韩美在线| 日韩免费av片 | 久久久久成人精品 | 国产一级特黄电影 | 欧美精品久久久久久久久免 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 高清久久久| 久久视频二区 | 天天操天天干天天 | 国产一二区在线观看 | 美女视频黄免费 | www.久久久| 免费97视频 | 最近中文字幕大全中文字幕免费 | 91成人在线视频 | 久久久久在线观看 | 亚洲成人黄色网址 | 最近日本字幕mv免费观看在线 | 日本久久精品视频 | 天天狠狠操| 在线日韩| av久久在线 | 亚洲国产精品影院 | 乱男乱女www7788 | 欧美国产精品久久久久久免费 | av在线影视 | 婷婷国产精品 | 久久免费视频8 | 精品久久久久久一区二区里番 | 免费91麻豆精品国产自产在线观看 | 伊人婷婷激情 | 久久久久免费视频 | 亚洲美女视频网 | 国产一区在线看 | 国产精品久久久久久久久久直播 | avlulu久久精品| av资源免费看 | 国产精品美 | 日韩av五月天 | 久草视频在线免费看 | 日韩av在线小说 | 黄色在线小网站 | 蜜臀av夜夜澡人人爽人人 | 免费在线观看一级片 | 久久精品国产一区二区三 | 高清不卡一区二区三区 | 操久久免费视频 | 日韩欧美在线免费观看 | 五月婷婷在线观看 | 亚洲美女精品区人人人人 | 99riav1国产精品视频 | www.av在线播放| 亚洲成人av影片 | av中文字幕在线免费观看 | 日本久久精品视频 | 91资源在线| 亚洲国产中文字幕在线观看 | 精品国产精品久久一区免费式 | 国产精品女同一区二区三区久久夜 | 天天干.com | 五月激情丁香婷婷 | av电影在线不卡 | 在线观看国产区 | 亚a在线| 精品国产大片 | 午夜av免费 | 久久视频免费在线 | 国产第一页在线观看 | 91精品办公室少妇高潮对白 | 婷婷在线视频观看 | 特级西西www44高清大胆图片 | 精品亚洲免费 | 久久96国产精品久久99漫画 | 成人精品99 | 国产又黄又猛又粗 | 456成人精品影院 | 黄色网www | 91九色国产在线 | 91九色精品 | 亚洲资源一区 | 欧美电影黄色 | 亚洲综合在线五月天 | av福利网址导航 | 日韩欧美视频免费在线观看 | 久草久草久草久草 | 亚洲成人av影片 | 天天射一射 | 婷婷丁香色 | 国产高清在线精品 | 亚洲精品日韩一区二区电影 | 免费看黄电影 | 午夜精品一区二区三区在线视频 | 一区二区精品视频 | av片在线观看 | 丝袜网站在线观看 | 狠狠色丁香婷婷综合视频 | 亚洲精品理论 | 国产福利91精品 | 狠狠干夜夜操 | 久久久久久综合 | 最新av在线播放 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 日韩午夜电影网 | 综合av在线 | 国产一区二区不卡视频 | 99热在线看 | 久久美女精品 | 就操操久久 | 日本三级中文字幕在线观看 | 天天射成人 | 精品视频 | 国产在线观看你懂得 | 久久综合色婷婷 | 黄色资源在线 | 亚洲永久精品在线观看 | 亚洲精品资源 | 久久视频这里只有精品 | 国产麻豆剧传媒免费观看 |