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

Nacos + 適配器 動態實現 OSS 無感切換!

開發
在一個微服務項目里,倘若我們要修改具體使用的云存儲廠商,就會致使 controller 層和 service 層發生變動,這并不符合低耦合的理念。在這種情況下,我們完全可以采用適配器模式來開展項目開發!

在一個微服務項目里,我們的 OSS 云存儲服務常常需要配置諸如阿里云、騰訊云、minio 等多個云存儲廠商的業務代碼,而且后續無法確保是否會增添新的云存儲廠商。

此時,倘若我們要修改具體使用的云存儲廠商,就會致使 controller 層和 service 層發生變動,這并不符合低耦合的理念。

在這種情況下,我們完全可以采用適配器模式來開展項目開發!

之前也介紹過另外一種封裝,看陳某之前的文章:《企業級的OSS對象存儲服務,這樣封裝萬能好用!

一、適配器模式改造

MinioUtils和AliyunUtils被適配者類作為源接口執行原子性操作的具體邏輯各不相同,想要把多個OSS共用一個相同的接口返回,就需要使用到適配器模式。

1. 被適配器類

@Component
publicclass MinioUtil {
    @Resource
    private MinioClient minioClient;

    /**
     * 創建Bucket桶(文件夾目錄)
     */
    public void createBucket(String bucket) throws Exception {
        boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
        if(!exists) { //不存在創建
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
        }
    }

    /**
     * 上傳文件
     * inputStream:處理文件的輸入流
     * bucket:桶名稱
     * objectName:桶中的對象名稱,也就是上傳后的文件在存儲桶中的存儲路徑和文件名。
     * stream(inputStream:處理文件的輸入流,-1:指定緩沖區大小的參數[-1為默認大小], 5242889L:指定文件內容長度的上限)
     */
    public void uploadFile(InputStream inputStream, String bucket, String objectName) throws Exception {
        minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
                .stream(inputStream, -1, 5242889L).build());
    }


}

這是目標接口 **(目標抽象類,即客戶需要的方法)**,我們想要的不同OSS都可通過該接口進行操作:

/**
 * 為了方便切換任何一個oss,我們將公共方法抽取為接口,由某個oss的實現類去編寫具體邏輯
 */
public interface StorageAdapter {
    /**
     * 創建bucket
     * @param bucket
     */
    void createBucket(String bucket);

    /**
     * 上傳文件
     * @param multipartFile
     * @param bucket
     * @param objectName
     */
    void uploadFile(MultipartFile multipartFile, String bucket, String objectName);

    /**
     * 獲取文件在oss中的url
     * @param bucket
     * @param objectName
     * @return
     */
    String getUrl(String bucket, String objectName);

}

2. Minio適配器類

通過繼承或者組合方式,將被適配者類(minioUtils)的接口與目標抽象類的接口轉換起來,使得客戶端可以按照目標抽象類的接口進行操作。

/**
 * Minio相關操作的具體邏輯
 */
@Log4j2
publicclass MinioStorageAdapter implements StorageAdapter {

    @Resource
    private MinioUtil minioUtil;

    @Value("${minio.url}")
    private String url;

    @Override
    @SneakyThrows//Lombok中的注解 會在編譯期補上異常處理
    public void createBucket(String bucket) {
        minioUtil.createBucket(bucket);
    }

    /**
     * 上傳文件
     * @param multipartFile
     * @param bucket
     * @param objectName 為空,文件路徑為根目錄;不為空,文件路徑為objectName目錄下
     */
    @Override
    @SneakyThrows
    public void uploadFile(MultipartFile multipartFile, String bucket, String objectName) {
        minioUtil.createBucket(bucket);
        if(objectName != null) {
            minioUtil.uploadFile(multipartFile.getInputStream(), bucket, objectName + "/" + multipartFile.getOriginalFilename());
        } else {
            minioUtil.uploadFile(multipartFile.getInputStream(), bucket, multipartFile.getOriginalFilename());
        }
    }

    /**
     * 獲取文件在oss中的url
     * @param bucket
     * @param objectName
     * @return
     */
    @Override
    public String getUrl(String bucket, String objectName) {
        return url + "/" + bucket + "/" + objectName;
    }


}

3. Aliyun適配器類

