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

在 Kubernetes 上使用 Flask 搭建 Python 微服務

開發 后端
本系列的第 10 部分演示了如何將用戶管理系統的查找服務作為 Python 微服務部署在 Kubernetes 上。

微服務遵循領域驅動設計(DDD),與開發平臺無關。Python 微服務也不例外。Python3 的面向對象特性使得按照 DDD 對服務進行建模變得更加容易。

微服務架構的強大之處在于它的多語言性。企業將其功能分解為一組微服務,每個團隊自由選擇一個平臺。

我們的用戶管理系統已經分解為四個微服務,分別是添加、查找、搜索和日志服務。添加服務在 Java 平臺上開發并部署在 Kubernetes 集群上,以實現彈性和可擴展性。這并不意味著其余的服務也要使用 Java 開發,我們可以自由選擇適合個人服務的平臺。

讓我們選擇 Python 作為開發查找服務的平臺。查找服務的模型已經設計好了(參考 2022 年 3 月份的文章),我們只需要將這個模型轉換為代碼和配置。

Pythonic 方法

Python 是一種通用編程語言,已經存在了大約 30 年。早期,它是自動化腳本的首選。然而,隨著 Django 和 Flask 等框架的出現,它的受歡迎程度越來越高,現在各種領域中都在應用它,如企業應用程序開發。數據科學和機器學習進一步推動了它的發展,Python 現在是三大編程語言之一。

許多人將 Python 的成功歸功于它容易編碼。這只是一部分原因。只要你的目標是開發小型腳本,Python 就像一個玩具,你會非常喜歡它。然而,當你進入嚴肅的大規模應用程序開發領域時,你將不得不處理大量的 ??if?? 和 ??else??,Python 變得與任何其他平臺一樣好或一樣壞。例如,采用一種面向對象的方法!許多 Python 開發人員甚至可能沒意識到 Python 支持類、繼承等功能。Python 確實支持成熟的面向對象開發,但是有它自己的方式 -- Pythonic!讓我們探索一下!

領域模型

??AddService?? 通過將數據保存到一個 MySQL 數據庫中來將用戶添加到系統中。??FindService?? 的目標是提供一個 REST API 按用戶名查找用戶。域模型如圖 1 所示。它主要由一些值對象組成,如 ??User?? 實體的??Name??、??PhoneNumber?? 以及 ??UserRepository??。

圖 1: 查找服務的域模型

讓我們從 ??Name?? 開始。由于它是一個值對象,因此必須在創建時進行驗證,并且必須保持不可變。基本結構如所示:

class Name:    value: str    def __post_init__(self):        if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:            raise ValueError("Invalid Name")

如你所見,??Name?? 包含一個字符串類型的值。作為后期初始化的一部分,我們會驗證它。

Python 3.7 提供了 ??@dataclass?? 裝飾器,它提供了許多開箱即用的數據承載類的功能,如構造函數、比較運算符等。如下是裝飾后的 ??Name?? 類:

from dataclasses import dataclass@dataclassclass Name:    value: str    def __post_init__(self):        if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:            raise ValueError("Invalid Name")

以下代碼可以創建一個 ??Name?? 對象:

name = Name("Krishna")

??value?? 屬性可以按照如下方式讀取或寫入:

name.value = "Mohan"print(name.value)

可以很容易地與另一個 ??Name?? 對象比較,如下所示:

other = Name("Mohan")if name == other:    print("same")

如你所見,對象比較的是值而不是引用。這一切都是開箱即用的。我們還可以通過凍結對象使對象不可變。這是 ??Name?? 值對象的最終版本:

from dataclasses import dataclass@dataclass(frozen=True)class Name:    value: str    def __post_init__(self):        if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:            raise ValueError("Invalid Name")

??PhoneNumber?? 也遵循類似的方法,因為它也是一個值對象:

@dataclass(frozen=True)class PhoneNumber:    value: int    def __post_init__(self):        if self.value < 9000000000:            raise ValueError("Invalid Phone Number")

