精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲欧美日韩国产中文在线| 视频在线观看国产精品| 欧美成人在线直播| 日日摸日日碰夜夜爽av| 电影av在线| 国产凹凸在线观看一区二区| 欧美一级黑人aaaaaaa做受| 欧美日韩国产一二三区| 精品亚洲精品| 欧美日韩aaaaa| 人人妻人人添人人爽欧美一区| av网页在线| 99re热这里只有精品视频| 国产精品视频xxxx| 国产真实乱偷精品视频| 99久久婷婷这里只有精品| 亚洲第一区在线观看| 亚洲国产日韩欧美在线观看| 国产伦理精品| 亚洲欧美日韩久久| 日韩精品一区二区三区丰满| 成人免费公开视频| 激情综合网天天干| 国产97色在线| 日韩精品成人在线| 欧美精品日韩| 色婷婷综合久久久久| 熟女俱乐部一区二区视频在线| 伊人久久噜噜噜躁狠狠躁| 欧美日韩免费一区二区三区视频| 欧美 丝袜 自拍 制服 另类| 综合久久2o19| 亚洲欧美一区二区三区孕妇| 亚洲国产精品久久久久久女王| 手机福利在线| 99久久国产免费看| 国产精品我不卡| 99久久精品国产成人一区二区| 日韩成人一区二区三区在线观看| 91精品国产91久久久| 精品一区在线视频| 国产主播一区| 欧美激情一级欧美精品| 婷婷社区五月天| 欧美日韩有码| 中文日韩在线观看| 国产调教在线观看| 精品视频久久| 国产亚洲a∨片在线观看| 日本xxx在线播放| 欧美电影在线观看免费| 亚洲精品理论电影| 久久久久国产精品区片区无码| 伦理一区二区| 精品视频一区在线视频| 黄色a一级视频| 亚洲成在人线免费观看| 亚洲视频专区在线| 在线小视频你懂的| 第四色成人网| 日韩有码在线视频| 99久久99久久精品国产| 欧美a级在线| 欧美精品福利视频| 日韩伦人妻无码| 午夜在线一区| 国产精品青草久久久久福利99| 中文字幕av网站| 紧缚奴在线一区二区三区| 国产综合福利在线| 国产手机av在线| 床上的激情91.| 欧美激情国产日韩| 亚洲欧美视频一区二区| 专区另类欧美日韩| 无码人妻少妇伦在线电影| 老牛影视精品| 欧美性受xxxx黑人xyx| 99日在线视频| 岛国精品一区| 一区二区三区动漫| www.超碰在线观看| 99精品国产福利在线观看免费| 国产91色在线免费| 999av视频| www.视频一区| 亚洲一区免费看| 里番在线播放| 91高清视频在线| 国产精品嫩草影视| 一本色道久久综合亚洲精品酒店| 日韩视频免费在线| 伊人久久综合视频| 麻豆精品久久精品色综合| 99久久99久久| 毛片在线播放网站| 伊人夜夜躁av伊人久久| 国产精品第12页| 精品久久亚洲| 亚洲片在线资源| 免费在线看黄网址| 美女网站色91| 久久66热这里只有精品| 精品176二区| 一本一道综合狠狠老| 亚洲欧美一区二区三区不卡| 亚洲精品无吗| 欧美俄罗斯性视频| 中文天堂在线资源| 成人av免费在线| 免费观看黄色大片| 激情亚洲影院在线观看| 精品福利在线导航| 精品亚洲乱码一区二区| 欧美专区一区二区三区| 国产高清一区视频| 蜜桃视频在线观看www社区| 精品色蜜蜜精品视频在线观看| 国产欧美精品一二三| 国精一区二区| 欧美与黑人午夜性猛交久久久| 精品久久久无码中文字幕| 中文一区二区完整视频在线观看| 国产精品自拍片| 日本一区二区三区电影免费观看| 在线播放日韩专区| 蜜臀精品一区二区三区| 91蜜桃免费观看视频| 91免费黄视频| 亚洲一二三区视频| 免费不卡欧美自拍视频| 在线视频欧美亚洲| 欧美国产精品中文字幕| 国产xxxxx视频| 蜜桃精品wwwmitaows| 91av网站在线播放| 无码精品黑人一区二区三区| 亚洲综合图片区| 欧美熟妇另类久久久久久多毛| 日韩88av| 国产主播精品在线| 黄色免费在线观看| 制服丝袜亚洲播放| 欧美做爰爽爽爽爽爽爽| 国产一区视频在线看| 在线视频91| 亚洲三级电影| 久久亚洲国产成人| 99在线精品视频免费观看20| 亚洲欧美日韩久久精品| 伊人av在线播放| 国产综合精品一区| 国产无套精品一区二区| gogo久久| 精品亚洲男同gayvideo网站| 亚洲综合久久网| 欧美激情一区二区| 怡红院亚洲色图| 亚洲女同中文字幕| 99在线观看视频| а√天堂中文资源在线bt| 亚洲精品美女免费| 久久人人爽人人爽人人片av免费| 中文字幕av一区二区三区高| 午夜福利123| 亚洲国产精品第一区二区| 精品国产福利| 亚州一区二区三区| 久久精品视频播放| 国产 日韩 欧美 精品| 精品露脸国产偷人在视频| 免费看污片网站| 精品一区二区国语对白| 久久人妻无码一区二区| 色婷婷av一区二区三区丝袜美腿| 国产精品国模在线| 1stkiss在线漫画| 日韩成人免费视频| 一区二区视频在线免费观看| 亚洲男人的天堂一区二区| 久久人妻一区二区| 轻轻草成人在线| 国产精品videossex国产高清 | 男女视频在线观看免费| 欧洲av在线精品| 欧美日韩精品亚洲精品| 久久这里只有精品6| www.色就是色.com| 亚洲精品在线二区| 亚洲区一区二区三区| 一区二区三区视频免费视频观看网站| 欧洲亚洲妇女av| 免费在线看黄色| 亚洲国产一区二区三区四区| 中文在线字幕av| 黄色成人在线播放| 国产喷水在线观看| 99国产一区二区三精品乱码| 污版视频在线观看| 国产情侣一区| 亚洲五码在线观看视频| 伊人成综合网yiren22| 亚洲自拍av在线| 日韩成人亚洲| 91黄色8090| 黄网站在线观| 久久中文字幕一区| 国产午夜精品一区理论片| 精品国产区一区| 国产精品久久婷婷| 在线亚洲人成电影网站色www| 国产亚洲精品av| 成人免费小视频| 亚洲精品成人无码| 国产sm精品调教视频网站| 777一区二区| 日韩福利电影在线观看| 亚洲午夜精品久久久久久人妖| 午夜欧美精品| 一本久久a久久精品vr综合| 久久91精品| 久久综合九色99| 99久热这里只有精品视频免费观看| 国产日韩欧美在线看| 自拍视频在线看| 性欧美在线看片a免费观看| 污片视频在线免费观看| 久久天天躁狠狠躁夜夜av| shkd中文字幕久久在线观看| 亚洲欧美日韩精品| 天天av综合网| 日韩精品在线第一页| 日本高清视频免费看| 欧美成人video| 性少妇videosexfreexxx片| 欧美一区二区视频在线观看 | 在线视频精品一区| 欧美日韩色图| 亚洲欧美日韩另类精品一区二区三区 | 欧美极品视频在线观看| 亚洲精品国产一区二区精华液| 91av手机在线| 亚洲手机成人高清视频| 国产男女猛烈无遮挡在线喷水| 中文字幕一区二区三区在线观看 | 岛国av在线不卡| 特一级黄色大片| 欧美日韩国产精品专区| 日韩欧美一级视频| 日韩欧美在线字幕| 东京热一区二区三区四区| 日韩欧美精品网址| 男操女视频网站| 欧美精品123区| 国产日韩精品suv| 日韩精品一区二区三区四区| 国产 欧美 精品| 国产丝袜精品视频| sese在线视频| 九九精品视频在线| 成人观看网址| 国产成人精品久久久| 深夜日韩欧美| 99视频在线| 伊人久久大香线蕉av不卡| 视频在线99re| 你懂的一区二区| 欧美一区二区三区爽大粗免费| 老色鬼久久亚洲一区二区| 日韩大片一区二区| 国产精品亚洲综合一区在线观看| 国产欧美视频一区| 久久男人中文字幕资源站| 亚洲一二三四五六区| 亚洲免费观看在线视频| 久久亚洲天堂网| 欧美日本乱大交xxxxx| 亚洲h视频在线观看| 亚洲人成电影网站色xx| 国产1区在线| 2019中文字幕在线观看| 亚洲91在线| 精品日本一区二区三区在线观看| 欧美日韩国产一区二区三区不卡| 激情五月五月婷婷| 免费在线播放第一区高清av| 中文字幕22页| 91亚洲国产成人精品一区二三| 国产黄a三级三级| 精品magnet| 国产三级视频在线播放| 亚洲人成在线观| 欧美家庭影院| 国产精品mp4| 成人性生交大片免费看中文视频| 先锋影音一区二区三区| 99在线观看免费视频精品观看| jizzzz日本| 91久色porny| 久久99久久98精品免观看软件| 在线观看亚洲精品视频| 成人免费观看在线视频| 日韩中文字幕在线观看| 成人性生活视频| 国产v亚洲v天堂无码| 日韩理论电影大全| 日本三级免费网站| 国产成人免费网站| frxxee中国xxx麻豆hd| 欧美午夜一区二区| 你懂的在线看| 97在线免费观看| 日韩成人久久| 亚洲精品偷拍视频| 日本va欧美va欧美va精品| 熟女丰满老熟女熟妇| 亚洲一二三四区| 国产xxxx孕妇| 久久久精品日本| 国产亚洲人成a在线v网站| 久久99精品久久久久子伦 | 9久久婷婷国产综合精品性色 | 日韩电影中文字幕av| 欧美人与性动交α欧美精品济南到| 国产一区二区色| 日韩欧美高清在线播放| 欧美在线观看视频网站| 久久无码av三级| 亚洲av中文无码乱人伦在线视色| 亚洲二区在线播放视频| 毛片在线网址| 国产日韩在线一区二区三区| 国产一区二区三区四区老人| 亚洲欧美日韩网站| 亚洲视频一区在线观看| 国产精品丝袜黑色高跟鞋| 久久精品国产欧美激情| 日韩午夜电影免费看| 亚洲视频在线观看日本a| 美女国产一区二区三区| 亚洲天堂精品一区| 欧美日韩小视频| 69视频在线| 91天堂在线视频| 欧美久久视频| 黑森林av导航| 欧美日韩免费一区| 日本ー区在线视频| 国产99视频在线观看| 日韩av密桃| www.日本久久| 亚洲一区二区欧美日韩| 色欲av伊人久久大香线蕉影院| 1769国产精品| 欧美色爱综合| 天堂av2020| 一区二区三区日韩精品视频| 国产 欧美 自拍| 欧洲亚洲免费视频| 色婷婷色综合| 中文字幕一区二区三区人妻在线视频| 亚洲一区电影777| 日韩一区av| 成人xxxxx| 亚洲黄页一区| 在线国产视频一区| 9191久久久久久久久久久| 超碰在线97国产| 欧美一区二区在线视频观看| 久久99精品久久久久久国产越南| 国产少妇在线观看| 亚洲激情成人网| 欧美日韩五区| 400部精品国偷自产在线观看| 成a人片国产精品| 波多野结衣黄色| 欧美日韩成人网| 精品国产一区二区三区小蝌蚪 | 国产精品国产三级国产aⅴ| 久久99久久久久久久噜噜| 欧美电影免费网站| 亚洲午夜激情影院| 五月天欧美精品| 男人影院在线观看| 精品1区2区| 国产一区亚洲一区| 国产一级淫片a视频免费观看| 久久久91精品| 一个色免费成人影院| 在线成人精品视频| 91久久精品一区二区三| 天堂av资源在线观看| 人禽交欧美网站免费| 国产精品白丝av| www.久久网| 97香蕉久久超级碰碰高清版| 久久精品影视| 午夜时刻免费入口| 精品国产sm最大网站免费看| 亚洲青青一区|