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

基于Go-Kit的Golang整潔架構實踐

開發 后端
如何用Golang實現簡潔架構?本文介紹了基于Go-Kit實現簡潔架構的嘗試,通過示例介紹了簡潔架構的具體實現。

簡介

Go是整潔架構(Clean Architecture)的完美選擇。整潔架構本身只是一種方法,并沒有告訴我們如何構建源代碼,在嘗試用新語言實現時,認識到這點非常重要。

自從我有了使用Ruby on Rails的經驗后,嘗試了好幾次編寫第一個服務,而且我讀過的大多數關于Go的整潔架構的文章都以一種非Go慣用的方式介紹結構布局。部分原因是這些例子中的包是根據層命名的——controller、model、service等等……如果你有這些類型的包,這是第一個危險信號,告訴你應用程序需要重新設計。在Go中,包名[2]應該描述包提供了什么,而不是包含了什么。

然后我開始了解go-kit,特別是它提供的發貨示例[3],并決定在應用程序中實現相同的結構。后來,當我深入研究整潔架構(Clean Architecture)時,驚喜的發現go-kit方法是多么完美。

本文將介紹使用Go-Kit方法編寫服務是如何符合整潔架構理念的。

整潔架構(Clean Architecture)

整潔架構(Clean Architecture)是由Bob大叔(Robert Martin)創建的一種軟件架構設計。目標是分離關注點[4],允許開發人員封裝業務邏輯,并使其獨立于交付和框架機制。許多架構范例(如Onion和Hexagon架構)也有相同的目標,都是通過將軟件劃分成層來實現解耦。

圓圈中的箭頭表示依賴規則。如果在外部循環中聲明了某些內容,則不得在內部循環代碼中引用。它既適用于實際的源代碼依賴關系,也適用于命名。內層不依賴于任何外層。

外層包含低級組件,如UI、DB、傳輸或任何第三方服務,都可以被認為是應用程序的細節或插件。其思想是,外層的變化一定不會引起內層的任何變化。

不同模塊/組件之間的依賴關系可以描述如下:

請注意,跨越邊界的箭頭只指向一個方向,邊界后面的組件屬于外層,包括controller、presenter和database。Interactor是實現BL的地方,可以將其視為用例層。

請注意Request Model和Response Model。這些對象分別描述了內層需要和返回的數據。controller將請求(在web的情況下是HTTP請求)轉換為請求模型(Request Model),presenter將響應模型(Response Model)格式化為可以由視圖模型(View Model)呈現的數據。

還要注意接口,用于反轉控制流以與依賴規則相對應。Interactor通過Boundary接口與presenter對話,并通過Entity Gateway接口與數據層對話。

這是整潔架構的主要思想,通過依賴注入分離不同的層,使用依賴反轉反轉控制流。Interactor(BL)和實體對傳輸和數據層一無所知。這一點很重要,因為如果我們改變了外層細節,內層就不會發生級聯變化。

什么是Go-Kit?

Go kit[5]是包的集合,可以幫助我們構建健壯、可靠、可維護的微服務。

對于來自Ruby on Rails的我來說,重要的是Go-Kit不是MVC框架。相反,它將應用程序分為三層:

  • Transport(傳輸)
  • Endpoint(端點)
  • Service(服務)

1.Transport

傳輸層是唯一熟悉交付機制(HTTP、gRPC、CLI…)的組件,這一點非常強大,因為我們可以通過提供不同的傳輸層來同時支持HTTP和CLI。

稍后我們將看到傳輸層是如何對應于上圖中的controller和presenter的。

2.Endpoint

type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error)

端點層表示應用程序中的單個RPC,將交付連接到BL。這是根據輸入和輸出實際定義用例的地方,在整潔架構術語中是Request Model和Response Model。

注意,端點是接收請求并返回響應的函數,都是interface{},是RequestModel和ResponseModel。理論上也可以用類型參數(泛型)來實現。

3.Service

服務層(interactor)是實現BL的地方。服務層不知道端點層,服務層和端點層都不知道傳輸域(比如HTTP)。

Go-Kit提供了創建服務器(HTTP服務器/gRPC服務器等)的功能。例如HTTP:

package http // under go-kit/kit/transport/http

type DecodeRequestFunc func(context.Context, *http.Request) (request interface{}, err error)
type EncodeResponseFunc func(context.Context, http.ResponseWriter, interface{}) error