/**
 * 阿里云oss 具體實現邏輯
 */
publicclass AliStorageAdapter implements StorageAdapter {

    @Override
    public void createBucket(String bucket) {
        System.out.println("aliyun");
    }

    @Override
    public void uploadFile(MultipartFile multipartFile, String bucket, String objectName) {

    }

    @Override
    public String getUrl(String bucket, String objectName) {
        return"aliyun";
    }

}

二、定義StorageConfig類來獲取指定的文件適配器

通過Nacos的動態配置讀取來得到當前的storageType。

此時如果想再加入一個新的OSS對象(得到xxUtils jar包等,我們無法進行修改),只需新增一個xxadapter適配器類且在@Bean注解的方法中加一個else即可。

注意:這里直接使用new的方式創建實現類(實現類也不需要使用@Service注解),而不是先把所有的實現類通過注解定義出來,再直接返回對象,這樣如果新增一個OSS的話,不光要加else,還需再把實現類通過直接定義出來。

@Configuration
publicclass StorageConfig {
    @Value("${storage.service.type}")
    private String storageType;
    @Bean
    public StorageAdapter storageAdapter() {
        if("minio".equals(storageType)) {
            returnnew MinioStorageAdapter();
        } elseif("aliyun".equals(storageType)) {
            returnnew AliStorageAdapter();
        } else {
            thrownew IllegalArgumentException("為找到對應的文件存儲處理器");
        }
    }
}

三、新增FileService防腐

提高可維護性:

/**
 * FileService防腐層 
 使用fileService(相當于domain防腐層)與adapter(相當于service層只做原子性操作)進行交互、Utils相當于dao層
 */
@Component
publicclass FileService {
    /**
     * 通過構造函數注入
     */
    privatefinal StorageAdapter storageAdapter;

    public FileService(StorageAdapter storageAdapter) {
        this.storageAdapter = storageAdapter;
    }

    /**
     * 創建bucket
     * @param bucket
     */
    public void createBucket(String bucket) {
        storageAdapter.createBucket(bucket);
    }

    /**
     * 上傳圖片、返回圖片在minio的地址
     * @param multipartFile
     * @param bucket
     * @param objectName
     */
    public String uploadFile(MultipartFile multipartFile, String bucket, String objectName) {
        storageAdapter.uploadFile(multipartFile, bucket, objectName);
        objectName = (StringUtils.isEmpty(objectName) ? "" : objectName + "/") + multipartFile.getOriginalFilename();
        return storageAdapter.getUrl(bucket, objectName);
    }
}

四、Controller層

Controller層通過注入FileService來進行操作:

@RestController
@Log4j2
publicclass FileController {
    @Resource//根據名稱注入
    private FileService fileService;

    /**
     * 上傳文件, 返回文件在oss中的地址
     * @param uploadFile:文件, getOriginalFilename獲取原始文件名
     * @param bucket:桶名稱
     * @param objectName:上傳后的文件在存儲桶中的存儲路徑(存儲目錄)
     * @return String: 返回文件在minio的鏈接地址
     */
    @PostMapping("/upload")
    public Result<String> upload(MultipartFile uploadFile, String bucket, String objectName) throws Exception {
        try {
            Preconditions.checkArgument(!ObjectUtils.isEmpty(uploadFile), "文件不能為空");
            Preconditions.checkArgument(!StringUtils.isEmpty(bucket), "bucket桶名稱不能為空");
            if(log.isInfoEnabled()) {
                log.info("FileController.upload.uploadFile:{}, bucket:{}, objectName:{}", uploadFile.getOriginalFilename(), bucket, objectName);
            }
            String url = fileService.uploadFile(uploadFile, bucket, objectName);
            return Result.ok(url);
        } catch (Exception e) {
            log.info("FileController.upload.error:{}", e.getMessage(), e);
            return Result.fail("上傳文件失敗");
        }
    }

}

五、Nacos搭建

1. Nacos部署

服務器需開啟8848、9848端口:

docker search nacos
docker pull nacos/nacos-server
# 鏡像拉完之后,啟動腳本
docker run -d \
  --name nacos \
  --privileged  \
  --cgroupns host \
  --env JVM_XMX=256m \
 --env MODE=standalone \
  --env JVM_XMS=256m \
  -p 8848:8848/tcp \
  -p 9848:9848/tcp \
  --restart=always \
  -w /home/nacos \
  nacos/nacos-server