??User?? 類是一個實體,不是一個值對象。換句話說,??User?? 是可變的。以下是結構:

from dataclasses import dataclassimport datetime@dataclassclass User:    _name: Name    _phone: PhoneNumber    _since: datetime.datetime    def __post_init__(self):        if self._name is None or self._phone is None:            raise ValueError("Invalid user")        if self._since is None:            self.since = datetime.datetime.now()

你能觀察到 ??User?? 并沒有凍結,因為我們希望它是可變的。但是,我們不希望所有屬性都是可變的。標識字段如 ??_name?? 和 ??_since?? 是希望不會修改的。那么,這如何做到呢?

Python3 提供了所謂的描述符協議,它會幫助我們正確定義 getter 和 setter。讓我們使用 ??@property?? 裝飾器將 getter 添加到 ??User?? 的所有三個字段中。

@propertydef name(self) -> Name:    return self._name@propertydef phone(self) -> PhoneNumber:    return self._phone@propertydef since(self) -> datetime.datetime:    return self._since

??phone?? 字段的 setter 可以使用 ??@<字段>.setter?? 來裝飾:

@phone.setterdef phone(self, phone: PhoneNumber) -> None:    if phone is None:        raise ValueError("Invalid phone")    self._phone = phone

通過重寫 ??__str__()?? 函數,也可以為 ??User?? 提供一個簡單的打印方法:

def __str__(self):    return self.name.value + " [" + str(self.phone.value) + "] since " + str(self.since)

這樣,域模型的實體和值對象就準備好了。創建異常類如下所示:

class UserNotFoundException(Exception):    pass

域模型現在只剩下 ??UserRepository?? 了。Python 提供了一個名為 ??abc?? 的有用模塊來創建抽象方法和抽象類。因為 ??UserRepository?? 只是一個接口,所以我們可以使用 ??abc?? 模塊。

任何繼承自 ??abc.ABC?? 的類都將變為抽象類,任何帶有 ??@abc.abstractmethod?? 裝飾器的函數都會變為一個抽象函數。下面是 ??UserRepository?? 的結構:

from abc import ABC, abstractmethodclass UserRepository(ABC):    @abstractmethod    def fetch(self, name:Name) -> User:        pass

??UserRepository?? 遵循倉儲模式。換句話說,它在 ??User?? 實體上提供適當的 CRUD 操作,而不會暴露底層數據存儲語義。在本例中,我們只需要 ??fetch()?? 操作,因為 ??FindService?? 只查找用戶。

因為 ??UserRepository?? 是一個抽象類,我們不能從抽象類創建實例對象。創建對象必須依賴于一個具體類實現這個抽象類。數據層 ??UserRepositoryImpl?? 提供了 ??UserRepository?? 的具體實現:

class UserRepositoryImpl(UserRepository):    def fetch(self, name:Name) -> User:        pass

由于 ??AddService?? 將用戶數據存儲在一個 MySQL 數據庫中,因此 ??UserRepositoryImpl?? 也必須連接到相同的數據庫去檢索數據。下面是連接到數據庫的代碼。注意,我們正在使用 MySQL 的連接庫。

from mysql.connector import connect, Errorclass UserRepositoryImpl(UserRepository):    def fetch(self, name:Name) -> User:        try:            with connect(                    host="mysqldb",                    user="root",                    password="admin",                    database="glarimy",                ) as connection:                with connection.cursor() as cursor:                    cursor.execute("SELECT * FROM ums_users where name=%s", (name.value,))                    row = cursor.fetchone()                    if cursor.rowcount == -1:                        raise UserNotFoundException()                    else:                        return User(Name(row[0]), PhoneNumber(row[1]), row[2])        except Error as e:            raise e

在上面的片段中,我們使用用戶 ??root?? / 密碼 ??admin?? 連接到一個名為 ??mysqldb?? 的數據庫服務器,使用名為 ??glarimy?? 的數據庫(模式)。在演示代碼中是可以包含這些信息的,但在生產中不建議這么做,因為這會暴露敏感信息。