func NewServer(
  e endpoint.Endpoint,
  dec DecodeRequestFunc,
  enc EncodeResponseFunc,
  options ...ServerOption,
) *Server
  • DecodeRequestFunc將HTTP請求轉換為Request Model,并且
  • EncodeResponseFunc格式化Response Model并將其編碼到HTTP響應中。
  • 返回的*server實現http.Server(有ServeHTTP方法)。

傳輸層使用這個函數來創建http.Server,解碼器和編碼器在傳輸中定義,端點在運行時初始化。

簡短示例:(基于發貨示例[6])

簡易服務

我們將描述一個具有兩個API的簡單服務,用于從數據層創建和讀取文章,傳輸層是HTTP,數據層只是一個內存映射。可以在這里找到GitHub源代碼[7]。

注意文件結構:

- inmem
  - articlerepo.go
- publishing
  - transport.go 
  - endpoint.go
  - service.go
  - formatter.go
- article
  - article.go

我們看看如何表示整潔架構的不同層。

  • article —— 這是實體層,不包含BL、數據層或傳輸層的知識。
  • inmem —— 這是數據層。
  • transport —— 這是傳輸層。
  • endpoint+service —— 組成了邊界+交互器。

從服務開始:

import (
  "context"
  "fmt"
  "math/rand"
 
  "github.com/OrenRosen/gokit-example/article"
)

type ArticlesRepository interface {
   GetArticle(ctx context.Context, id string) (article.Article, error)
   InsertArticle(ctx context.Context, thing article.Article) error
}

type service struct {
   repo ArticlesRepository
}

func NewService(repo ArticlesRepository) *service {
   return &service{
      repo: repo,
   }
}

func (s *service) GetArticle(ctx context.Context, id string) (article.Article, error) {
   return s.repo.GetArticle(ctx, id)
}

func (s *service) CreateArticle(ctx context.Context, artcle article.Article) (id string, err error) {
   artcle.ID = generateID()
   if err := s.repo.InsertArticle(ctx, artcle); err != nil {
      return "", fmt.Errorf("publishing.CreateArticle: %w", err)
   }
   
   return artcle.ID, nil
}

func generateID() string {
  // code emitted
}

服務對交付和數據層一無所知,它不從外層(HTTP、inmem…)導入任何東西。BL就在這里,你可能會說這里沒有真正的BL,這里的服務可能是冗余的,但需要記住這只是一個簡單示例。

實體

package article

type Article struct {
   ID    string
   Title string
   Text  string
}

實體只是一個DTO,如果有業務策略或行為,可以添加到這里。

端點

endpoint.go定義了服務接口:

type Service interface {
   GetArticle(ctx context.Context, id string) (article.Article, error)
   CreateArticle(ctx context.Context, thing article.Article) (id string, err error)
}

然后為每個用例(RPC)定義一個端點。例如,對于獲取文章::

type GetArticleRequestModel struct {
   ID string
}

type GetArticleResponseModel struct {
   Article article.Article
}

func MakeEndpointGetArticle(s Service) endpoint.Endpoint {
   return func(ctx context.Context, request interface{}) (response interface{}, err error) {
      req, ok := request.(GetArticleRequestModel)
      if !ok {
         return nil, fmt.Errorf("MakeEndpointGetArticle failed cast request")
      }
      
      a, err := s.GetArticle(ctx, req.ID)
      if err != nil {
         return nil, fmt.Errorf("MakeEndpointGetArticle: %w", err)
      }
      
      return GetArticleResponseModel{
         Article: a,
      }, nil
   }
}

注意如何定義RequestModel和ResponseModel,這是RPC的輸入/輸出。其思想是,可以看到所需數據(輸入)和返回數據(輸出),甚至無需讀取端點本身的實現,因此我認為端點代表單個RPC。服務具有實際觸發BL的方法,但是端點是RPC的應用定義。理論上,一個端點可以觸發多個BL方法。

傳輸

transport.go注冊HTTP路由:

type Router interface {
   Handle(method, path string, handler http.Handler)
}

func RegisterRoutes(router *httprouter.Router, s Service) {
   getArticleHandler := kithttp.NewServer(
      MakeEndpointGetArticle(s),
      decodeGetArticleRequest,
      encodeGetArticleResponse,
   )
   
   createArticleHandler := kithttp.NewServer(
      MakeEndpointCreateArticle(s),
      decodeCreateArticleRequest,
      encodeCreateArticleResponse,
   )
   
   router.Handler(http.MethodGet, "/articles/:id", getArticleHandler)
   router.Handler(http.MethodPost, "/articles", createArticleHandler)
}

