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

Spring Batch在大型企業中的最佳實踐

開發 項目管理
在大型企業中,由于業務復雜、數據量大、數據格式不同、數據交互格式繁雜,并非所有的操作都能通過交互界面進行處理。而有一些操作需要定期讀取大批量的數據,然后進行一系列的后續處理。這樣的過程就是“批處理”。

在大型企業中,由于業務復雜、數據量大、數據格式不同、數據交互格式繁雜,并非所有的操作都能通過交互界面進行處理。而有一些操作需要定期讀取大批量的數據,然后進行一系列的后續處理。這樣的過程就是“批處理”。

database-schema

批處理應用通常有以下特點:

  • 數據量大,從數萬到數百萬甚至上億不等;
  • 整個過程全部自動化,并預留一定接口進行自定義配置;
  • 這樣的應用通常是周期性運行,比如按日、周、月運行;
  • 對數據處理的準確性要求高,并且需要容錯機制、回滾機制、完善的日志監控等。

什么是Spring batch

Spring batch是一個輕量級的全面的批處理框架,它專為大型企業而設計,幫助開發健壯的批處理應用。Spring batch為處理大批量數據提供了很多必要的可重用功能,比如日志追蹤、事務管理、job執行統計、重啟job和資源管理等。同時它也提供了優化和分片技術用于實現高性能的批處理任務。

它的核心功能包括:

  • 事務管理
  • 基于塊的處理過程
  • 聲明式的輸入/輸出操作
  • 啟動、終止、重啟任務
  • 重試/跳過任務
  • 基于Web的管理員接口

筆者所在的部門屬于國外某大型金融公司的CRM部門,在日常工作中我們經常需要開發一些批處理應用,對Spring Batch有著豐富的使用經驗。近段時間筆者特意總結了這些經驗。

[[181641]]

使用Spring Batch 3.0以及Spring Boot

在使用Spring Batch時推薦使用最新的Spring Batch 3.0版本。相比Spring Batch2.2,它做了以下方面的提升:

  • 支持JSR-352標準
  • 支持Spring4以及Java8
  • 增強了Spring Batch Integration的功能
  • 支持JobScope
  • 支持SQLite

支持Spring4和Java8是一個重大的提升。這樣就可以使用Spring4引入的Spring boot組件,從而開發效率方面有了一個質的飛躍。引入Spring-batch框架只需要在build.gradle中加入一行代碼即可:

compile("org.springframework.boot:spring-boot-starter-batch")

而增強Spring Batch Integration的功能后,我們就可以很方便的和Spring家族的其他組件集成,還可以以多種方式來調用job,也支持遠程分區操作以及遠程塊處理。

而支持JobScope后我們可以隨時為對象注入當前Job實例的上下文信息。只要我們指定Bean的scope為job scope,那么就可以隨時使用jobParameters和jobExecutionContext等信息。

@Component
@JobScope
public class CustomClass {

    @Value("#{jobParameters[jobDate]}")
    private String jobDate;

    @Value("#{jobExecutionContext['input.name']}.")
    private String fileName;
}

使用Java Config而不是xml的配置方式

之前我們在配置job和step的時候都習慣用xml的配置方式,但是隨著時間的推移發現問題頗多。

  • xml文件數急劇膨脹,配置塊長且復雜,可讀性很差;
  • xml文件缺少語法檢查,有些低級錯誤只有在運行集成測試的時候才能發現;
  • 在xml文件中進行代碼跳轉時IDE的支持力度不夠;

我們漸漸發現使用純Java類的配置方式更靈活,它是類型安全的,而且IDE的支持更好。在構建job或step時采用的流式語法相比xml更加簡潔易懂。

@Bean
public Step step(){
    return stepBuilders.get("step")
        .chunk(1)
        .reader(reader())
        .processor(processor())
        .writer(writer())
        .listener(logProcessListener())
        .faultTolerant()
        .skipLimit(10)
        .skip(UnknownGenderException.class)
        .listener(logSkipListener())
        .build();
}

在這個例子中可以很清楚的看到該step的配置,比如reader/processor/writer組件,以及配置了哪些listener等。

本地集成測試中使用內存數據庫

Spring batch在運行時需要數據庫支持,因為它需要在數據庫中建立一套schema來存儲job和step運行的統計信息。而在本地集成測試中我們可以借助Spring batch提供的內存Repository來存儲Spring batch的任務執行信息,這樣既避免了在本地配置一個數據庫,又可以加快job的執行。先為Job的配置類添加擴展類:DefaultBatchConfigurer。