??fetch()?? 操作的邏輯非常直觀,它對 ??ums_users?? 表執行 SELECT 查詢?;叵胍幌?,??AddService?? 正在將用戶數據寫入同一個表中。如果 SELECT 查詢沒有返回記錄,??fetch()?? 函數將拋出 ??UserNotFoundException?? 異常。否則,它會從記錄中構造 ??User?? 實體并將其返回給調用者。這沒有什么特殊的。

應用層

最終,我們需要創建應用層。此模型如圖 2 所示。它只包含兩個類:控制器和一個 DTO。

圖 2: 添加服務的應用層

眾所周知,一個 DTO 只是一個沒有任何業務邏輯的數據容器。它主要用于在 ??FindService?? 和外部之間傳輸數據。我們只是提供了在 REST 層中將 ??UserRecord?? 轉換為字典以便用于 JSON 傳輸:

class UserRecord:    def toJSON(self):        return {            "name": self.name,            "phone": self.phone,            "since": self.since        }

控制器的工作是將 DTO 轉換為用于域服務的域對象,反之亦然??梢詮?nbsp;??find()?? 操作中觀察到這一點。

class UserController:    def __init__(self):        self._repo = UserRepositoryImpl()    def find(self, name: str):        try:            user: User = self._repo.fetch(Name(name))            record: UserRecord = UserRecord()            record.name = user.name.value            record.phone = user.phone.value            record.since = user.since            return record        except UserNotFoundException as e:            return None