傳輸層通過MakeEndpoint函數在運行時創建端點,并提供用于反序列化請求的解碼器和用于格式化和編碼響應的編碼器。

例如:

func decodeGetArticleRequest(ctx context.Context, r *http.Request) (request interface{}, err error) {
   params := httprouter.ParamsFromContext(ctx)
   return GetArticleRequestModel{
      ID: params.ByName("id"),
   }, nil
}

func encodeGetArticleResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
   res, ok := response.(GetArticleResponseModel)
   if !ok {
      return fmt.Errorf("encodeGetArticleResponse failed cast response")
   }
   
   formatted := formatGetArticleResponse(res)
   w.Header().Set("Content-Type", "application/json")
   return json.NewEncoder(w).Encode(formatted)
}

func formatGetArticleResponse(res GetArticleResponseModel) map[string]interface{} {
  return map[string]interface{}{
    "data": map[string]interface{}{
      "article": map[string]interface{}{
        "id":    res.Article.ID,
        "title": res.Article.Title,
        "text":  res.Article.Text,
      },
    },
  }
}

你可能會問,為什么要使用另一個函數來格式化article,而不是在article實體上添加JSON標記?

這是個非常重要的問題。在article實體上添加JSON標記意味著article知道它是如何格式化的。雖然沒有顯式導入到HTTP,但打破了抽象,使實體包依賴于傳輸層。

例如,假設你想將對客戶端的響應從"title"更改為"header",此更改僅涉及傳輸層。但是,如果此需求導致需要更改實體,則意味著該實體依賴于傳輸層,這就破壞了簡潔架構原則。

我們看看這個簡單應用的依賴關系圖:

哇,你一定注意到了它們的相似性!article實體沒有依賴關系(只有向內箭頭)。外層,transport和inmem,只有指向BL和實體內層的箭頭。

一切都和轉換有關

跨界就是不同層次語言之間的轉換。

BL層只使用應用語言,也就是說,只知道實體(沒有HTTP請求或SQL查詢)。為了跨越邊界,流中的某個組件必須將應用語言轉換為外層語言。

在傳輸層,有解碼器(將HTTP請求轉換為RequestModel的應用語言)和編碼器(將應用語言ResponseModel轉換為HTTP響應)。

數據層實現了repo,在我們的例子中是inmem。在另一種情況下,我們可能會讓sql包負責將應用語言轉換為SQL語言(查詢和原始結果)。

"ing"包

你可能會說傳輸和服務不應該在同一個包中,因為它們位于不同的層,這是一個正確的論點。我從go-kit的shipping例子中取了一個例子,含有這種設計,ing包包含了傳輸/端點/服務,我發現從長遠來看非常方便。話雖如此,如果我現在寫的話,可能會用不同的包。

最后關于"尖叫架構(Screaming Architecture)"的一句話

Go非常適合簡潔架構的另一個原因是包的命名及其思想。尖叫架構(Screaming Architecture) 和構建應用程序有關,以便應用程序的意圖顯而易見。在Ruby On Rails中,當查看結構時,就知道它是用Ruby On Rails框架編寫的(控制器、模型、視圖……)。在我們的應用程序中,當查看結構時,可以看出這是一個關于文章的應用程序,有發布用例,并使用inmem數據層。

總結

簡潔架構只是一種方法,并不會告訴你如何構建源代碼,其實現藝術在于了解所用語言的使用慣例和工具。希望這篇文章對你有所幫助,重要的是要意識到,那些爭論設計問題解決方案的文章并不總是對的,當然也包括這篇

責任編輯:趙寧寧 來源: DeepNoMind
相關推薦

2022-04-18 09:41:14

Go架構設計

2025-03-26 03:20:00

2019-10-11 10:44:30

Go語言數據庫軟件

2022-03-13 23:51:39

Web項目Go

2022-02-27 23:10:26

微服務工具包Golang

2025-06-27 06:38:19

2021-03-19 07:23:23

Go架構Go工程化

2022-09-14 09:27:49

CSS架構代碼

2021-12-24 09:00:43

Go語言進程

2018-04-20 10:38:25