public class CustomJobConfiguration extends DefaultBatchConfigurer {

    ...
}

我們在build.gradle中加入對hsqldb的依賴:

runtime(‘org.hsqldb:hsqldb:2.3.2’)

然后在測試類中添加對DataSource的配置。

@EnableAutoConfiguration
@EnableBatchProcessing
@DataJpaTest
@Import({DataSourceAutoConfiguration.class, BatchAutoConfiguration.class})
public class TestConfiguration {

}

并且在applicaton.properties配置中添加初始化Database的配置:

spring.batch.initializer.enable=true

合理的使用Chunk機制

Spring batch在配置Step時采用的是基于Chunk的機制。即每次讀取一條數據,再處理一條數據,累積到一定數量后再一次性交給writer進行寫入操作。這樣可以最大化的優化寫入效率,整個事務也是基于Chunk來進行。

當我們在需要將數據寫入到文件、數據庫中之類的操作時可以適當設置Chunk的值以滿足寫入效率最大化。但有些場景下我們的寫入操作其實是調用一個web service或者將消息發送到某個消息隊列中,那么這些場景下我們就需要設置Chunk的值為1,這樣既可以及時的處理寫入,也不會由于整個Chunk中發生異常后,在重試時出現重復調用服務或者重復發送消息的情況。

使用Listener來監視job執行情況并及時做相應的處理

Spring batch提供了大量的Listener來對job的各個執行環節進行全面的監控。

在job層面Spring batch提供了JobExecutionListener接口,其支持在Job開始或結束時進行一些額外處理。在step層面Spring batch提供了StepExecutionListener,ChunkListener,ItemReadListener,ItemProcessListener,ItemWriteListener,SkipListener等接口,同時對Retry和Skip操作也提供了RetryListener及SkipListener。

通常我們會為每個job都實現一個JobExecutionListener,在afterJob操作中我們輸出job的執行信息,包括執行時間、job參數、退出代碼、執行的step以及每個step的詳細信息。這樣無論是開發、測試還是運維人員都對整個job的執行情況了如指掌。

如果某個step會發生skip的操作,我們也會為其實現一個SkipListener,并在其中記錄skip的數據條目,用于下一步的處理。

實現Listener有兩種方式,一種是繼承自相應的接口,比如繼承JobExecutionListener接口,另一種是使用annoation(注解)的方式。經過實踐我們認為使用注解的方式更好一些,因為使用接口你需要實現接口的所有方法,而使用注解則只需要對相應的方法添加annoation即可。

下面的這個類采用了繼承接口的方式,我們看到其實我們只用到了第一個方法,第二個和第三個都沒有用到。但是我們必須提供一個空的實現。

public class CustomSkipListener implements SkipListener {
    @Override
    public void onSkipInRead(Throwable t) {
        // business logic
    }

    @Override
    public void onSkipInWrite(String item, Throwable t) {
        // no need
    }

    @Override
    public void onSkipInProcess(String item, Throwable t) {
        // no need
    }
}

而使用annoation的方式可以簡寫為:

public class CustomSkipListener {
    @OnSkipInRead
    public void onSkipInRead(Throwable t) {
        // business logic
    }
}

使用Retry和Skip增強批處理工作的健壯性

在處理百萬級的數據過程過程中難免會出現異常。如果一旦出現異常而導致整個批處理工作終止的話那么會導致后續的數據無法被處理。Spring Batch內置了Retry(重試)和Skip(跳過)機制幫助我們輕松處理各種異常。我們需要將異常分為三種類型。第一種是需要進行Retry的異常,它們的特點是該異常可能會隨著時間推移而消失,比如數據庫目前有鎖無法寫入、web服務當前不可用、web服務滿載等。所以對它們適合配置Retry機制。第二種是需要Skip的異常,比如解析文件的某條數據出現異常等,因為對這些異常即使執行Retry每次的結果也都是相同,但又不想由于某條數據出錯而停止對后續數據的處理。第三種異常是需要讓整個Job立刻失敗的異常,比如如果出現了OutOfMemory的異常,那么需要整個Job立刻終止運行。

一般來說需要Retry的異常也要配置Skip選項,從而保證后續的數據能夠被繼續處理。我們也可以配置SkipLimit選項保證當Skip的數據條目達到一定數量后及時終止整個Job。