??find()?? 操作接收一個字符串作為用戶名,然后將其轉換為 ??Name?? 對象,并調用 ??UserRepository?? 獲取相應的 ??User?? 對象。如果找到了,則使用檢索到的 ??User`` 對象創建??UserRecord`。回想一下,將域對象轉換為 DTO 是很有必要的,這樣可以對外部服務隱藏域模型。

??UserController?? 不需要有多個實例,它也可以是單例的。通過重寫 ??__new__??,可以將其建模為一個單例。

class UserController:    def __new__(self):        if not hasattr(self, ‘instance’):            self.instance = super().__new__(self)        return self.instance    def __init__(self):        self._repo = UserRepositoryImpl()    def find(self, name: str):        try:            user: User = self._repo.fetch(Name(name))            record: UserRecord = UserRecord()            record.name = user.name.getValue()            record.phone = user.phone.getValue()            record.since = user.since            return record        except UserNotFoundException as e:            return None

我們已經完全實現了 ??FindService?? 的模型,剩下的唯一任務是將其作為 REST 服務公開。

REST API

??FindService?? 只提供一個 API,那就是通過用戶名查找用戶。顯然 URI 如下所示:

GET /user/{name}

此 API 希望根據提供的用戶名查找用戶,并以 JSON 格式返回用戶的電話號碼等詳細信息。如果沒有找到用戶,API 將返回一個 404 狀態碼。

我們可以使用 Flask 框架來構建 REST API,它最初的目的是使用 Python 開發 Web 應用程序。除了 HTML 視圖,它還進一步擴展到支持 REST 視圖。我們選擇這個框架是因為它足夠簡單。 創建一個 Flask 應用程序:

from flask import Flaskapp = Flask(__name__)

然后為 Flask 應用程序定義路由,就像函數一樣簡單:

@app.route('/user/<name>')def get(name):    pass

注意 ??@app.route?? 映射到 API ??/user/<name>??,與之對應的函數的 ??get()??。

如你所見,每次用戶訪問 API 如 ??http://server:port/user/Krishna?? 時,都將調用這個 ??get()?? 函數。Flask 足夠智能,可以從 URL 中提取 ??Krishna?? 作為用戶名,并將其傳遞給 ??get()?? 函數。

??get()?? 函數很簡單。它要求控制器找到該用戶,并將其與通常的 HTTP 頭一起打包為 JSON 格式后返回。如果控制器返回 ??None??,則 ??get()?? 函數返回合適的 HTTP 狀態碼。

from flask import jsonify, abortcontroller = UserController()record = controller.find(name)if record is None:    abort(404)else:    resp = jsonify(record.toJSON())    resp.status_code = 200    return resp

最后,我們需要 Flask 應用程序提供服務,可以使用 ??waitress?? 服務:

from waitress import serveserve(app, host="0.0.0.0", port=8080)

在上面的片段中,應用程序在本地主機的 8080 端口上提供服務。最終代碼如下所示:

from flask import Flask, jsonify, abortfrom waitress import serveapp = Flask(__name__)@app.route('/user/<name>')def get(name):    controller = UserController()    record = controller.find(name)    if record is None:        abort(404)    else:        resp = jsonify(record.toJSON())        resp.status_code = 200        return respserve(app, host="0.0.0.0", port=8080)

部署

??FindService?? 的代碼已經準備完畢。除了 REST API 之外,它還有域模型、數據層和應用程序層。下一步是構建此服務,將其容器化,然后部署到 Kubernetes 上。此過程與部署其他服務妹有任何區別,但有一些 Python 特有的步驟。

在繼續前進之前,讓我們來看下文件夾和文件結構:

+ ums-find-service+ ums- domain.py- data.py- app.py- Dockerfile- requirements.txt- kube-find-deployment.yml

如你所見,整個工作文件夾都位于 ??ums-find-service?? 下,它包含了 ??ums?? 文件夾中的代碼和一些配置文件,例如 ??Dockerfile??、??requirements.txt?? 和 ??kube-find-deployment.yml??。

??domain.py?? 包含域模型,??data.py?? 包含 ??UserRepositoryImpl??,??app.py?? 包含剩余代碼。我們已經閱讀過代碼了,現在我們來看看配置文件。

第一個是 ??requirements.txt??,它聲明了 Python 系統需要下載和安裝的外部依賴項。我們需要用查找服務中用到的每個外部 Python 模塊來填充它。如你所見,我們使用了 MySQL 連接器、Flask 和 Waitress 模塊。因此,下面是 ??requirements.txt?? 的內容。

Flask==2.1.1Flask_RESTfulmysql-connector-pythonwaitress

第二步是在 ??Dockerfile?? 中聲明 Docker 相關的清單,如下:

FROM python:3.8-slim-busterWORKDIR /umsADD ums /umsADD requirements.txt requirements.txtRUN pip3 install -r requirements.txtEXPOSE 8080ENTRYPOINT ["python"]CMD ["/ums/app.py"]

總的來說,我們使用 Python 3.8 作為基線,除了移動 ??requirements.txt?? 之外,我們還將代碼從 ??ums?? 文件夾移動到 Docker 容器中對應的文件夾中。然后,我們指示容器運行 ??pip3 install?? 命令安裝對應模塊。最后,我們向外暴露 8080 端口(因為 waitress 運行在此端口上)。

為了運行此服務,我們指示容器使用使用以下命令:

python /ums/app.py

一旦 ??Dockerfile?? 準備完成,在 ??ums-find-service?? 文件夾中運行以下命令,創建 Docker 鏡像:

docker build -t glarimy/ums-find-service

它會創建 Docker 鏡像,可以使用以下命令查找鏡像:

docker images

嘗試將鏡像推送到 Docker Hub,你也可以登錄到 Docker。

docker logindocker push glarimy/ums-find-service

最后一步是為 Kubernetes 部署構建清單。

在之前的文章中,我們已經介紹了如何建立 Kubernetes 集群、部署和使用服務的方法。我假設仍然使用之前文章中的清單文件來部署添加服務、MySQL、Kafka 和 Zookeeper。我們只需要將以下內容添加到 ??kube-find-deployment.yml?? 文件中:

apiVersion: apps/v1kind: Deploymentmetadata:name: ums-find-servicelabels:app: ums-find-servicespec:replicas: 3selector:matchLabels:app: ums-find-servicetemplate:metadata:labels:app: ums-find-servicespec:containers:- name: ums-find-serviceimage: glarimy/ums-find-serviceports:- containerPort: 8080---apiVersion: v1kind: Servicemetadata:name: ums-find-servicelabels:name: ums-find-servicespec:type: LoadBalancerports:- port: 8080selector:app: ums-find-service

上面清單文件的第一部分聲明了 ??glarimy/ums-find-service?? 鏡像的 ??FindService??,它包含三個副本。它還暴露 8080 端口。清單的后半部分聲明了一個 Kubernetes 服務作為 ??FindService?? 部署的前端。請記住,在之前文章中,mysqldb 服務已經是上述清單的一部分了。

運行以下命令在 Kubernetes 集群上部署清單文件:

kubectl create -f kube-find-deployment.yml

部署完成后,可以使用以下命令驗證容器組和服務:

kubectl get services

輸出如圖 3 所示:

圖 3: Kubernetes 服務

它會列出集群上運行的所有服務。注意查找服務的外部 IP,使用 ??curl?? 調用此服務:

curl http://10.98.45.187:8080/user/KrishnaMohan

注意:10.98.45.187 對應查找服務,如圖 3 所示。

如果我們使用 ??AddService?? 創建一個名為 ??KrishnaMohan?? 的用戶,那么上面的 ??curl?? 命令看起來如圖 4 所示:

圖 4: 查找服務

用戶管理系統(UMS)的體系結構包含 ??AddService?? 和 ??FindService??,以及存儲和消息傳遞所需的后端服務,如圖 5 所示。可以看到終端用戶使用 ??ums-add-service?? 的 IP 地址添加新用戶,使用 ??ums-find-service?? 的 IP 地址查找已有用戶。每個 Kubernetes 服務都由三個對應容器的節點支持。還要注意:同樣的 mysqldb 服務用于存儲和檢索用戶數據。

圖 5: UMS 的添加服務和查找服務

其他服務

UMS 系統還包含兩個服務:??SearchService?? 和 ??JournalService??。在本系列的下一部分中,我們將在 Node 平臺上設計這些服務,并將它們部署到同一個 Kubernetes 集群,以演示多語言微服務架構的真正魅力。最后,我們將觀察一些與微服務相關的設計模式。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2019-07-12 14:41:31

微服務Kubernetes容器

2016-07-29 15:49:58

DockerKubernetesMongoDB

2017-07-10 10:51:21

微服務領域事件Microservic

2017-04-19 08:58:54

微服務領域事件事件

2019-12-20 10:28:54

工具代碼開發

2022-06-02 07:51:06

RainbondNocalhost微服務

2019-04-23 09:48:21

KubernetesPostgreSQL

2022-12-29 14:25:22

2020-12-29 10:16:24

接口測試flaskmock

2017-03-07 11:02:03

Kubernetes微服務DevOps

2021-12-14 06:59:39

微服務Kubernetes架構

2017-05-16 14:47:23

2019-09-18 16:52:58

hyperf微服務php

2022-08-10 10:46:13

?CrossplanKubernete插件

2022-08-11 08:41:31

CrossplaneVCluster

2021-07-26 14:31:49

GitLab KubernetesFlask Web

2023-06-01 15:14:55

架構Python微服務

2023-01-26 11:56:31

Kubernete虛擬機k3s

2019-06-03 09:15:15

KubernetesKafka數據庫

2018-12-12 09:59:47

微服務架構分布式系統
點贊
收藏

51CTO技術棧公眾號

日本网站在线看| 一区二区三区在线视频111| 国产精品1234区| 九色国产在线观看| 蜜桃在线一区二区三区| 欧美精品一二区| 五月天婷婷激情视频| 在线观看麻豆| 成人一区二区三区中文字幕| 日韩美女写真福利在线观看| 麻豆tv在线观看| 综合另类专区| 99久久99久久综合| 国产免费久久av| 久久精品视频6| 精品视频国产| 亚洲精品一线二线三线| 最新中文字幕2018| 黄视频网站在线观看| 国产精品久久午夜| 久久久久久九九九九| 97人妻人人澡人人爽人人精品| 亚洲黄色影院| 久久精品国产亚洲精品2020| 性欧美13一14内谢| 成人av综合网| 欧美一级在线免费| 国产wwwxx| 在线女人免费视频| 一区二区三区欧美激情| 亚洲精品国产一区| 色吊丝在线永久观看最新版本| 国产精品一区二区在线观看不卡 | 春暖花开亚洲一区二区三区| 成人免费毛片嘿嘿连载视频| 91精品国产综合久久香蕉最新版| 人妻少妇无码精品视频区| 日韩精品一区二区三区中文在线 | 亚洲熟妇av乱码在线观看| 亚洲黄色三级| 欧美激情三级免费| 丰满少妇高潮久久三区| 午夜激情久久| 777久久久精品| 午夜dv内射一区二区| 久久久久成人黄色影片| 国产丝袜一区二区三区免费视频| 五月天国产视频| 欧美xxx黑人xxx水蜜桃| 亚洲欧洲av色图| 先锋影音亚洲资源| 国产日韩欧美视频在线观看| 美女任你摸久久| 国产精品免费观看在线| 自拍偷拍色综合| 蜜臀精品久久久久久蜜臀| 国产精品video| 波多野结衣黄色| 日本欧美一区二区在线观看| 国产精品草莓在线免费观看| 日本一本在线观看| 日本免费新一区视频| 国产精品久久久精品| 久久久国产免费| 奇米色一区二区三区四区| 国产精品美女呻吟| 一卡二卡三卡在线| 国产原创一区二区| 999日本视频| 免费在线视频观看| 欧美视频网站| 97激碰免费视频| 综合网在线观看| 911久久香蕉国产线看观看| 成人97在线观看视频| 精品99在线观看| 国产亚洲网站| 国产精品免费电影| 国产高清免费在线观看| 成人免费毛片高清视频| 欧美一区二区综合| 美女隐私在线观看| 亚洲最新视频在线观看| 欧美在线一区视频| 国产精品亚洲一区二区三区在线观看| 亚洲人成伊人成综合网小说| 91视频 - 88av| 美女日韩欧美| 91精品国产综合久久香蕉麻豆| 中文字幕一二三| 伊人久久大香线蕉综合网站| 日韩视频免费观看高清完整版| 无码人妻丰满熟妇区毛片蜜桃精品 | 亚洲av毛片成人精品| 国产偷国产偷精品高清尤物| 91嫩草免费看| 日本中文字幕电影在线观看| 国产精品三级av| 国产 欧美 日韩 一区| 一区二区电影免费观看| 91麻豆精品91久久久久同性| 亚洲精品第二页| 欧美电影三区| 韩国视频理论视频久久| 中文字幕777| 成人精品免费视频| 99一区二区| 毛片免费在线观看| 一区二区三区日韩欧美| 一区二区在线播放视频| caoporn成人| 中文字幕av一区| 天天综合网入口| 国产精品资源在线看| 日本一区二区三区四区高清视频| 国产蜜臀av在线播放| 欧美日韩国产影片| 亚洲综合色在线观看| 91精品啪在线观看国产爱臀| 最近2019中文字幕mv免费看| 日本韩国欧美中文字幕| 国产99一区视频免费| 一本一生久久a久久精品综合蜜 | 成人妇女免费播放久久久| 熟妇人妻系列aⅴ无码专区友真希| 国产精品理论在线观看| 成人免费观看视频在线观看| 77成人影视| 蜜月aⅴ免费一区二区三区| 中文字幕一二区| 国产午夜亚洲精品午夜鲁丝片 | 免费人成在线不卡| 免费在线成人av| 三级理论午夜在线观看| 伊人色综合久久天天| 日韩一区二区三区久久| 精品国产1区| 欧美在线激情视频| 波多野结衣在线观看视频| 成人av在线播放网址| 国产91沈先生在线播放| 日韩精品成人在线观看| 久久视频国产精品免费视频在线 | 麻豆专区一区二区三区四区五区| 国产精品一二三在线| 亚洲av成人精品一区二区三区在线播放| 亚洲免费在线视频一区 二区| 国产一伦一伦一伦| 精品成人影院| 国产精品国产三级国产aⅴ浪潮| 欧美孕妇孕交| 在线免费观看日韩欧美| 日韩一级av毛片| 天堂资源在线中文精品| 日本欧美色综合网站免费| 久久电影tv| 亚洲天堂精品在线| 中文字幕+乱码+中文乱码www | 国产传媒欧美日韩成人| 黄色录像特级片| 国产乱人伦丫前精品视频| 久久久久久com| 污视频网站在线播放| 欧美日韩色婷婷| 性欧美丰满熟妇xxxx性仙踪林| 久久国产88| 色播亚洲婷婷| 亚洲伦理一区二区| 欧美日韩国产成人在线观看| 天堂а√在线中文在线新版| 久久综合九色综合97婷婷女人| 成人亚洲视频在线观看| 欧美xxxxx视频| 91在线短视频| 亚洲欧美电影| 中文字幕一区日韩电影| av老司机久久| 欧美日韩国产黄| 国产黄色录像视频| 国产精品主播直播| 国模无码视频一区二区三区| 国模吧精品视频| 91久久久久久久久久久久久| hd国产人妖ts另类视频| 在线播放精品一区二区三区| 色播视频在线播放| 国产欧美一区二区三区网站| 色综合五月婷婷| 国产精品日韩| 大地资源第二页在线观看高清版| julia中文字幕一区二区99在线| 国产99在线|中文| 新版中文在线官网| 亚洲人成五月天| 亚洲av综合色区无码一区爱av| 欧美日韩中文字幕| 91成人福利视频| 国产三级一区二区| 国内自拍偷拍视频| 日本欧美一区二区在线观看| 免费毛片网站在线观看| 91久久久精品国产| 欧美日韩一区二区视频在线| 视频免费一区二区| 国产精品日韩精品| 黄色在线观看www| 久久影视免费观看 | 日韩视频一区在线| 天堂av在线资源| 婷婷开心激情综合| 色偷偷男人天堂| 99re成人精品视频| 性久久久久久久久久久久久久| 欧美一级播放| 99久久久精品视频| 久久久久蜜桃| 婷婷久久伊人| 日韩精品导航| 岛国一区二区三区高清视频| 天堂va在线| 中文字幕日韩综合av| 午夜视频免费在线| 日韩欧美高清一区| 国产精品高潮呻吟AV无码| 色乱码一区二区三区88| 中文字幕在线观看免费视频| 亚洲精品国产第一综合99久久| 99在线视频免费| 久久久影视传媒| 黄色正能量网站| 成人福利电影精品一区二区在线观看| 日本在线播放一区二区| 欧美aa国产视频| 亚洲免费视频一区| 日韩88av| 亚洲女人毛片| 日韩欧美国产精品综合嫩v| 日韩av一区二区三区美女毛片| 一区二区美女| 欧美亚洲精品日韩| 嫩草一区二区三区| 欧美久久在线| 九九亚洲视频| 日本10禁啪啪无遮挡免费一区二区 | 老司机精品影院| 在线国产精品播放| 一区二区三区视频网站| 中文日韩在线视频| 欧美尤物美女在线| 久久视频在线免费观看| 国产在线高清视频| 色在人av网站天堂精品| 高清电影在线观看免费| 高清一区二区三区日本久| caoprom在线| 欧洲精品久久久| 欧美free嫩15| 国产精品自产拍在线观看中文| 国产精品黄色片| 亚洲bt天天射| 精品国产一区二区三区成人影院| 国产视频99| 国产一区二区三区不卡视频网站| 亚洲国产精品日韩| 亚洲影视一区| 青青草精品视频在线| 99亚洲一区二区| 亚洲精品日韩在线观看| 99久久夜色精品国产亚洲96| 青青草视频国产| 国产精品色网| 色噜噜狠狠永久免费| 国产高清成人在线| 老司机免费视频| 欧美激情在线免费观看| 51精品免费网站| 亚洲午夜电影在线| 国产字幕在线观看| 日韩一区二区在线免费观看| 香蕉视频网站在线| 中文国产成人精品久久一| 久久亚洲导航| 国产精品99久久久久久白浆小说 | 欧美日韩一区二区视频在线观看| 日韩成人三级| 人人干视频在线| 理论片日本一区| 精品少妇人妻av一区二区三区| 国产日韩精品一区| 久久国产在线观看| 欧美在线看片a免费观看| 亚洲AV无码一区二区三区性| 亚洲最新在线视频| 爱情岛论坛亚洲品质自拍视频网站| 国产mv久久久| 97一区二区国产好的精华液| 色综合电影网| 夜夜嗨一区二区| 中文 日韩 欧美| 久久久影院官网| 黄色小视频在线免费看| 欧美日韩精品一区二区天天拍小说| 日韩一级片免费看| 日韩一区二区三区xxxx| 日本免费一区二区六区| 亚洲影视中文字幕| 成人系列视频| 青青视频在线播放| 成人h精品动漫一区二区三区| 女人裸体性做爰全过| 欧美日韩免费观看中文| 亚洲毛片欧洲毛片国产一品色| 中文字幕av一区二区三区谷原希美| av中文字幕在线观看第一页 | 亚洲老女人av| 91美女福利视频| 日本在线视频免费| 亚洲成a人片在线不卡一二三区| 中文字幕人妻一区二区在线视频 | 99亚洲精品| 精品伦一区二区三区| 亚洲视频图片小说| 91成人国产综合久久精品| 精品亚洲国产成av人片传媒| 欧美女同一区| 91网免费观看| 欧美精品一线| 超级砰砰砰97免费观看最新一期| 国产精品毛片高清在线完整版| 免费黄色片视频| 亚洲天堂av在线免费| 国偷自产一区二区免费视频| 九九九九精品| 亚洲日本成人| 国产一级黄色录像| 亚洲国产视频一区二区| 99精品视频99| 精品粉嫩aⅴ一区二区三区四区| 91一区二区三区在线| 亚洲va男人天堂| 中国精品18videos性欧美| 日本中文字幕观看| 中文字幕一区不卡| 国产精品特级毛片一区二区三区| 色婷婷**av毛片一区| www.成人在线视频| 影音先锋在线亚洲| 国产资源在线一区| 久久黄色免费网站| 精品粉嫩超白一线天av| 国产传媒在线观看| 另类小说综合网| 免费亚洲一区| 高清国产在线观看| 一区二区三区在线观看动漫| 国产精品无码专区av免费播放| 久久中文字幕在线视频| 欧美二区观看| 久久99久久99精品| 奇米四色…亚洲| 久草福利资源在线| 日韩午夜在线影院| sm性调教片在线观看 | 日本在线视频1区| 日本午夜在线亚洲.国产| 欧美日韩中文字幕一区二区三区| 午夜免费福利视频在线观看| 亚洲欧美日韩一区二区| 欧洲成人一区二区三区| 欧美亚洲在线播放| 日韩中文欧美| 秘密基地免费观看完整版中文| 红桃视频成人在线观看| fc2在线中文字幕| av电影成人| 蘑菇福利视频一区播放| 黄色一级片一级片| 精品奇米国产一区二区三区| 芒果视频成人app| 在线观看免费黄色片| 99国内精品久久| 一级黄色片免费| 性色av一区二区三区在线观看| 欧美色网址大全| 性感美女一区二区三区| 91精品办公室少妇高潮对白| 超碰个人在线| 青娱乐一区二区| 国产成人av电影免费在线观看| 波多野结衣在线观看一区| 欧美国产日韩视频| 狠狠做六月爱婷婷综合aⅴ| 亚洲av无日韩毛片久久| 福利微拍一区二区| 精品176二区| 欧美日韩大片一区二区三区| 国产91在线|亚洲| 中文字幕精品一区二区精| 午夜精品福利电影| 中文不卡在线|