2021-06-09 08:09:05

架構軟件整潔

2019-05-21 10:45:44

Docker架構容器

2022-08-08 13:24:28

整潔架構架構前端

2024-10-21 15:39:24

2023-08-17 10:12:04

前端整潔架構

2017-05-09 12:40:05

2023-09-27 07:28:02

CQRS架構直播房間

2024-03-08 22:39:55

GolangApacheKafka

2025-01-13 06:00:00

Go語言gRPC

2024-04-28 18:24:05

點贊
收藏

51CTO技術棧公眾號

中文字幕免费观看一区| 欧美福利视频| 欧美情侣在线播放| 中文字幕精品一区日韩| 亚洲国产精品一| 老妇喷水一区二区三区| 久久精品国产v日韩v亚洲| jjzz黄色片| 色8久久影院午夜场| 亚洲欧美色综合| 看欧美日韩国产| 97超碰人人草| 国产一区二区三区的电影| 中文字幕亚洲图片| 漂亮人妻被黑人久久精品| 国产精品videossex撒尿| 一区二区三区在线高清| 日本黑人久久| 欧美一区二不卡视频| 日本aⅴ亚洲精品中文乱码| 欧美激情精品在线| 国产18无套直看片| 免费萌白酱国产一区二区三区| 欧美无砖砖区免费| 欧美精品卡一卡二| 日本激情在线观看| 久久影院电视剧免费观看| 亚洲xxxxx| 夜夜爽妓女8888视频免费观看| 国产综合精品| 久久精品久久久久| 中文字幕网站在线观看| 国产精东传媒成人av电影| 欧美另类一区二区三区| 黑森林福利视频导航| 中文字幕中文字幕在线十八区 | 成人免费视频网站| 中文字幕人妻互换av久久| 国产毛片久久| 国外成人在线直播| 麻豆视频在线观看| 99精品视频在线观看免费播放| 亚洲欧美日韩天堂一区二区| 日本美女视频网站| 日本高清精品| 91麻豆精品国产综合久久久久久| 免费看污黄网站| 欧美18av| 色欧美乱欧美15图片| 日本男女交配视频| 五月婷婷视频在线观看| 亚洲精品一卡二卡| 韩国黄色一级大片| 久草中文在线观看| 亚洲欧美另类久久久精品| 一级做a爰片久久| 91在线网址| 国产精品日产欧美久久久久| 涩涩日韩在线| 91电影在线播放| 国产精品免费视频观看| 亚洲精品电影在线一区| 成人av电影观看| 中文字幕久久午夜不卡| 亚洲免费在线精品一区| 欧美黄色激情| 成人免费在线观看入口| 9999在线观看| 四季久久免费一区二区三区四区| 自拍偷自拍亚洲精品播放| 性欧美18一19内谢| 91精品久久久久久粉嫩| 亚洲制服欧美中文字幕中文字幕| 激情五月婷婷六月| av有码在线观看| 欧美日韩中文字幕综合视频| 黑鬼大战白妞高潮喷白浆| 欧美www.| 日韩视频一区二区三区 | www.色精品| 免费看国产精品一二区视频| 国产高清视频在线播放| 一区在线播放视频| 91精品一区二区三区四区| av在线私库| 一本大道久久a久久综合 | 国产精选一区二区三区| 国产精品成人一区二区三区| 人人妻人人澡人人爽精品日本| 91在线视频播放地址| 视频一区亚洲| 牛牛电影国产一区二区| 色婷婷综合久久| 五月天丁香花婷婷| 国产精品欧美大片| 中文字幕日韩精品在线观看| 久久久久亚洲AV| 国产日韩欧美一区| 91精品久久久久久久久| 日韩一级片免费看| 国产欧美一区二区精品性色超碰| www国产无套内射com| 欧美aa在线观看| 在线观看91av| 法国空姐电影在线观看| 亚洲欧美在线专区| 日本视频久久久| jlzzjlzzjlzz亚洲人| 91啪亚洲精品| 狠狠噜天天噜日日噜| 韩日一区二区| 亚洲成人亚洲激情| 国产人与禽zoz0性伦| 国产一区二区三区久久| 亚洲自拍欧美色图| 国产一级片在线播放| 亚洲韩国一区二区三区| 国产精品久久久毛片| 欧美黑人巨大videos精品| 久久亚洲国产精品| 在线观看日本网站| 成人av在线网| 九一免费在线观看| 国精品产品一区| 亚洲精品中文字幕av| 久久久久免费看| 国产在线麻豆精品观看| 日本一区二区三区免费看| h片精品在线观看| 日韩一级黄色片| 免费看一级黄色| 首页欧美精品中文字幕| 九九九九精品| 福利成人导航| 日韩一区二区三区av| 欧日韩不卡视频| 天堂午夜影视日韩欧美一区二区| 国产日韩一区二区三区| 黄页网站在线| 欧美一区二区三区播放老司机| 殴美一级黄色片| 日韩精品一级二级| 品久久久久久久久久96高清| 国产一二三在线| 亚洲韩国欧洲国产日产av| 免费毛片在线播放免费| 国产精品一二一区| 国产盗摄视频在线观看| 91麻豆精品| 久久av资源网站| 国产精品呻吟久久| 亚洲欧美日韩系列| www.成人黄色| 亚洲深深色噜噜狠狠爱网站| 亚洲精品日产aⅴ| a在线免费观看| 日韩欧美一级二级三级| 国产97免费视频| 国产福利精品一区二区| 黄黄视频在线观看| 1769国产精品视频| 久久久在线观看| 欧美亚洲精品在线观看| 欧美日韩精品在线播放| 国产呦小j女精品视频| 亚洲一区免费| 亚洲精品视频一二三| 日日夜夜综合| 欧美激情按摩在线| 少妇荡乳情欲办公室456视频| 亚洲大片精品永久免费| 欧美 日本 国产| 日韩综合一区二区| 亚洲精品久久区二区三区蜜桃臀 | 亚洲国产二区| 久久综合毛片| 成人免费一区| 欧美成人小视频| 亚州精品国产精品乱码不99按摩| 欧美性videos高清精品| 日本猛少妇色xxxxx免费网站| 精品一区二区三区欧美| 成人国产在线看| 香蕉视频一区二区三区| 国产精品视频免费观看www| 美女隐私在线观看| 亚洲а∨天堂久久精品喷水| 中文字幕第四页| 中文字幕成人av| 国产精品偷伦视频免费观看了| 在线视频免费在线观看一区二区| 日本视频一区二区在线观看| 疯狂欧洲av久久成人av电影| 97在线视频免费观看| 国产精品久久久久一区二区国产 | 国产精品jizz在线观看麻豆| 毛片在线不卡| 亚洲精品国产综合久久| 亚洲熟妇无码久久精品| 午夜私人影院久久久久| 国产馆在线观看| www.激情成人| 中文字幕22页| 久久精品日产第一区二区| 老汉色影院首页| 国产亚洲一卡2卡3卡4卡新区 | 中文字幕视频一区| 亚洲综合自拍网| 国产一区二区日韩精品| 国产偷人视频免费| 欧美日韩亚洲一区| 日韩欧美精品一区二区| 欧美理伦片在线播放| 成人中心免费视频| 欧美123区| 欧美一级电影在线| 欧美aaa免费| 日韩在线观看免费高清完整版| 偷拍精品一区二区三区| 日韩亚洲欧美在线| 一级α片免费看刺激高潮视频| 午夜精品久久久久久| 亚洲国产美女视频| 中国色在线观看另类| 国产精品三级在线观看无码| 国产成人av一区二区| 欧美wwwwwww| 日韩国产欧美在线播放| 欧美日韩国产精品激情在线播放| 欧美成人国产| 日本丰满少妇黄大片在线观看| 成人毛片免费看| 欧美日韩精品免费看| 欧美精品中文| 精品免费一区二区三区蜜桃| 在线观看视频一区二区三区| 91色p视频在线| av日韩久久| 国产日韩在线播放| 日本美女一区| 日本中文字幕久久看| 日韩伦理在线一区| 亚洲91精品在线观看| 黄页在线观看免费| 久久久久国产精品免费网站| 婷婷在线播放| 欧美另类极品videosbest最新版本 | 免费欧美在线视频| 国产免费人做人爱午夜视频| 久久国产日本精品| 午夜精品久久久内射近拍高清 | 亚洲激情自拍偷拍| 亚洲AV成人无码网站天堂久久| 国产精品毛片大码女人| 精品一区二区6| 成人欧美一区二区三区视频网页| 国产三级aaa| 亚洲柠檬福利资源导航| 成熟的女同志hd| 一区二区三区自拍| 国产一级淫片免费| 精品国产精品三级精品av网址| 日本少妇做爰全过程毛片| 亚洲aⅴ怡春院| www亚洲视频| 在线中文字幕一区| 一本久道久久综合无码中文| 欧美一区二区三区系列电影| 国产精品视频在线观看免费| 日韩欧美亚洲国产另类| 高清乱码毛片入口| 日韩高清免费观看| 国模吧精品人体gogo| 色婷婷av一区二区三区在线观看| gogo在线高清视频| 久久久爽爽爽美女图片| 粉嫩一区二区| 国产日本欧美在线观看| 试看120秒一区二区三区| 国产一区二区三区无遮挡| 欧美女优在线视频| 一本一本a久久| 亚洲性视频h| 久久久久人妻精品一区三寸| 麻豆一区二区三区| 国产香蕉精品视频| 久久久国产精品午夜一区ai换脸| 亚洲熟女毛茸茸| 亚洲成人在线免费| 成人免费一级片| 欧美刺激脚交jootjob| 色视频在线观看免费| www国产91| 咪咪网在线视频| 成人a在线视频| 美日韩黄色大片| 久久免费视频2| 久久不射网站| www.色.com| 国产日韩欧美a| 久久久国产成人| 欧美天堂一区二区三区| 欧美一区二区三区黄片| 精品国偷自产在线视频99| 国产ktv在线视频| 成人精品视频久久久久| 久久综合社区| 日本三日本三级少妇三级66| 久久免费黄色| 欧美熟妇精品一区二区| 亚洲国产精品精华液ab| 日韩免费av片| 日韩午夜在线观看视频| 国产大片在线免费观看| 国精产品一区一区三区有限在线| 性欧美1819sex性高清| 国产精品久久国产三级国电话系列| 日韩激情图片| 欧美牲交a欧美牲交aⅴ免费下载| 国产丶欧美丶日本不卡视频| 四季av中文字幕| 狠狠色噜噜狠狠狠狠97| 亚洲av永久纯肉无码精品动漫| 少妇高潮久久77777| 亚洲福利影院| 好吊色欧美一区二区三区| 久久精品青草| 视频在线观看免费高清| 久久久精品国产免大香伊| 91国产丝袜播放在线| 欧美第一区第二区| 超碰免费在线播放| 国产精品视频yy9099| 精品视频97| 欧美成人精品欧美一级乱| 91在线看国产| 日韩伦理在线视频| 精品国产91乱码一区二区三区| bestiality新另类大全| 亚洲www永久成人夜色| 日韩欧美国产精品综合嫩v| 三年中国国语在线播放免费| 久久人人超碰精品| 人妻 日韩精品 中文字幕| 日韩精品中文在线观看| 天堂中文在线播放| 久久66热这里只有精品| 午夜在线一区二区| 极品白嫩丰满美女无套| 午夜精品久久久久| 日韩二区三区| 国产成人综合久久| 国产精品免费大片| youjizzxxxx18| 国产精品久久99| 中文字幕在线播放日韩| 日韩中文视频免费在线观看| 亚洲欧美一级| 欧美日韩午夜爽爽| 高清av一区二区| 日韩精品成人一区| 亚洲精选一区二区| 国产麻豆久久| 亚洲人久久久| 国产伦精品一区二区三区在线观看| 日本青青草视频| 精品国产乱码久久久久久闺蜜 | 激情av一区二区| 三级理论午夜在线观看| 国产成人精品亚洲精品| 日本a口亚洲| 丰满人妻一区二区三区53视频| 一区二区三区欧美视频| 香蕉视频黄色片| 国产精品女人网站| 亚洲成人免费| 亚洲欧美日韩偷拍| 欧洲国内综合视频| www视频在线免费观看| 国产精品日韩一区二区| 久久婷婷久久| 我要看黄色一级片| 亚洲白拍色综合图区| 日本美女一区| 欧美视频在线第一页| 久久色.com| 国产熟女一区二区丰满| 97精品视频在线播放| 大色综合视频网站在线播放| 真实乱偷全部视频| 色综合咪咪久久| 日本不卡视频| 久久久久久国产精品mv| 久久成人麻豆午夜电影| 国产污片在线观看| 日韩在线免费av| 香蕉久久夜色精品国产更新时间| 在线免费看v片| 欧美午夜激情视频| 四虎影视成人|