有時候我們需要在每次Retry中間隔做一些操作,比如延長Retry時間,恢復操作現場等,Spring Batch提供了BackOffPolicy來達到目的。下面是一個配置了Retry機制、Skip機制以及BackOffPolicy的step示例。

@Bean
public Step step(){
    return stepBuilders.get("step")
        .chunk(1)
        .reader(reader())
        .processor(processor())
        .writer(writer())
        .listener(logProcessListener())
        .faultTolerant()
        .skipLimit(10)
        .skip(UnknownGenderException.class)
        .skip(ServiceUnavailableException.class)
        .retryLimit(5)
        .retry(ServiceUnavailableException.class)
        .backOffPolicy(backoffPolicy)
        .listener(logSkipListener())
        .build();
}

使用自定義的Decider來實現Job flow

在Job執行過程中不一定都是順序執行的,我們經常需要根據某個job的輸出數據或執行結果來決定下一步的走向。以前我們會把一些判斷放置在下游step中進行,這樣可能會導致有些step實際運行了,但其實并沒有做任何事情。比如一個step執行過程中會將失敗的數據條目記錄到一個報告中,而下一個step會判斷有沒有生成報告,如果生成了報告則將該報告發送給指定聯系人,如果沒有則不做任何事情。這種情況下可以通過Decider機制來實現Job的執行流程。在Spring batch 3.0中Decider已經從Step中獨立出來,和Step處于同一級別。

public class ReportDecider implements JobExecutionDecider {
    @Override
    public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
        if (report.isExist()) {
            return new FlowExecutionStatus(“SEND");         }          return new FlowExecutionStatus(“SKIP");
    }
}

而在job配置中可以這樣來使用Decider。這樣整個Job的執行流程會更加清晰易懂。

public Job job() {
    return new JobBuilder("petstore")
        .start(orderProcess())
        .next(reportDecider)
        .on("SEND").to(sendReportStep)
        .on("SKIP").end().build()
        .build();
}

采用多種機制加速Job的執行

批處理工作處理的數據量大,而執行窗口一般又要求比較小。所以必須要通過多種方式來加速Job的執行。一般我們有四種方式來實現:

  • 在單個step中多線程執行任務
  • 并行執行不同的Step
  • 并行執行同一個Step
  • 遠程執行Chunk任務

單個step多線程執行任務可以借助于taskExecutor來實現。這種情況適合于reader、writer是線程安全且是無狀態的場景。我們還可以設置線程數量。

public Step step() {
    return stepBuilders.get("step")
        .tasklet(tasklet)
        .throttleLimit(20)
        .build();
}

上述示例中的tasklet需要實現TaskExecutor,Spring Batch提供了一個簡單的多線程TaskExecutor供我們使用:SimpleAsyncTaskExecutor。

并行執行不同的Step在Spring batch中很容易實現,以下是一個示例:

public Job job() {
    return stepBuilders.get("parallelSteps")
        .start(step1)
        .split(asyncTaskExecutor).add(flow1, flow2)
        .next(step3)
        .build();
}

在這個示例中我們先執行step1,然后并行執行flow1和flow2,最后再執行step3。

Spring batch提供了PartitionStep來實現對同一個step在多個進程中實現并行處理。通過PartitonStep再配合PartitionHandler可以將一個step擴展到多個Slave上實現并行運行。

遠程執行Chunk任務則是將某個Step的processer操作分割到多個進程中,多個進程通過一些中間件進行通訊(比如采用消息的方式)。這種方式適合于Processer是瓶頸而Reader和Writer不是瓶頸的場景。

結語

Spring Batch對批處理場景進行了合理的抽象,封裝了大量的實用功能,使用它來開發批處理應用可以達到事半功倍的效果。在使用的過程中我們仍需要堅持總結一些最佳實踐,從而能夠交付高質量的可維護的批處理應用,滿足企業級應用的苛刻要求。

責任編輯:張燕妮 來源: 無敵北瓜
相關推薦

2009-11-26 10:31:55

配置IPS最佳實踐

2012-12-07 10:17:37

IBMdW

2014-09-12 10:53:08

路由華為

2021-03-18 10:57:34

漏洞企業企業安全治理

2023-08-07 10:14:39

數字化轉型企業

2009-06-25 18:37:11

云計算虛擬化服務器

2012-07-25 15:17:00

IT運維架構

2009-06-11 11:32:12

開源安全

2009-06-29 10:14:44