(1) privileged:賦予容器擴展的特權

(2) cgroupns host:讓容器使用宿主機的 cgroup 命名空間(在資源限制方面容器會遵循宿主機規則)

(3) env:設置Nacos服務使用的jvm參數

  • JVM_XMX:最大堆內存為 256m
  • JVM_XMS:初始堆內存為 256 m

(4) env MODE=standalone:nacos運行模式為單機模式

(5) w /home/nacos:指定容器內的工作目錄為 “/home/nacos”,容器內執行的命令如果涉及到相對路徑的操作,就會以這個目錄作為當前工作目錄的基準。

(6) 8848:Nacos服務端端口

(7) 9848:客戶端gRPC請求服務端端口

2. 引入nacos客戶依賴

除了引入nacos依賴,還要引入log4j2依賴,來輸出nacos日志信息。

SpringCloudAlibaba 版本為2.2.6.RELEASE時,springboot版本要為2.3.8.RELEASE:

<!--nacos依賴(配合日志,打印nacos信息)-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <version>2.4.2</version>
</dependency>

3. 編寫配置文件

把nacos相關配置寫入bootstrap.yml文件中,項目啟動后會優先讀取。

spring:
  application:
    name:jc-club-oss#微服務名稱
profiles:
    active:dev#指定環境為開發環境
cloud:
    nacos:
      server-addr:117.72.118.73:8848
      config:
        file-extension:yaml#文件后綴名

4. 新增配置管理

dataId:jc-club-oss-dev.yaml 服務名稱+開發環境.yaml。

配置內容:

這時spring會根據bootstrap.yml文件中的${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作為文件id,來讀取配置。

5. 添加@RefreshScope注解開啟熱更新

  • 在@Value注入的變量所在類上添加注解@RefreshScop,當配置文件內容發生變化后會重新讀取
  • 當文件更新后,Bean已加入到了IOC容器,即使storageType屬性值變了,Bean也無法重新加載。
  • 所以在@Bean方法上也要加入@RefreshScop注解,當文件更新后,帶有此注解的Bean能夠自動重新初始化
@Configuration
@RefreshScope
publicclass StorageConfig {

    @Value("${storage.service.type}")
    private String storageType;
    
    @Bean
    @RefreshScope
    public StorageAdapter storageAdapter() {
        if("minio".equals(storageType)) {
            returnnew MinioStorageAdapter();
        } elseif("aliyun".equals(storageType)) {
            returnnew AliStorageAdapter();
        } else {
            thrownew IllegalArgumentException("為找到對應的文件存儲處理器");
        }
    }
}

6. 測試

(1) type為阿里云

結果為:成功返回aliyun

(2) 修改屬性為minio

結果為:圖片成功上傳。

在配置文件更新時,nacos也會打印出對應的日志提示:

2024-12-03 17:05:50.719  INFO 35932 --- [.72.118.73_8848] o.s.c.e.e.RefreshEventListener           : Refresh keys changed: [storage.service.type]
責任編輯:趙寧寧 來源: 碼猿技術專欄
相關推薦

2012-09-19 15:29:26

Worklight適配器

2020-10-25 08:56:21

適配器模式

2022-02-18 17:21:29

適配器模式客戶端

2024-04-10 12:27:43

Python設計模式開發

2021-02-18 08:39:28

設計模式場景

2015-08-07 10:05:37

recyclervie超省寫法

2013-11-26 16:39:21

Android設計模式

2012-05-16 17:22:11

Java設計模式

2009-12-21 10:26:09

Oracle適配器

2018-10-11 10:38:31

前端JavaScript編程語言

2009-11-18 18:08:20

PHP適配器模式

2021-02-16 08:16:09

適配器模式MybatisJava

2021-08-06 06:51:16

適配器配置Spring

2022-02-13 23:33:24

設計模式Java

2014-12-17 09:57:01

AndroidAdapteViewHolder

2011-04-28 09:54:50

jQuery

2013-02-26 10:55:47

C#適配器設計模式

2014-07-17 10:55:10

Win8.1應用開發適配器模式

2012-08-02 10:46:34

JavaAdapter模式

2024-02-22 12:13:49

適配器模式代碼
點贊
收藏

51CTO技術棧公眾號

国产午夜精品福利| 一级黄色在线视频| 肉肉视频在线观看| 不卡的av网站| 一道本在线免费视频| 少妇人妻精品一区二区三区| 国产亚洲毛片在线| 亚洲欧美高清| 国产一区二区三区视频在线| 欧美高清在线视频| 91传媒视频在线观看| 久久久综合久久| 国产精品一区二区av交换| 91精品国产综合久久福利软件 | 日本黑人久久| 曰韩精品一区二区| 一区二区三区四区视频免费观看| 一区二区三区免费高清视频| 粉嫩av免费一区二区三区| 亚洲精品视频一区二区| 中文字幕一区二区三区中文字幕 | 精品欧美一区二区久久久| 日韩一区和二区| 成人高清av| 日韩中文字幕影院| 91在线中文| 日韩av一区二区在线影视| 欧美另类在线播放| 免费一级suv好看的国产网站| avtt综合网| 7777精品伊人久久久大香线蕉的 | 老司机午夜在线| 91看片淫黄大片一级在线观看| 91免费精品国偷自产在线| 黄色av网站免费| 99热精品在线观看| 色综合久久久888| 黄色裸体一级片| 久草成人资源| 日韩精品有码在线观看| 久久久精品人妻一区二区三区| 国产黄色一区| 欧美亚洲动漫制服丝袜| 中国丰满人妻videoshd| 欧洲精品在线一区| 中文字幕+乱码+中文| 亚洲欧美日韩在线观看a三区| 久久6精品影院| 国产jizz18女人高潮| 极品美女一区二区三区| 亚洲人成免费| 97视频在线观看播放| 妺妺窝人体色www婷婷| 亚洲区综合中文字幕日日| 中文字幕日韩综合av| 日韩欧美一级视频| 亚洲小说欧美另类婷婷| 欧美成人亚洲成人| 久久高清内射无套| 欧美一区二区三区久久精品| 久久视频免费在线播放| 亚洲天堂一级片| 永久亚洲成a人片777777| 中文字幕日韩在线视频| 国产免费美女视频| 91精品国产乱码久久久久久| 久久色精品视频| www.xxxx日本| 黄色日韩精品| 9.1国产丝袜在线观看| 国产成人精品一区二三区| 久久不射中文字幕| 国产精品视频在线播放| 亚洲av无日韩毛片久久| 国产一级精品视频| 亚洲少妇在线| 97在线观看视频| 国产女同在线观看| 午夜在线a亚洲v天堂网2018| 国产成人久久精品| 最近中文字幕在线观看视频| 三级精品在线观看| 成人精品网站在线观看| 性生活黄色大片| av不卡一区二区三区| 国产亚洲欧美一区二区三区| 日韩一区二区三区中文字幕| 久久午夜免费电影| 亚洲国产高清国产精品| 黄色精品在线观看| 亚洲国产一区二区三区青草影视 | а 天堂 在线| 欧美视频二区欧美影视| 蜜桃av噜噜一区二区三区| 天堂av网在线| 国产欧美日韩麻豆91| 亚洲精品在线免费| 狠狠狠色丁香婷婷综合激情 | 男人天堂av电影| 国产一区二区三区天码| 9i看片成人免费看片| 欧美猛男男男激情videos| 一个人www欧美| fc2ppv在线播放| 日韩午夜黄色| 深夜福利在线观看直播| 久久综合狠狠综合| 亚洲精品日韩在线观看| а天堂中文在线官网| 免费久久99精品国产| 日韩欧美专区在线| 国产ts在线观看| 全球av集中精品导航福利| 久久精品国产在热久久| 国产伦精品一区二区三区精品视频| 亚洲一级在线播放| 成人黄页在线观看| 婷婷四房综合激情五月| 久草在线视频福利| 欧美日韩另类国产亚洲欧美一级| 无码人妻少妇色欲av一区二区| 欧美大奶一区二区| 久久精品成人欧美大片古装| 国产成人自拍视频在线| 麻豆精品在线播放| 久久爱av电影| 亚洲区欧洲区| 欧美性高清videossexo| 欧美一区二区免费在线观看| 俺要去色综合狠狠| 97在线精品视频| 99产精品成人啪免费网站| 久久天天做天天爱综合色| 成年丰满熟妇午夜免费视频| 992tv国产精品成人影院| 日韩国产高清视频在线| 内射一区二区三区| 久久狠狠亚洲综合| 久久久久久久久久久久久久久久av | 在线看片不卡| 久久亚洲电影天堂| 中文在线免费观看| 91在线观看一区二区| 免费视频爱爱太爽了| av日韩久久| 日韩在线播放一区| 国产情侣小视频| 久久久久久久久久久久久久久99| 国产精品无码免费专区午夜| 国产精区一区二区| 日韩少妇与小伙激情| 中文字幕91爱爱| 欧美经典一区二区| 日日躁夜夜躁aaaabbbb| 国产伦精品一区二区三区千人斩 | 久久久久久久毛片| 99av国产精品欲麻豆| 波多野结衣成人在线| a级网站在线播放| 欧美高清视频www夜色资源网| 中文字幕伦理片| 男人的天堂亚洲一区| 欧美一区二区三区四区五区六区 | 欧美综合国产精品久久丁香| 天天操天天舔天天干| 午夜电影网一区| 强迫凌虐淫辱の牝奴在线观看| 一区在线免费观看| 电影午夜精品一区二区三区| 一女被多男玩喷潮视频| 欧洲成人一区| 日韩在线视频线视频免费网站| 伊人久久中文字幕| 中文字幕制服丝袜一区二区三区 | 视频一区国产精品| 99er精品视频| 欧美富婆性猛交| 天天摸天天碰天天爽天天弄| 欧美午夜激情在线| 99成人在线观看| 国产中文字幕精品| 日韩中字在线观看| 欧美亚洲精品在线| 91亚洲va在线va天堂va国| 超级碰碰不卡在线视频| 亚洲美女又黄又爽在线观看| 中文字幕在线观看国产| 亚洲男人天堂av网| 精品人妻一区二区三区日产乱码卜| 亚洲综合社区| 中文字幕一区二区三区最新| 午夜免费欧美电影| 秋霞午夜一区二区| 精品亚洲综合| 欧美va亚洲va国产综合| 亚洲毛片一区二区三区| 最新日韩av在线| 91中文字幕永久在线| 久久99精品国产麻豆婷婷洗澡| 丰满的少妇愉情hd高清果冻传媒| 精品影片在线观看的网站| 91免费人成网站在线观看18| 高清视频在线观看三级| 久久精品久久久久电影| 天天干天天干天天干| 欧美一区二区久久| 久久一区二区三区视频| 亚洲精品视频自拍| 手机看片日韩av| 久久电影网站| 欧美一级夜夜爽| 香蕉污视频在线观看| av中文字幕亚洲| 亚洲a级黄色片| 久久精品亚洲| 成人免费看片'免费看| 日韩久久电影| 国产一区二区三区色淫影院| 成人毛片在线| 国产精品一区=区| 欧美韩日亚洲| 韩国理伦片一区二区三区在线播放| 97精品国产97久久久久久粉红| 欧美aaaaa级| 成人黄色片网站| 欧美成人一二三区| 久久视频在线| 久久精品视频一区二区三区| 91女神在线观看| 伊人久久成人| 亚洲欧美日韩另类精品一区二区三区 | 亚洲欧美综合另类中字| 小向美奈子av| 成人av在线网站| 成人免费福利在线| 国模精品视频一区二区| 色婷婷在线视频观看| 久久久久88色偷偷免费| 日本成人在线免费| 精品一区二区三区影院在线午夜 | 欧美videossexotv100| 欧美brazzers| 欧美日韩午夜剧场| 男女啊啊啊视频| 国产精品19乱码一区二区三区| 国产精品一区二区久久精品爱涩| 欧美污视频网站| 在线国产日韩| 成品人视频ww入口| 欧美日韩四区| 国产911在线观看| 国产欧美在线一区二区| 3d玉蒲团在线观看| 在线免费看av不卡| 日韩二区三区| 亚洲国产精品99久久| 不卡视频在线播放| 91成人免费电影| 黄色污污网站在线观看| 欧美日韩亚洲系列| 国产在线精品观看| 亚洲国产美女搞黄色| 久久久久久久蜜桃| 亚洲综合网站在线观看| 国产精品.www| 亚欧色一区w666天堂| 豆国产97在线 | 亚洲| 亚洲伊人色欲综合网| 欧美黄色免费在线观看| 亚洲在线视频网站| 天堂网av手机版| 色www精品视频在线观看| 久久久久久久久黄色| 色拍拍在线精品视频8848| 加勒比在线一区| 欧美性20hd另类| 国产99久久久久久免费看| 欧美视频一区二区三区四区 | 亚洲精品a级片| 影音先锋成人资源网站| 欧美性久久久| 国产无套粉嫩白浆内谢的出处| 美女在线视频一区| 国内精品国产三级国产aⅴ久| 国产宾馆实践打屁股91| 91精产国品一二三| 久久久久久久久久久黄色| 成年人视频软件| 亚洲视频在线一区观看| 日本一级一片免费视频| 色一区在线观看| 91av久久久| 久久久久久久久久一区二区| 一区二区91| 国内外免费激情视频| 久久精品国产99国产精品| 美女被艹视频网站| 国产91精品一区二区麻豆网站 | 国产成人精品午夜视频免费| 尤物网站在线观看| 国产欧美在线观看一区| 欧美日韩在线观看免费| 色偷偷一区二区三区| 国产露脸91国语对白| 亚洲国产精品va在看黑人| 不卡在线视频| 色综合久久悠悠| 黄色成人在线网| 国产精品久久久久久久av电影 | 福利视频在线播放| 免费99精品国产自在在线| av影片在线| 91色在线观看| 羞羞色国产精品网站| 在线视频不卡国产| 一本久道久久久| 999热精品视频| 国产日韩成人精品| 国产亚洲色婷婷久久99精品| 欧美视频一区在线| 女同性恋一区二区| 亚洲经典三级| 国产v亚洲v天堂无码久久久 | 中文字幕一区二区精品区| 欧美性大战久久久久xxx| 日本中文字幕一级片| 亚洲激情精品| 中文字幕欧美视频| 久久久国产午夜精品 | 神马久久一区二区三区| 只有这里有精品| 爽好久久久欧美精品| 91av在线免费| 高清精品久久| 国产精品日韩欧美一区二区| 欧美大片网站| 精品国产成人系列| 调教视频免费在线观看| 欧美一级淫片aaaaaaa视频| 精品国产一区二区三区在线观看| 天堂中文字幕av| 久久亚洲精品网站| 日韩精品三区| 女同一区二区| 亚洲精品字幕| 午夜性福利视频| 你懂得在线视频| 久久午夜精品一区二区| 免费a v网站| 一级中文字幕一区二区| 精品久久久免费视频| 精品在线你懂的| 九九热免费在线| 欧美日韩午夜视频在线观看| 国产a视频免费观看| 蜜臀久久99精品久久久画质超高清| 成人欧美精品一区二区| 亚洲精品成人悠悠色影视| 国产熟女一区二区三区四区| 久久精品电影一区二区| 成人国产精品久久| 久久久一本精品99久久精品66| 国产亚洲一区在线| 熟女少妇一区二区三区| 午夜视频久久久久久| 亚洲欧洲成人在线| 欧美在线视频网| 欧美中文一区| 国产主播在线看| 国产性做久久久久久| 日本中文字幕在线观看视频| 亚洲人成电影网站色| 亚洲最大成人| 视频一区二区在线观看| 青青草91视频| 国产精品av久久久久久无| 欧美日韩一区在线观看| 好吊日视频在线观看| 亚洲一区免费网站| 黑丝一区二区| 欧美特级黄色录像| 欧美三级一区二区| 看女生喷水的网站在线观看| 91亚洲永久免费精品| 红桃视频亚洲| a级大片在线观看| 欧美妇女性影城| 3d玉蒲团在线观看| 国产精品乱子乱xxxx| 国产精品亚洲产品| 可以免费看av的网址| 欧美一级免费大片| 欧美黑人疯狂性受xxxxx野外| 日韩偷拍一区二区| 国产精品综合视频| 国产一级做a爱片久久毛片a| 国产一区二区三区三区在线观看 | 风间由美一区二区av101| 成人久久久久久久久| 亚洲三级在线观看|