云計算

2013-08-02 13:39:58

2013-12-17 10:45:39

saas社交化云計算

2016-06-06 13:00:06

云計算私有云

2022-05-07 10:34:09

企業CIO業務戰略

2013-12-17 19:49:06

社交化協作

2012-04-25 15:18:58

BYODUC統一通信

2011-12-27 15:42:13

2010-09-29 09:59:27

2024-03-29 08:03:48

單元測試流量

2012-01-16 08:35:32

云計算大型企業

2011-09-21 10:15:57

惠普激光打印機
點贊
收藏

51CTO技術棧公眾號

亚洲中文字幕无码一区| 亚洲国产精品视频一区| 久久久精品福利| 精品国产一区一区二区三亚瑟| 91久久一区二区| 在线视频不卡一区二区| 囯产精品久久久久久| 先锋a资源在线看亚洲| 在线精品国产成人综合| 国产在线观看免费播放| 欧美色999| 亚洲综合丁香婷婷六月香| 欧美极品一区| 国产片高清在线观看| 男女精品网站| 欧美成人激情视频免费观看| 免费在线观看成年人视频| 亚洲伦理久久| 日韩欧亚中文在线| 欧美狂野激情性xxxx在线观| 成人性爱视频在线观看| 成人不卡免费av| 91精品久久久久久久| 男人天堂2024| 激情综合电影网| 久久精品国产亚洲一区二区| 天堂久久久久久| 亚洲日本va午夜在线电影| 欧美性猛交xxxxxxxx| 熟女少妇在线视频播放| 超碰porn在线| 中文字幕一区二区三区四区 | 精品少妇一区二区30p| 大又大又粗又硬又爽少妇毛片 | 日韩久久精品成人| 欧美69精品久久久久久不卡| 国产精品久久久久久妇女| 欧美性猛交xxxx乱大交蜜桃| 国产一级做a爰片久久毛片男| 天堂资源在线中文| 国产午夜精品久久久久久免费视| 国产伦精品一区二区三区免费视频| 亚洲一卡二卡在线观看| 日本在线不卡视频一二三区| 欧美在线视频一区| 日本少妇毛茸茸高潮| 欧美日韩精品| 欧美成在线观看| 精品人妻伦九区久久aaa片| 欧美亚洲激情| 自拍视频国产精品| 超碰97av在线| 久久免费大视频| 有码中文亚洲精品| 国产精品情侣呻吟对白视频| 全球成人免费直播| 中文字幕国产亚洲| 日本女人性生活视频| 欧美自拍偷拍| 日韩在线视频网站| 国产成人久久久久| 欧美高清不卡| 亚洲2020天天堂在线观看| 日本亚洲欧美在线| 国产精品嫩草99av在线| 欧美亚洲第一页| 波多野结衣电影在线播放| 视频一区在线视频| 国产精品男人的天堂| 在线视频 91| 国产中文字幕精品| 懂色中文一区二区三区在线视频| 丰满人妻一区二区三区免费| 播五月开心婷婷综合| 欧美亚洲另类久久综合| 波多野结衣一区二区| 中文字幕一区二区三中文字幕| 精品国产无码在线| 大香伊人中文字幕精品| 欧美午夜片在线免费观看| 手机在线看福利| 亚洲一区导航| 337p日本欧洲亚洲大胆精品| 香蕉视频黄色在线观看| 日韩精品电影| 欧美激情免费视频| 天堂网免费视频| 麻豆国产欧美日韩综合精品二区| 91成人免费看| 九九在线视频| 一区二区在线观看免费| 免费看日本毛片| 亚洲日本在线观看视频| 日韩欧美综合一区| 国产精品无码一区二区三区| 国产伦精品一区二区三区视频| 北条麻妃久久精品| 可以在线观看av的网站| 精品亚洲成av人在线观看| yy111111少妇影院日韩夜片| 国产香蕉在线| 亚洲一二三级电影| 一区二区三区国产免费| 综合欧美亚洲| 中文字幕日韩免费视频| 日本污视频在线观看| 免费视频最近日韩| 国产一区二区三区黄| 日本在线观看| 欧美日韩亚洲系列| 91欧美一区二区三区| 亚洲色图丝袜| 欧美精品18videosex性欧美| 伊人久久亚洲综合| 91在线精品一区二区| 2021狠狠干| 成人在线免费av| 亚洲成人黄色网| av成人免费网站| 青青青伊人色综合久久| 久久99精品久久久久久三级| 国产写真视频在线观看| 欧美无乱码久久久免费午夜一区| 欧美无人区码suv| 欧美成熟视频| 91久久精品国产91久久性色| www.亚洲视频| 欧洲国内综合视频| 久久久久久久久久久国产精品| 欧美日本精品| 亚洲一区中文字幕| 麻豆系列在线观看| 欧美日韩成人激情| 天天舔天天操天天干| 美女诱惑一区| 久久国产精品一区二区三区四区| 国产色婷婷在线| 日韩一区二区免费在线电影| 男人的午夜天堂| 奇米综合一区二区三区精品视频| 欧美日韩在线观看一区二区三区| 波多野一区二区| 亚洲国产精品va在线| 国产性生活网站| 国产成人精品一区二| 久久男人资源站| 大奶在线精品| 欧美精品18videos性欧| 人妻少妇精品无码专区| 亚洲国产美国国产综合一区二区 | 99视频精品全部免费在线| 日韩精品久久一区二区| 视频在线亚洲| 欧美激情视频给我| 日韩一级片免费在线观看| 亚洲二区在线视频| 久久久国产精品无码| 亚洲一区二区成人| 欧美人xxxxx| 国产福利亚洲| 久久久精品免费| www.热久久| 亚洲不卡在线观看| 国产艳俗歌舞表演hd| 久色成人在线| 亚洲精品日韩成人| avtt久久| 久久久久久中文| 四虎精品成人免费网站| 一本久道久久综合中文字幕 | 天堂中文av在线| 牛牛国产精品| 久久av一区二区三区漫画| 天堂av中文在线观看| 亚洲天堂男人的天堂| 中文字幕+乱码+中文乱码www| 成人欧美一区二区三区白人| 日本少妇xxx| 国产精品五区| 国产精品99久久久久久大便| youjizz亚洲| 欧洲精品毛片网站| 国产黄大片在线观看画质优化| 日韩三级免费观看| 无码人妻一区二区三区线| 国产精品久久福利| 国产高潮视频在线观看| 蜜桃久久av| 激情视频小说图片| 夜夜躁狠狠躁日日躁2021日韩| 国产精品自拍偷拍视频| 里番在线播放| 中文字幕久久久av一区| 亚洲国产中文字幕在线| 91黄视频在线观看| 欧美久久久久久久久久久久| 久久精品免费在线观看| 亚洲日本黄色片| 国产农村妇女精品一二区| 一区二区三区三区在线| 神马日本精品| 亚洲一区二区三区成人在线视频精品| 高清精品在线| 久热精品在线视频| 国产亚洲依依| 亚洲国产精品一区二区三区| 一二三区在线播放| 精品国产31久久久久久| 蜜臀av午夜精品久久| 久久久国产午夜精品| 久久久久久久穴| 久久成人麻豆午夜电影| 少妇性饥渴无码a区免费| 在线中文字幕第一区| 欧美深深色噜噜狠狠yyy| 成人激情自拍| 亚洲最大福利网站| 四虎影视国产精品| 国产极品jizzhd欧美| 91桃色在线观看| 欧美男插女视频| 久久bbxx| 日韩中文在线中文网三级| 青青草av免费在线观看| 亚洲成人a**站| 精品人妻av一区二区三区| 欧美视频日韩视频在线观看| 国产奶水涨喷在线播放| 亚洲男人的天堂一区二区| www久久久久久久| 久久伊人中文字幕| 成熟妇人a片免费看网站| 国产精品自拍毛片| 国产女同无遮挡互慰高潮91| 日韩成人精品在线| 精品久久久噜噜噜噜久久图片| 一本不卡影院| www.日本在线播放| 欧美日韩亚洲国产精品| 狠狠精品干练久久久无码中文字幕| 99久久婷婷国产综合精品电影√| 日本视频一区二区不卡| 国产一区二区三区电影在线观看 | 精品久久香蕉国产线看观看gif| 五月婷婷一区二区| 亚洲欧美激情在线| 午夜国产福利一区二区| 亚洲婷婷综合色高清在线| 免费成人美女女在线观看| 国产精品国产三级国产aⅴ原创| www.av天天| 国产精品天美传媒沈樵| a级黄色免费视频| 久久久精品人体av艺术| 亚洲精品色午夜无码专区日韩| 久久综合久久综合久久| 极品白嫩丰满美女无套| 久久久另类综合| 成人激情五月天| 中文字幕高清不卡| 精品一区二区在线观看视频| 最好看的中文字幕久久| 午夜写真片福利电影网| 亚洲高清不卡在线| 欧美另类一区二区| 在线亚洲精品福利网址导航| 中文字幕无码乱码人妻日韩精品| 欧美女孩性生活视频| 国产黄色片av| 亚洲精品久久久久中文字幕二区| 日韩av地址| 色999日韩欧美国产| av在线免费播放| 9.1国产丝袜在线观看| 久久久人成影片一区二区三区在哪下载| 国产精品高潮呻吟久久av黑人| 青青草国产一区二区三区| 99久久免费国| 国产精品欧美在线观看| 午夜在线视频免费观看| 一区二区日本视频| 一区二区三区 日韩| 国产传媒久久文化传媒| 国产精品揄拍100视频| 国产精品久久久久婷婷二区次| 久久精品一区二区三| 精品福利一区二区| 999精品国产| 精品亚洲精品福利线在观看| 生活片a∨在线观看| 性欧美暴力猛交69hd| 99久久伊人| 成人av资源| 日韩影院二区| koreanbj精品视频一区| 毛片基地黄久久久久久天堂| av电影中文字幕| 国产亚洲精品免费| 青娱乐91视频| 欧美色老头old∨ideo| www三级免费| 一区二区成人av| 3344国产永久在线观看视频| 国产欧美一区二区三区四区| 免费看久久久| 欧美a级免费视频| 免费看日韩精品| 最近中文字幕无免费| 一区二区在线观看视频在线观看| 波多野结衣高清在线| 亚洲国产成人精品一区二区| 调教视频免费在线观看| 日韩暖暖在线视频| 久久动漫网址| avav在线播放| 国内欧美视频一区二区| 国产av自拍一区| 懂色av一区二区三区| 丰满人妻一区二区三区四区53| 最好看的2019年中文视频| 亚洲日本天堂| 国产专区一区二区三区| 真实国产乱子伦精品一区二区三区| 99草草国产熟女视频在线| 成人av动漫在线| 精品无码人妻一区二区三| 欧美疯狂做受xxxx富婆| 1769在线观看| 国产精品第3页| 视频一区中文| 国产在线青青草| 91丝袜美腿高跟国产极品老师| 国产香蕉在线视频| 欧美成人精品福利| aa在线视频| 亚洲综合av影视| 婷婷亚洲五月色综合| 欧美美女性视频| 国产精品美女一区二区三区| 亚洲高清在线看| 亚洲人成电影网站色…| 二区三区不卡| 日本高清不卡三区| 丝袜美腿亚洲综合| 无码少妇精品一区二区免费动态| 精品国产乱码久久久久久婷婷| 乱精品一区字幕二区| 国内成人精品一区| 小说区图片区色综合区| 国产网站免费在线观看| 91欧美激情一区二区三区成人| 在线能看的av| 亚洲人成在线观看| 秋霞国产精品| 一本一生久久a久久精品综合蜜| 久久精品国产免费看久久精品| 婷婷社区五月天| 日韩一区二区三| 99色在线观看| 欧美人与物videos另类| 日韩av二区在线播放| 纪美影视在线观看电视版使用方法| 欧美少妇一区二区| 国产鲁鲁视频在线观看特色| 成人久久久久爱| 亚洲天堂成人| 免费在线观看你懂的| 欧美日韩色综合| 18在线观看的| 久久国产日韩欧美| 人禽交欧美网站| 欧美日韩一级在线观看| 亚洲国产日韩欧美综合久久 | 国产专区一区| 最近中文字幕无免费| 欧亚一区二区三区| 成人免费观看视频大全| 精品综合久久| 日本欧美久久久久免费播放网| av最新在线观看| 亚洲国产高清福利视频| 欧洲亚洲两性| 久久久无码中文字幕久...| 99精品久久只有精品| 最新中文字幕第一页| 欧美国产欧美亚洲国产日韩mv天天看完整| 精品三级在线观看视频| 九热视频在线观看| 一区二区三区在线视频观看 | 亚洲不卡视频在线| 亚洲精品欧美专区| 青青草视频在线观看| 成人国产精品一区| 美女久久一区| 免费中文字幕视频| 中文字幕av一区中文字幕天堂| 国产ts一区| 五月激情婷婷在线| 欧美日韩亚洲激情| 视频在线这里都是精品|