日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

那些年,我们见过的 Java 服务端“问题”

發(fā)布時(shí)間:2024/8/23 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 那些年,我们见过的 Java 服务端“问题” 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

導(dǎo)讀

明代著名的心學(xué)集大成者王陽(yáng)明先生在《傳習(xí)錄》中有云:

道無(wú)精粗,人之所見(jiàn)有精粗。如這一間房,人初進(jìn)來(lái),只見(jiàn)一個(gè)大規(guī)模如此。處久,便柱壁之類(lèi),一一看得明白。再久,如柱上有些文藻,細(xì)細(xì)都看出來(lái)。然只是一間房。

是的,知識(shí)理論哪有什么精粗之分,只是人的認(rèn)識(shí)程度不同而已。筆者在初創(chuàng)公司摸爬滾打數(shù)年,接觸了各式各樣的Java服務(wù)端架構(gòu),見(jiàn)得多了自然也就認(rèn)識(shí)深了,就能分辨出各種方案的優(yōu)劣了。這里,筆者總結(jié)了一些初創(chuàng)公司存在的Java服務(wù)端問(wèn)題,并嘗試性地給出了一些不成熟的解決方案。

1.系統(tǒng)不是分布式

隨著互聯(lián)網(wǎng)的發(fā)展,計(jì)算機(jī)系統(tǒng)早就從單機(jī)獨(dú)立工作過(guò)渡到多機(jī)器協(xié)同工作。計(jì)算機(jī)以集群的方式存在,按照分布式理論構(gòu)建出龐大復(fù)雜的應(yīng)用服務(wù),早已深入人心并得到廣泛地應(yīng)用。但是,仍然有不少創(chuàng)業(yè)公司的軟件系統(tǒng)停留在"單機(jī)版"。

1.1.單機(jī)版系統(tǒng)搶單案例

這里,用并發(fā)性比較高的搶單功能為例說(shuō)明:

// 搶取訂單函數(shù) public synchronized void grabOrder(Long orderId, Long userId) {// 獲取訂單信息OrderDO order = orderDAO.get(orderId);if (Objects.isNull(order)) {throw new BizRuntimeException(String.format("訂單(%s)不存在", orderId));}// 檢查訂單狀態(tài)if (!Objects.equals(order.getStatus, OrderStatus.WAITING_TO_GRAB.getValue())) {throw new BizRuntimeException(String.format("訂單(%s)已被搶", orderId));}// 設(shè)置訂單被搶orderDAO.setGrabed(orderId, userId); }

以上代碼,在一臺(tái)服務(wù)器上運(yùn)行沒(méi)有任何問(wèn)題。進(jìn)入函數(shù)grabOrder(搶取訂單)時(shí),利用synchronized關(guān)鍵字把整個(gè)函數(shù)鎖定,要么進(jìn)入函數(shù)前訂單未被人搶取從而搶取訂單成功,要么進(jìn)入函數(shù)前訂單已被搶取導(dǎo)致?lián)屓∮唵问?#xff0c;絕對(duì)不會(huì)出現(xiàn)進(jìn)入函數(shù)前訂單未被搶取而進(jìn)入函數(shù)后訂單又被搶取的情況。

但是,如果上面的代碼在兩臺(tái)服務(wù)器上同時(shí)運(yùn)行,由于Java的synchronized關(guān)鍵字只在一個(gè)虛擬機(jī)內(nèi)生效,所以就會(huì)導(dǎo)致兩個(gè)人能夠同時(shí)搶取一個(gè)訂單,但會(huì)以最后一個(gè)寫(xiě)入數(shù)據(jù)庫(kù)的數(shù)據(jù)為準(zhǔn)。所以,大多數(shù)的單機(jī)版系統(tǒng),是無(wú)法作為分布式系統(tǒng)運(yùn)行的。

1.2.分布式系統(tǒng)搶單案例

添加分布式鎖,進(jìn)行代碼優(yōu)化:

// 搶取訂單函數(shù) public void grabOrder(Long orderId, Long userId) {Long lockId = orderDistributedLock.lock(orderId);try {grabOrderWithoutLock(orderId, userId);} finally {orderDistributedLock.unlock(orderId, lockId);} }// 不帶鎖的搶取訂單函數(shù) private void grabOrderWithoutLock(Long orderId, Long userId) {// 獲取訂單信息OrderDO order = orderDAO.get(orderId);if (Objects.isNull(order)) {throw new BizRuntimeException(String.format("訂單(%s)不存在", orderId));}// 檢查訂單狀態(tài)if (!Objects.equals(order.getStatus, OrderStatus.WAITING_TO_GRAB.getValue())) {throw new BizRuntimeException(String.format("訂單(%s)已被搶", orderId));}// 設(shè)置訂單被搶orderDAO.setGrabed(orderId, userId); }

優(yōu)化后的代碼,在調(diào)用函數(shù)grabOrderWithoutLock(不帶鎖的搶取訂單)前后,利用分布式鎖orderDistributedLock(訂單分布式鎖)進(jìn)行加鎖和釋放鎖,跟單機(jī)版的synchronized關(guān)鍵字加鎖效果基本一樣。

1.3.分布式系統(tǒng)的優(yōu)缺點(diǎn)

分布式系統(tǒng)(Distributed System)是支持分布式處理的軟件系統(tǒng),是由通信網(wǎng)絡(luò)互聯(lián)的多處理機(jī)體系結(jié)構(gòu)上執(zhí)行任務(wù)的系統(tǒng),包括分布式操作系統(tǒng)、分布式程序設(shè)計(jì)語(yǔ)言及其編譯系統(tǒng)、分布式文件系統(tǒng)分布式數(shù)據(jù)庫(kù)系統(tǒng)等。

分布式系統(tǒng)的優(yōu)點(diǎn):

  • 可靠性、高容錯(cuò)性:
  • 一臺(tái)服務(wù)器的崩潰,不會(huì)影響其它服務(wù)器,其它服務(wù)器仍能提供服務(wù)。

  • 可擴(kuò)展性:
  • 如果系統(tǒng)服務(wù)能力不足,可以水平擴(kuò)展更多服務(wù)器。

  • 靈活性:
  • 可以很容易的安裝、實(shí)施、擴(kuò)容和升級(jí)系統(tǒng)。

  • 性能高:
  • 擁有多臺(tái)服務(wù)器的計(jì)算能力,比單臺(tái)服務(wù)器處理速度更快。

  • 性價(jià)比高:
  • 分布式系統(tǒng)對(duì)服務(wù)器硬件要求很低,可以選用廉價(jià)服務(wù)器搭建分布式集群,從而得到更好的性價(jià)比。

    分布式系統(tǒng)的缺點(diǎn):

  • 排查難度高:
  • 由于系統(tǒng)分布在多臺(tái)服務(wù)器上,故障排查和問(wèn)題診斷難度較高。

  • 軟件支持少:
  • 分布式系統(tǒng)解決方案的軟件支持較少。

  • 建設(shè)成本高:
  • 需要多臺(tái)服務(wù)器搭建分布式系統(tǒng)。

    曾經(jīng)有不少的朋友咨詢我:"找外包做移動(dòng)應(yīng)用,需要注意哪些事項(xiàng)?"

    首先,確定是否需要用分布式系統(tǒng)。軟件預(yù)算有多少?預(yù)計(jì)用戶量有多少?預(yù)計(jì)訪問(wèn)量有多少?是否只是業(yè)務(wù)前期試水版?單臺(tái)服務(wù)器能否解決?是否接收短時(shí)間宕機(jī)?……如果綜合考慮,單機(jī)版系統(tǒng)就可以解決的,那就不要采用分布式系統(tǒng)了。因?yàn)閱螜C(jī)版系統(tǒng)和分布式系統(tǒng)的差別很大,相應(yīng)的軟件研發(fā)成本的差別也很大。

    其次,確定是否真正的分布式系統(tǒng)。分布式系統(tǒng)最大的特點(diǎn),就是當(dāng)系統(tǒng)服務(wù)能力不足時(shí),能夠通過(guò)水平擴(kuò)展的方式,通過(guò)增加服務(wù)器來(lái)增加服務(wù)能力。然而,單機(jī)版系統(tǒng)是不支持水平擴(kuò)展的,強(qiáng)行擴(kuò)展就會(huì)引起一系列數(shù)據(jù)問(wèn)題。由于單機(jī)版系統(tǒng)和分布式系統(tǒng)的研發(fā)成本差別較大,市面上的外包團(tuán)隊(duì)大多用單機(jī)版系統(tǒng)代替分布式系統(tǒng)交付。那么,如何確定你的系統(tǒng)是真正意義上的分布式系統(tǒng)呢?從軟件上來(lái)說(shuō),是否采用了分布式軟件解決方案;從硬件上來(lái)說(shuō),是否采用了分布式硬件部署方案

    1.4.分布式軟件解決方案

    作為一個(gè)合格的分布式系統(tǒng),需要根據(jù)實(shí)際需求采用相應(yīng)的分布式軟件解決方案。

    1.4.1.分布式鎖

    分布式鎖是單機(jī)鎖的一種擴(kuò)展,主要是為了鎖住分布式系統(tǒng)中的物理塊或邏輯塊,用以此保證不同服務(wù)之間的邏輯和數(shù)據(jù)的一致性。

    目前,主流的分布式鎖實(shí)現(xiàn)方式有3種:

  • 基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)的分布式鎖;
  • 基于Redis實(shí)現(xiàn)的分布式鎖;
  • 基于Zookeeper實(shí)現(xiàn)的分布式鎖。
  • 1.4.2.分布式消息

    分布式消息中間件是支持在分布式系統(tǒng)中發(fā)送和接受消息的軟件基礎(chǔ)設(shè)施。常見(jiàn)的分布式消息中間件有ActiveMQ、RabbitMQ、Kafka、MetaQ等。

    MetaQ(全稱(chēng)Metamorphosis)是一個(gè)高性能、高可用、可擴(kuò)展的分布式消息中間件,思路起源于LinkedIn的Kafka,但并不是Kafka的一個(gè)拷貝。MetaQ具有消息存儲(chǔ)順序?qū)憽⑼掏铝看蠛椭С直镜睾蚗A事務(wù)等特性,適用于大吞吐量、順序消息、廣播和日志數(shù)據(jù)傳輸?shù)葓?chǎng)景。

    1.4.3.數(shù)據(jù)庫(kù)分片分組

    針對(duì)大數(shù)據(jù)量的數(shù)據(jù)庫(kù),一般會(huì)采用"分片分組"策略:

    分片(shard):主要解決擴(kuò)展性問(wèn)題,屬于水平拆分。引入分片,就引入了數(shù)據(jù)路由和分區(qū)鍵的概念。其中,分表解決的是數(shù)據(jù)量過(guò)大的問(wèn)題,分庫(kù)解決的是數(shù)據(jù)庫(kù)性能瓶頸的問(wèn)題。

    分組(group):主要解決可用性問(wèn)題,通過(guò)主從復(fù)制的方式實(shí)現(xiàn),并提供讀寫(xiě)分離策略用以提高數(shù)據(jù)庫(kù)性能。

    1.4.4.分布式計(jì)算

    分布式計(jì)算( Distributed computing )是一種"把需要進(jìn)行大量計(jì)算的工程數(shù)據(jù)分割成小塊,由多臺(tái)計(jì)算機(jī)分別計(jì)算;在上傳運(yùn)算結(jié)果后,將結(jié)果統(tǒng)一合并得出數(shù)據(jù)結(jié)論"的科學(xué)。

    當(dāng)前的高性能服務(wù)器在處理海量數(shù)據(jù)時(shí),其計(jì)算能力、內(nèi)存容量等指標(biāo)都遠(yuǎn)遠(yuǎn)無(wú)法達(dá)到要求。在大數(shù)據(jù)時(shí)代,工程師采用廉價(jià)的服務(wù)器組成分布式服務(wù)集群,以集群協(xié)作的方式完成海量數(shù)據(jù)的處理,從而解決單臺(tái)服務(wù)器在計(jì)算與存儲(chǔ)上的瓶頸。Hadoop、Storm以及Spark是常用的分布式計(jì)算中間件,Hadoop是對(duì)非實(shí)時(shí)數(shù)據(jù)做批量處理的中間件,Storm和Spark是對(duì)實(shí)時(shí)數(shù)據(jù)做流式處理的中間件。

    除此之外,還有更多的分布式軟件解決方案,這里就不再一一介紹了。

    1.5.分布式硬件部署方案

    介紹完服務(wù)端的分布式軟件解決方案,就不得不介紹一下服務(wù)端的分布式硬件部署方案。這里,只畫(huà)出了服務(wù)端常見(jiàn)的接口服務(wù)器、MySQL數(shù)據(jù)庫(kù)、Redis緩存,而忽略了其它的云存儲(chǔ)服務(wù)、消息隊(duì)列服務(wù)、日志系統(tǒng)服務(wù)……

    1.5.1.一般單機(jī)版部署方案

    架構(gòu)說(shuō)明:

    只有1臺(tái)接口服務(wù)器、1個(gè)MySQL數(shù)據(jù)庫(kù)、1個(gè)可選Redis緩存,可能都部署在同一臺(tái)服務(wù)器上。

    適用范圍:

    適用于演示環(huán)境、測(cè)試環(huán)境以及不怕宕機(jī)且日PV在5萬(wàn)以內(nèi)的小型商業(yè)應(yīng)用。

    1.5.2.中小型分布式硬件部署方案

    架構(gòu)說(shuō)明:

    通過(guò)SLB/Nginx組成一個(gè)負(fù)載均衡的接口服務(wù)器集群,MySQL數(shù)據(jù)庫(kù)和Redis緩存采用了一主一備(或多備)的部署方式。

    適用范圍:

    適用于日PV在500萬(wàn)以內(nèi)的中小型商業(yè)應(yīng)用。

    1.5.3.大型分布式硬件部署方案

    架構(gòu)說(shuō)明:

    通過(guò)SLB/Nginx組成一個(gè)負(fù)載均衡的接口服務(wù)器集群,利用分片分組策略組成一個(gè)MySQL數(shù)據(jù)庫(kù)集群和Redis緩存集群。

    適用范圍:

    適用于日PV在500萬(wàn)以上的大型商業(yè)應(yīng)用。

    2.多線程使用不正確

    多線程最主要目的就是"最大限度地利用CPU資源",可以把串行過(guò)程變成并行過(guò)程,從而提高了程序的執(zhí)行效率。

    2.1.一個(gè)慢接口案例

    假設(shè)在用戶登錄時(shí),如果是新用戶,需要?jiǎng)?chuàng)建用戶信息,并發(fā)放新用戶優(yōu)惠券。例子代碼如下:

    // 登錄函數(shù)(示意寫(xiě)法) public UserVO login(String phoneNumber, String verifyCode) {// 檢查驗(yàn)證碼if (!checkVerifyCode(phoneNumber, verifyCode)) {throw new ExampleException("驗(yàn)證碼錯(cuò)誤");}// 檢查用戶存在UserDO user = userDAO.getByPhoneNumber(phoneNumber);if (Objects.nonNull(user)) {return transUser(user);}// 創(chuàng)建新用戶return createNewUser(user); }// 創(chuàng)建新用戶函數(shù) private UserVO createNewUser(String phoneNumber) {// 創(chuàng)建新用戶UserDO user = new UserDO();...userDAO.insert(user);// 綁定優(yōu)惠券couponService.bindCoupon(user.getId(), CouponType.NEW_USER);// 返回新用戶return transUser(user); }

    其中,綁定優(yōu)惠券(bindCoupon)是給用戶綁定新用戶優(yōu)惠券,然后再給用戶發(fā)送推送通知。如果隨著優(yōu)惠券數(shù)量越來(lái)越多,該函數(shù)也會(huì)變得越來(lái)越慢,執(zhí)行時(shí)間甚至超過(guò)1秒,并且沒(méi)有什么優(yōu)化空間。現(xiàn)在,登錄(login)函數(shù)就成了名副其實(shí)的慢接口,需要進(jìn)行接口優(yōu)化。

    2.2.采用多線程優(yōu)化

    通過(guò)分析發(fā)現(xiàn),綁定優(yōu)惠券(bindCoupon)函數(shù)可以異步執(zhí)行。首先想到的是采用多線程解決該問(wèn)題,代碼如下:

    // 創(chuàng)建新用戶函數(shù) private UserVO createNewUser(String phoneNumber) {// 創(chuàng)建新用戶UserDO user = new UserDO();...userDAO.insert(user);// 綁定優(yōu)惠券executorService.execute(()->couponService.bindCoupon(user.getId(), CouponType.NEW_USER));// 返回新用戶return transUser(user); }

    現(xiàn)在,在新線程中執(zhí)行綁定優(yōu)惠券(bindCoupon)函數(shù),使用戶登錄(login)函數(shù)性能得到很大的提升。但是,如果在新線程執(zhí)行綁定優(yōu)惠券函數(shù)過(guò)程中,系統(tǒng)發(fā)生重啟或崩潰導(dǎo)致線程執(zhí)行失敗,用戶將永遠(yuǎn)獲取不到新用戶優(yōu)惠券。除非提供用戶手動(dòng)領(lǐng)取優(yōu)惠券頁(yè)面,否則就需要程序員后臺(tái)手工綁定優(yōu)惠券。所以,用采用多線程優(yōu)化慢接口,并不是一個(gè)完善的解決方案。

    2.3.采用消息隊(duì)列優(yōu)化

    如果要保證綁定優(yōu)惠券函數(shù)執(zhí)行失敗后能夠重啟執(zhí)行,可以采用數(shù)據(jù)庫(kù)表、Redis隊(duì)列、消息隊(duì)列的等多種解決方案。由于篇幅優(yōu)先,這里只介紹采用MetaQ消息隊(duì)列解決方案,并省略了MetaQ相關(guān)配置僅給出了核心代碼。

    消息生產(chǎn)者代碼:

    // 創(chuàng)建新用戶函數(shù) private UserVO createNewUser(String phoneNumber) {// 創(chuàng)建新用戶UserDO user = new UserDO();...userDAO.insert(user);// 發(fā)送優(yōu)惠券消息Long userId = user.getId();CouponMessageDataVO data = new CouponMessageDataVO();data.setUserId(userId);data.setCouponType(CouponType.NEW_USER);Message message = new Message(TOPIC, TAG, userId, JSON.toJSONBytes(data));SendResult result = metaqTemplate.sendMessage(message);if (!Objects.equals(result, SendStatus.SEND_OK)) {log.error("發(fā)送用戶({})綁定優(yōu)惠券消息失敗:{}", userId, JSON.toJSONString(result));}// 返回新用戶return transUser(user); }

    注意:可能出現(xiàn)發(fā)生消息不成功,但是這種概率相對(duì)較低。

    消息消費(fèi)者代碼:

    // 優(yōu)惠券服務(wù)類(lèi) @Slf4j @Service public class CouponService extends DefaultMessageListener<String> {// 消息處理函數(shù)@Override@Transactional(rollbackFor = Exception.class)public void onReceiveMessages(MetaqMessage<String> message) {// 獲取消息體String body = message.getBody();if (StringUtils.isBlank(body)) {log.warn("獲取消息({})體為空", message.getId());return;}// 解析消息數(shù)據(jù)CouponMessageDataVO data = JSON.parseObject(body, CouponMessageDataVO.class);if (Objects.isNull(data)) {log.warn("解析消息({})體為空", message.getId());return;}// 綁定優(yōu)惠券bindCoupon(data.getUserId(), data.getCouponType());} }

    解決方案優(yōu)點(diǎn):

    采集MetaQ消息隊(duì)列優(yōu)化慢接口解決方案的優(yōu)點(diǎn):

  • 如果系統(tǒng)發(fā)生重啟或崩潰,導(dǎo)致消息處理函數(shù)執(zhí)行失敗,不會(huì)確認(rèn)消息已消費(fèi);由于MetaQ支持多服務(wù)訂閱同一隊(duì)列,該消息可以轉(zhuǎn)到別的服務(wù)進(jìn)行消費(fèi),亦或等到本服務(wù)恢復(fù)正常后再進(jìn)行消費(fèi)。
  • 消費(fèi)者可多服務(wù)、多線程進(jìn)行消費(fèi)消息,即便消息處理時(shí)間較長(zhǎng),也不容易引起消息積壓;即便引起消息積壓,也可以通過(guò)擴(kuò)充服務(wù)實(shí)例的方式解決。
  • 如果需要重新消費(fèi)該消息,只需要在MetaQ管理平臺(tái)上點(diǎn)擊"消息驗(yàn)證"即可。
  • 3.流程定義不合理

    3.1.原有的采購(gòu)流程

    這是一個(gè)簡(jiǎn)易的采購(gòu)流程,由庫(kù)管系統(tǒng)發(fā)起采購(gòu),采購(gòu)員開(kāi)始采購(gòu),采購(gòu)員完成采購(gòu),同時(shí)回流采集訂單到庫(kù)管系統(tǒng)。

    其中,完成采購(gòu)動(dòng)作的核心代碼如下:

    /** 完成采購(gòu)動(dòng)作函數(shù)(此處省去獲取采購(gòu)單/驗(yàn)證狀態(tài)/鎖定采購(gòu)單等邏輯) */ public void finishPurchase(PurchaseOrder order) {// 完成相關(guān)處理......// 回流采購(gòu)單(調(diào)用HTTP接口)backflowPurchaseOrder(order);// 設(shè)置完成狀態(tài)purchaseOrderDAO.setStatus(order.getId(), PurchaseOrderStatus.FINISHED.getValue()); }

    由于函數(shù)backflowPurchaseOrder(回流采購(gòu)單)調(diào)用了HTTP接口,可能引起以下問(wèn)題:

  • 該函數(shù)可能耗費(fèi)時(shí)間較長(zhǎng),導(dǎo)致完成采購(gòu)接口成為慢接口;
  • 該函數(shù)可能失敗拋出異常,導(dǎo)致客戶調(diào)用完成采購(gòu)接口失敗。
  • 3.2.優(yōu)化的采購(gòu)流程

    通過(guò)需求分析,把"采購(gòu)員完成采購(gòu)并回流采集訂單"動(dòng)作拆分為"采購(gòu)員完成采購(gòu)"和"回流采集訂單"兩個(gè)獨(dú)立的動(dòng)作,把"采購(gòu)?fù)瓿?#34;拆分為"采購(gòu)?fù)瓿?#34;和"回流完成"兩個(gè)獨(dú)立的狀態(tài),更方便采購(gòu)流程的管理和實(shí)現(xiàn)。

    拆分采購(gòu)流程的動(dòng)作和狀態(tài)后,核心代碼如下:

    /** 完成采購(gòu)動(dòng)作函數(shù)(此處省去獲取采購(gòu)單/驗(yàn)證狀態(tài)/鎖定采購(gòu)單等邏輯) */ public void finishPurchase(PurchaseOrder order) {// 完成相關(guān)處理......// 設(shè)置完成狀態(tài)purchaseOrderDAO.setStatus(order.getId(), PurchaseOrderStatus.FINISHED.getValue()); }/** 執(zhí)行回流動(dòng)作函數(shù)(此處省去獲取采購(gòu)單/驗(yàn)證狀態(tài)/鎖定采購(gòu)單等邏輯) */ public void executeBackflow(PurchaseOrder order) {// 回流采購(gòu)單(調(diào)用HTTP接口)backflowPurchaseOrder(order);// 設(shè)置回流狀態(tài)purchaseOrderDAO.setStatus(order.getId(), PurchaseOrderStatus.BACKFLOWED.getValue()); }

    其中,函數(shù)executeBackflow(執(zhí)行回流)由定時(shí)作業(yè)觸發(fā)執(zhí)行。如果回流采購(gòu)單失敗,采購(gòu)單狀態(tài)并不會(huì)修改為"已回流";等下次定時(shí)作業(yè)執(zhí)行時(shí),將會(huì)繼續(xù)執(zhí)行回流動(dòng)作;直到回流采購(gòu)單成功為止。

    3.3.有限狀態(tài)機(jī)介紹

    3.3.1.概念

    有限狀態(tài)機(jī)(Finite-state machine,FSM),又稱(chēng)有限狀態(tài)自動(dòng)機(jī),簡(jiǎn)稱(chēng)狀態(tài)機(jī),是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的一個(gè)數(shù)學(xué)模型。

    3.3.2.要素

    狀態(tài)機(jī)可歸納為4個(gè)要素:現(xiàn)態(tài)、條件、動(dòng)作、次態(tài)。

    現(xiàn)態(tài):指當(dāng)前流程所處的狀態(tài),包括起始、中間、終結(jié)狀態(tài)。

    條件:也可稱(chēng)為事件;當(dāng)一個(gè)條件被滿足時(shí),將會(huì)觸發(fā)一個(gè)動(dòng)作并執(zhí)行一次狀態(tài)的遷移。

    動(dòng)作:當(dāng)條件滿足后要執(zhí)行的動(dòng)作。動(dòng)作執(zhí)行完畢后,可以遷移到新的狀態(tài),也可以仍舊保持原狀態(tài)。

    次態(tài):當(dāng)條件滿足后要遷往的狀態(tài)。“次態(tài)”是相對(duì)于“現(xiàn)態(tài)”而言的,“次態(tài)”一旦被激活,就轉(zhuǎn)變成新的“現(xiàn)態(tài)”了。

    3.3.3.狀態(tài)

    狀態(tài)表示流程中的持久狀態(tài),流程圖上的每一個(gè)圈代表一個(gè)狀態(tài)。

    初始狀態(tài):?流程開(kāi)始時(shí)的某一狀態(tài);

    中間狀態(tài):?流程中間過(guò)程的某一狀態(tài);

    終結(jié)狀態(tài):?流程完成時(shí)的某一狀態(tài)。

    使用建議:

  • 狀態(tài)必須是一個(gè)持久狀態(tài),而不能是一個(gè)臨時(shí)狀態(tài);
  • 終結(jié)狀態(tài)不能是中間狀態(tài),不能繼續(xù)進(jìn)行流程流轉(zhuǎn);
  • 狀態(tài)劃分合理,不要把多個(gè)狀態(tài)強(qiáng)制合并為一個(gè)狀態(tài);
  • 狀態(tài)盡量精簡(jiǎn),同一狀態(tài)的不同情況可以用其它字段表示。
  • 3.3.4.動(dòng)作

    動(dòng)作的三要素:角色、現(xiàn)態(tài)、次態(tài),流程圖上的每一條線代表一個(gè)動(dòng)作。

    角色:?誰(shuí)發(fā)起的這個(gè)操作,可以是用戶、定時(shí)任務(wù)等;

    現(xiàn)態(tài):?觸發(fā)動(dòng)作時(shí)當(dāng)前的狀態(tài),是執(zhí)行動(dòng)作的前提條件;

    次態(tài):?完成動(dòng)作后達(dá)到的狀態(tài),是執(zhí)行動(dòng)作的最終目標(biāo)。

    使用建議:

  • 每個(gè)動(dòng)作執(zhí)行前,必須檢查當(dāng)前狀態(tài)和觸發(fā)動(dòng)作狀態(tài)的一致性;
  • 狀態(tài)機(jī)的狀態(tài)更改,只能通過(guò)動(dòng)作進(jìn)行,其它操作都是不符合規(guī)范的;
  • 需要添加分布式鎖保證動(dòng)作的原子性,添加數(shù)據(jù)庫(kù)事務(wù)保證數(shù)據(jù)的一致性;
  • 類(lèi)似的動(dòng)作(比如操作用戶、請(qǐng)求參數(shù)、動(dòng)作含義等)可以合并為一個(gè)動(dòng)作,并根據(jù)動(dòng)作執(zhí)行結(jié)果轉(zhuǎn)向不同的狀態(tài)。
  • 4.系統(tǒng)間交互不科學(xué)

    4.1.直接通過(guò)數(shù)據(jù)庫(kù)交互

    在一些項(xiàng)目中,系統(tǒng)間交互不通過(guò)接口調(diào)用和消息隊(duì)列,而是通過(guò)數(shù)據(jù)庫(kù)直接訪問(wèn)。問(wèn)其原因,回答道:"項(xiàng)目工期太緊張,直接訪問(wèn)數(shù)據(jù)庫(kù),簡(jiǎn)單又快捷"。

    還是以上面的采購(gòu)流程為例——采購(gòu)訂單由庫(kù)管系統(tǒng)發(fā)起,由采購(gòu)系統(tǒng)負(fù)責(zé)采購(gòu),采購(gòu)?fù)瓿珊笸ㄖ獛?kù)管系統(tǒng),庫(kù)管系統(tǒng)進(jìn)入入庫(kù)操作。采購(gòu)系統(tǒng)采購(gòu)?fù)瓿珊?#xff0c;通知庫(kù)管系統(tǒng)數(shù)據(jù)庫(kù)的代碼如下:

    /** 執(zhí)行回流動(dòng)作函數(shù)(此處省去獲取采購(gòu)單/驗(yàn)證狀態(tài)/鎖定采購(gòu)單等邏輯) */ public void executeBackflow(PurchaseOrder order) {// 完成原始采購(gòu)單rawPurchaseOrderDAO.setStatus(order.getRawId(), RawPurchaseOrderStatus.FINISHED.getValue());// 設(shè)置回流狀態(tài)purchaseOrderDAO.setStatus(order.getId(), PurchaseOrderStatus.BACKFLOWED.getValue()); }

    其中,通過(guò)rawPurchaseOrderDAO(原始采購(gòu)單DAO)直接訪問(wèn)庫(kù)管系統(tǒng)的數(shù)據(jù)庫(kù)表,并設(shè)置原始采購(gòu)單狀態(tài)為已完成。

    一般情況下,直接通過(guò)數(shù)據(jù)訪問(wèn)的方式是不會(huì)有問(wèn)題的。但是,一旦發(fā)生競(jìng)態(tài),就會(huì)導(dǎo)致數(shù)據(jù)不同步。有人會(huì)說(shuō),可以考慮使用同一分布式鎖解決該問(wèn)題。是的,這種解決方案沒(méi)有問(wèn)題,只是又在系統(tǒng)間共享了分布式鎖。

    直接通過(guò)數(shù)據(jù)庫(kù)交互的缺點(diǎn):

  • 直接暴露數(shù)據(jù)庫(kù)表,容易產(chǎn)生數(shù)據(jù)安全問(wèn)題;
  • 多個(gè)系統(tǒng)操作同一數(shù)據(jù)庫(kù)表,容易造成數(shù)據(jù)庫(kù)表數(shù)據(jù)混亂;
  • 操作同一個(gè)數(shù)據(jù)庫(kù)表的代碼,分布在不同的系統(tǒng)中,不便于管理和維護(hù);
  • 具有數(shù)據(jù)庫(kù)表這樣的強(qiáng)關(guān)聯(lián),無(wú)法實(shí)現(xiàn)系統(tǒng)間的隔離和解耦。
  • 4.2.通過(guò)Dubbo接口交互

    由于采購(gòu)系統(tǒng)和庫(kù)管系統(tǒng)都是內(nèi)部系統(tǒng),可以通過(guò)類(lèi)似Dubbo的RPC接口進(jìn)行交互。

    庫(kù)管系統(tǒng)代碼:

    /** 采購(gòu)單服務(wù)接口 */ public interface PurchaseOrderService {/** 完成采購(gòu)單函數(shù) */public void finishPurchaseOrder(Long orderId); } /** 采購(gòu)單服務(wù)實(shí)現(xiàn) */ @Service("purchaseOrderService") public class PurchaseOrderServiceImpl implements PurchaseOrderService {/** 完成采購(gòu)單函數(shù) */@Override@Transactional(rollbackFor = Exception.class)public void finishPurchaseOrder(Long orderId) {// 相關(guān)處理...// 完成采購(gòu)單purchaseOrderService.finishPurchaseOrder(order.getRawId());} }

    其中,庫(kù)管系統(tǒng)通過(guò)Dubbo把PurchaseOrderServiceImpl(采購(gòu)單服務(wù)實(shí)現(xiàn))以PurchaseOrderService(采購(gòu)單服務(wù)接口)定義的接口服務(wù)暴露給采購(gòu)系統(tǒng)。這里,省略了Dubbo開(kāi)發(fā)服務(wù)接口相關(guān)配置。

    采購(gòu)系統(tǒng)代碼:

    /** 執(zhí)行回流動(dòng)作函數(shù)(此處省去獲取采購(gòu)單/驗(yàn)證狀態(tài)/鎖定采購(gòu)單等邏輯) */ public void executeBackflow(PurchaseOrder order) {// 完成采購(gòu)單purchaseOrderService.finishPurchaseOrder(order.getRawId());// 設(shè)置回流狀態(tài)purchaseOrderDAO.setStatus(order.getId(), PurchaseOrderStatus.BACKFLOWED.getValue()); }

    其中,purchaseOrderService(采購(gòu)單服務(wù))為庫(kù)管系統(tǒng)PurchaseOrderService(采購(gòu)單服務(wù))在采購(gòu)系統(tǒng)中的Dubbo服務(wù)客戶端存根,通過(guò)該服務(wù)調(diào)用庫(kù)管系統(tǒng)的服務(wù)接口函數(shù)finishPurchaseOrder(完成采購(gòu)單函數(shù))。

    這樣,采購(gòu)系統(tǒng)和庫(kù)管系統(tǒng)自己的強(qiáng)關(guān)聯(lián),通過(guò)Dubbo就簡(jiǎn)單地實(shí)現(xiàn)了系統(tǒng)隔離和解耦。當(dāng)然,除了采用Dubbo接口外,還可以采用HTTPS、HSF、WebService等同步接口調(diào)用方式,也可以采用MetaQ等異步消息通知方式。

    4.3.常見(jiàn)系統(tǒng)間交互協(xié)議

    4.3.1.同步接口調(diào)用

    同步接口調(diào)用是以一種阻塞式的接口調(diào)用機(jī)制。常見(jiàn)的交互協(xié)議有:

  • HTTP/HTTPS接口;
  • WebService接口;
  • Dubbo/HSF接口;
  • CORBA接口。
  • 4.3.2.異步消息通知

    異步消息通知是一種通知式的信息交互機(jī)制。當(dāng)系統(tǒng)發(fā)生某種事件時(shí),會(huì)主動(dòng)通知相應(yīng)的系統(tǒng)。常見(jiàn)的交互協(xié)議有:

  • MetaQ的消息通知;
  • CORBA消息通知。
  • 4.4.常見(jiàn)系統(tǒng)間交互方式

    4.4.1.請(qǐng)求-應(yīng)答

    適用范圍:

    適合于簡(jiǎn)單的耗時(shí)較短的接口同步調(diào)用場(chǎng)景,比如Dubbo接口同步調(diào)用。

    4.4.2.通知-確認(rèn)

    適用范圍:

    適合于簡(jiǎn)單的異步消息通知場(chǎng)景,比如MetaQ消息通知。

    4.4.3.請(qǐng)求-應(yīng)答-查詢-返回

    適用范圍:

    適合于復(fù)雜的耗時(shí)較長(zhǎng)的接口同步調(diào)用場(chǎng)景,比如提交作業(yè)任務(wù)并定期查詢?nèi)蝿?wù)結(jié)果。

    4.4.4.請(qǐng)求-應(yīng)答-回調(diào)

    適用范圍:

    適合于復(fù)雜的耗時(shí)較長(zhǎng)的接口同步調(diào)用和異步回調(diào)相結(jié)合的場(chǎng)景,比如支付寶的訂單支付。

    4.4.5.請(qǐng)求-應(yīng)答-通知-確認(rèn)

    適用范圍:

    適合于復(fù)雜的耗時(shí)較長(zhǎng)的接口同步調(diào)用和異步消息通知相結(jié)合的場(chǎng)景,比如提交作業(yè)任務(wù)并等待完成消息通知。

    4.4.6.通知-確認(rèn)-通知-確認(rèn)

    適用范圍:

    適合于復(fù)雜的耗時(shí)較長(zhǎng)的異步消息通知場(chǎng)景。

    5.數(shù)據(jù)查詢不分頁(yè)

    在數(shù)據(jù)查詢時(shí),由于未能對(duì)未來(lái)數(shù)據(jù)量做出正確的預(yù)估,很多情況下都沒(méi)有考慮數(shù)據(jù)的分頁(yè)查詢。

    5.1.普通查詢案例

    以下是查詢過(guò)期訂單的代碼:

    /** 訂單DAO接口 */ public interface OrderDAO {/** 查詢過(guò)期訂單函數(shù) */@Select("select * from t_order where status = 5 and gmt_create < date_sub(current_timestamp, interval 30 day)")public List<OrderDO> queryTimeout(); }/** 訂單服務(wù)接口 */ public interface OrderService {/** 查詢過(guò)期訂單函數(shù) */public List<OrderVO> queryTimeout(); }

    當(dāng)過(guò)期訂單數(shù)量很少時(shí),以上代碼不會(huì)有任何問(wèn)題。但是,當(dāng)過(guò)期訂單數(shù)量達(dá)到幾十萬(wàn)上千萬(wàn)時(shí),以上代碼就會(huì)出現(xiàn)以下問(wèn)題:

  • 數(shù)據(jù)量太大,導(dǎo)致服務(wù)端的內(nèi)存溢出;
  • 數(shù)據(jù)量太大,導(dǎo)致查詢接口超時(shí)、返回?cái)?shù)據(jù)超時(shí)等;
  • 數(shù)據(jù)量太大,導(dǎo)致客戶端的內(nèi)存溢出。
  • 所以,在數(shù)據(jù)查詢時(shí),特別是不能預(yù)估數(shù)據(jù)量的大小時(shí),需要考慮數(shù)據(jù)的分頁(yè)查詢。

    這里,主要介紹"設(shè)置最大數(shù)量"和"采用分頁(yè)查詢"兩種方式。

    5.2.設(shè)置最大數(shù)量

    "設(shè)置最大數(shù)量"是一種最簡(jiǎn)單的分頁(yè)查詢,相當(dāng)于只返回第一頁(yè)數(shù)據(jù)。例子代碼如下:

    /** 訂單DAO接口 */ public interface OrderDAO {/** 查詢過(guò)期訂單函數(shù) */@Select("select * from t_order where status = 5 and gmt_create < date_sub(current_timestamp, interval 30 day) limit 0, #{maxCount}")public List<OrderDO> queryTimeout(@Param("maxCount") Integer maxCount); }/** 訂單服務(wù)接口 */ public interface OrderService {/** 查詢過(guò)期訂單函數(shù) */public List<OrderVO> queryTimeout(Integer maxCount); }

    適用于沒(méi)有分頁(yè)需求、但又擔(dān)心數(shù)據(jù)過(guò)多導(dǎo)致內(nèi)存溢出、數(shù)據(jù)量過(guò)大的查詢。

    5.3.采用分頁(yè)查詢

    "采用分頁(yè)查詢"是指定startIndex(開(kāi)始序號(hào))和pageSize(頁(yè)面大小)進(jìn)行數(shù)據(jù)查詢,或者指定pageIndex(分頁(yè)序號(hào))和pageSize(頁(yè)面大小)進(jìn)行數(shù)據(jù)查詢。例子代碼如下:

    /** 訂單DAO接口 */ public interface OrderDAO {/** 統(tǒng)計(jì)過(guò)期訂單函數(shù) */@Select("select count(*) from t_order where status = 5 and gmt_create < date_sub(current_timestamp, interval 30 day)")public Long countTimeout();/** 查詢過(guò)期訂單函數(shù) */@Select("select * from t_order where status = 5 and gmt_create < date_sub(current_timestamp, interval 30 day) limit #{startIndex}, #{pageSize}")public List<OrderDO> queryTimeout(@Param("startIndex") Long startIndex, @Param("pageSize") Integer pageSize); }/** 訂單服務(wù)接口 */ public interface OrderService {/** 查詢過(guò)期訂單函數(shù) */public PageData<OrderVO> queryTimeout(Long startIndex, Integer pageSize); }

    適用于真正的分頁(yè)查詢,查詢參數(shù)startIndex(開(kāi)始序號(hào))和pageSize(頁(yè)面大小)可由調(diào)用方指定。

    5.3.分頁(yè)查詢隱藏問(wèn)題

    假設(shè),我們需要在一個(gè)定時(shí)作業(yè)(每5分鐘執(zhí)行一次)中,針對(duì)已經(jīng)超時(shí)的訂單(status=5,創(chuàng)建時(shí)間超時(shí)30天)進(jìn)行超時(shí)關(guān)閉(status=10)。實(shí)現(xiàn)代碼如下:

    /** 訂單DAO接口 */ public interface OrderDAO {/** 查詢過(guò)期訂單函數(shù) */@Select("select * from t_order where status = 5 and gmt_create < date_sub(current_timestamp, interval 30 day) limit #{startIndex}, #{pageSize}")public List<OrderDO> queryTimeout(@Param("startIndex") Long startIndex, @Param("pageSize") Integer pageSize);/** 設(shè)置訂單超時(shí)關(guān)閉 */@Update("update t_order set status = 10 where id = #{orderId} and status = 5")public Long setTimeoutClosed(@Param("orderId") Long orderId) }/** 關(guān)閉過(guò)期訂單作業(yè)類(lèi) */ public class CloseTimeoutOrderJob extends Job {/** 分頁(yè)數(shù)量 */private static final int PAGE_COUNT = 100;/** 分頁(yè)大小 */private static final int PAGE_SIZE = 1000;/** 作業(yè)執(zhí)行函數(shù) */@Overridepublic void execute() {for (int i = 0; i < PAGE_COUNT; i++) {// 查詢處理訂單List<OrderDO> orderList = orderDAO.queryTimeout(i * PAGE_COUNT, PAGE_SIZE);for (OrderDO order : orderList) {// 進(jìn)行超時(shí)關(guān)閉......orderDAO.setTimeoutClosed(order.getId());}// 檢查處理完畢if(orderList.size() < PAGE_SIZE) {break;}}} }

    粗看這段代碼是沒(méi)有問(wèn)題的,嘗試循環(huán)100次,每次取1000條過(guò)期訂單,進(jìn)行訂單超時(shí)關(guān)閉操作,直到?jīng)]有訂單或達(dá)到100次為止。但是,如果結(jié)合訂單狀態(tài)一起看,就會(huì)發(fā)現(xiàn)從第二次查詢開(kāi)始,每次會(huì)忽略掉前startIndex(開(kāi)始序號(hào))條應(yīng)該處理的過(guò)期訂單。這就是分頁(yè)查詢存在的隱藏問(wèn)題

    當(dāng)滿足查詢條件的數(shù)據(jù),在操作中不再滿足查詢條件時(shí),會(huì)導(dǎo)致后續(xù)分頁(yè)查詢中前startIndex(開(kāi)始序號(hào))條滿足條件的數(shù)據(jù)被跳過(guò)。

    可以采用"設(shè)置最大數(shù)量"的方式解決,代碼如下:

    /** 訂單DAO接口 */ public interface OrderDAO {/** 查詢過(guò)期訂單函數(shù) */@Select("select * from t_order where status = 5 and gmt_create < date_sub(current_timestamp, interval 30 day) limit 0, #{maxCount}")public List<OrderDO> queryTimeout(@Param("maxCount") Integer maxCount);/** 設(shè)置訂單超時(shí)關(guān)閉 */@Update("update t_order set status = 10 where id = #{orderId} and status = 5")public Long setTimeoutClosed(@Param("orderId") Long orderId) }/** 關(guān)閉過(guò)期訂單作業(yè)(定時(shí)作業(yè)) */ public class CloseTimeoutOrderJob extends Job {/** 分頁(yè)數(shù)量 */private static final int PAGE_COUNT = 100;/** 分頁(yè)大小 */private static final int PAGE_SIZE = 1000;/** 作業(yè)執(zhí)行函數(shù) */@Overridepublic void execute() {for (int i = 0; i < PAGE_COUNT; i++) {// 查詢處理訂單List<OrderDO> orderList = orderDAO.queryTimeout(PAGE_SIZE);for (OrderDO order : orderList) {// 進(jìn)行超時(shí)關(guān)閉......orderDAO.setTimeoutClosed(order.getId());}// 檢查處理完畢if(orderList.size() < PAGE_SIZE) {break;}}} }

    后記

    本文是《那些年,我們見(jiàn)過(guò)的Java服務(wù)端“亂象”》的姐妹篇,前文主要介紹的是Java服務(wù)端規(guī)范上的問(wèn)題,而本文主要介紹的是Java服務(wù)端方案上的問(wèn)題。

    謹(jǐn)以此文獻(xiàn)給當(dāng)年"E代駕"下的"KK拼車(chē)"團(tuán)隊(duì),懷念曾經(jīng)一起奮斗過(guò)的兄弟們,懷念那段為代駕司機(jī)深夜返程保駕護(hù)航的歲月。深感遺憾的是,"KK拼車(chē)"剛剛嶄露頭角,還沒(méi)來(lái)得及好好發(fā)展,就被公司斷臂裁撤了。值得欣慰的是,"KK拼車(chē)"自在人心,據(jù)說(shuō)現(xiàn)在已經(jīng)成為了一個(gè)"民間組織"。


    原文鏈接
    本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

    總結(jié)

    以上是生活随笔為你收集整理的那些年,我们见过的 Java 服务端“问题”的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    99精品视频免费观看 | 九九九视频精品 | 91香蕉亚洲精品 | 久久国产精品99久久久久 | 成人在线免费观看网站 | 国产精品久久久久久久久久三级 | 日韩乱色精品一区二区 | 国产一区自拍视频 | 人人插人人看 | 久久人人爽人人人人片 | 中文字幕在线看人 | 久久久久综合 | 91新人在线观看 | 国产特级毛片 | 久久艹在线观看 | 97av在线视频| 亚洲欧美视频一区二区三区 | 综合国产视频 | 日韩欧美一区二区在线 | 999国产精品视频 | 激情文学综合丁香 | 国产精品一区二区美女视频免费看 | 国产一区二区在线免费播放 | 国产成人av在线影院 | 亚洲激情 在线 | 九九色视频 | 婷婷九月丁香 | 日韩高清无线码2023 | 久久你懂的 | 国产专区在线 | 欧美大片在线观看一区 | 亚洲 综合 专区 | 九九在线高清精品视频 | 91丨九色丨蝌蚪丨对白 | 最近中文字幕久久 | 日韩电影在线一区 | 日本黄色免费电影网站 | 精品在线一区二区 | 99精品视频网站 | 日韩免费电影一区二区 | 一区二区三区高清在线观看 | 亚洲一区二区三区精品在线观看 | 波多野结衣资源 | 中文字幕在线免费观看 | 麻豆国产网站 | 九色91在线视频 | 久久精品久久久精品美女 | 久久一区二区三区国产精品 | 成人亚洲精品国产www | 日韩激情综合 | 综合精品久久 | 韩日电影在线 | 国产精品久久久99 | 免费av电影网站 | 国产不卡在线播放 | 人人澡人人添人人爽一区二区 | 婷婷在线五月 | 在线观看亚洲免费视频 | 免费在线观看成年人视频 | 欧美色图亚洲图片 | 91干干干| 国产一二三四在线观看视频 | 日日夜夜网 | 干 操 插 | 国产精品久久久久一区二区三区 | 亚洲精品在线观看av | 五月婷婷丁香综合 | 草久在线观看 | 亚洲第一成网站 | 人人干狠狠干 | 美女视频永久黄网站免费观看国产 | 99在线精品视频观看 | www.色com | 久久免费在线视频 | 久久视频免费 | 中文字幕在线观看播放 | 精品在线二区 | www黄com | 久久伊人热 | 色综合久久久久综合体 | 欧美国产不卡 | 一区二区三区免费 | 久久久久久久免费看 | 中文字幕第一页av | 久久久国产在线视频 | 免费看日韩 | 欧美日韩视频在线一区 | 黄色午夜| 欧美片一区二区三区 | 成人久久视频 | 九九热久久免费视频 | 九色激情网 | 国产日产高清dvd碟片 | 国产精品爽爽久久久久久蜜臀 | 99性视频 | 亚洲在线视频播放 | 日本在线中文 | 国产一区在线观看视频 | 色综合久久中文字幕综合网 | 日产中文字幕 | 国产午夜三级一区二区三 | 欧美成人一区二区 | 97香蕉超级碰碰久久免费软件 | 国产精品久久久久久久久软件 | 国产色就色 | 狠狠狠的干 | 国产精品美女毛片真酒店 | 日日噜噜噜噜夜夜爽亚洲精品 | 激情欧美一区二区三区免费看 | 欧美激情xxxx性bbbb | 97精品一区二区三区 | 天天天色综合a | 欧美在线视频二区 | 99久高清在线观看视频99精品热在线观看视频 | 久久国产乱 | 亚洲国产成人在线 | 超碰97免费观看 | 国产一区二区视频在线 | 福利视频第一页 | 成全在线视频免费观看 | 五月婷婷,六月丁香 | 亚洲午夜精品久久久久久久久 | 一本一道久久a久久精品 | 久久69精品 | 91久久电影 | a级国产乱理论片在线观看 伊人宗合网 | 在线播放 日韩专区 | 97超碰在线免费观看 | 免费av视屏| 久久精久久精 | 日韩精品在线看 | 91完整版在线观看 | 国产精品日韩欧美一区二区 | 亚洲欧美日韩国产 | 91欧美在线 | 国产综合精品一区二区三区 | 久久综合色影院 | 色wwwww| 操操操夜夜操 | 久久精品专区 | 国产做爰视频 | 国产一级在线免费观看 | 亚洲不卡在线 | 国产精品久久久久毛片大屁完整版 | 国产成人免费av电影 | 久久久久久久久久久久影院 | 久久久久日本精品一区二区三区 | 亚洲理论电影 | 日韩精品免费一区二区 | 亚洲视频在线免费看 | 国产精品久久久免费 | 午夜国产一区二区 | 欧美性免费| 免费观看91 | 久草精品在线 | 久久久五月婷婷 | 欧美色综合| 中文字幕在线观看免费高清电影 | 亚洲成人精品 | 国内视频 | 日本三级吹潮在线 | 国产一级黄大片 | 狠狠色2019综合网 | 精产嫩模国品一二三区 | 日本黄色免费看 | 国产成人免费高清 | av中文在线影视 | 亚洲一区二区精品3399 | 欧美一区二区三区免费观看 | 黄av在线| 日韩电影在线看 | 久久一区精品 | 韩日在线一区 | 久久这里只有精品1 | 丝袜制服综合网 | 国产精品久久电影观看 | wwwww.国产 | 日日爽日日操 | 国产精品久久久久久久久久东京 | 在线日韩中文 | 亚洲成人一区 | 国产精品女主播一区二区三区 | 国产精品免费视频一区二区 | 香蕉影院在线观看 | av视屏在线播放 | 色就色,综合激情 | 正在播放国产91 | 日韩高清在线一区二区三区 | 久久久久久福利 | 麻豆国产露脸在线观看 | 九九亚洲精品 | 黄色亚洲大片免费在线观看 | 99国内精品久久久久久久 | 夜夜躁狠狠躁日日躁 | 久久人人精品 | 午夜精品视频免费在线观看 | 人人澡人人草 | 欧美成人在线免费 | 久久黄页 | 在线视频日韩欧美 | 天天爱天天舔 | 亚洲精品看片 | 久久999久久 | 不卡的av电影 | 国产日韩在线视频 | 日韩成人精品一区二区 | 久久麻豆视频 | 伊人导航 | 97精品在线观看 | 精品久久久久久久久久岛国gif | av一区二区在线观看中文字幕 | 丁香婷婷基地 | 久久综合色天天久久综合图片 | 国内综合精品午夜久久资源 | 99精品国自产在线 | 狠狠狠色狠狠色综合 | 国产精品久久久久久久久久久久午夜 | 亚洲激情影院 | 狠狠色丁香婷婷综合基地 | 天天曰天天射 | 中文字幕在线网址 | 国产网站av | 91av观看| 免费一级片视频 | 久久精品中文 | 久草新在线 | 国产精品久久久久久久婷婷 | 欧美色图另类 | 激情五月播播久久久精品 | 亚洲在线看| 69热国产视频 | 精品久久久免费 | 婷婷中文字幕综合 | 免费视频99 | 免费在线精品视频 | 香蕉视频网站在线观看 | 亚洲国产精品资源 | 精品久久久久久综合 | 国产96在线观看 | 国产精品久久久久久久久久直播 | 久久三级视频 | 天天操天天干天天玩 | 制服丝袜亚洲 | 欧美天堂视频在线 | 成人免费 在线播放 | 91探花系列在线播放 | 色欧美综合| 国产三级精品三级在线观看 | 女人高潮特级毛片 | 亚洲精品三级 | 免费观看91视频大全 | 成人免费xxxxxx视频 | 成人中文字幕av | 四虎国产精品成人免费4hu | 91精品国产乱码久久 | 日日干天天插 | 精品综合久久久 | 欧美日韩一区二区三区免费视频 | 国产人在线成免费视频 | 日韩成人xxxx | 精品国产一区二区三区四 | www.夜夜草| 国产v欧美 | 午夜精品久久久久久久99婷婷 | 亚洲爱视频| 久久久国产高清 | 婷婷亚洲综合五月天小说 | 国产精在线 | 九九视频在线观看视频6 | 欧美日韩国产一区二区在线观看 | 热99在线视频 | 精品国产一区二区三区久久影院 | 日韩在线色视频 | 国内外成人免费在线视频 | 久久综合色天天久久综合图片 | 天天色天天色天天色 | 久草视频免费在线观看 | 免费看久久 | 最新真实国产在线视频 | 狠狠狠狠狠狠狠干 | 天天激情综合网 | 98涩涩国产露脸精品国产网 | 欧美日韩中文字幕视频 | 亚洲黄色在线免费观看 | 999日韩 | 91麻豆传媒| 成人羞羞免费 | 亚洲精品在线电影 | 一区二区三区在线看 | 亚洲成人黄色在线观看 | 精品999在线 | 99热9| 欧美日韩二区在线 | 成人a在线观看高清电影 | 天天综合网久久 | 99久久精品无码一区二区毛片 | 亚洲精品小区久久久久久 | 日日夜夜天天 | 欧美激情视频三区 | 国产精品久久久免费 | 高潮久久久 | 婷婷在线视频 | 日韩视频在线不卡 | 综合网天天射 | 亚洲欧洲日韩在线观看 | 久草视频中文在线 | 久久人人爽人人片 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 在线看污网站 | 国产99久久九九精品免费 | 五月av在线 | 婷婷激情综合五月天 | ww亚洲ww亚在线观看 | 一本一本久久a久久精品综合妖精 | 国内视频在线观看 | 婷婷丁香激情 | 国产 日韩 在线 亚洲 字幕 中文 | 天天操天天射天天爽 | 亚洲成人精品影院 | 久久av免费观看 | 中文字幕在线色 | 欧美综合色在线图区 | 九九九在线观看 | 超碰97在线资源站 | 香蕉免费在线 | 久久久精品综合 | 天无日天天操天天干 | 国产一区二区三区免费观看视频 | 麻豆视频在线免费看 | 亚洲成a人片综合在线 | www.久久com | 中文字幕在线观看av | 亚洲婷婷网 | 夜夜爽88888免费视频4848 | 操操日日| 久久99热久久99精品 | 91你懂的| 婷婷社区五月天 | 玖玖视频在线 | 色综合久久久久 | 亚洲精品免费在线观看视频 | 91视频在线国产 | 狠狠色丁香婷婷综合基地 | 国产视频1区2区3区 久久夜视频 | 日本高清中文字幕有码在线 | 免费成人在线网站 | 国产视频一区二区在线 | 国产美女久久 | 狠狠操综合 | 成人国产网站 | 亚洲精品美女视频 | 超碰人人在线 | 欧美日韩成人 | 久久久久日本精品一区二区三区 | av在线网站免费观看 | 国产精品欧美久久久久天天影视 | 91色网址 | 国产日韩欧美中文 | 深夜免费福利 | 国产青草视频在线观看 | 久久久国产成人 | 天天干天天干 | 久草在线看片 | 欧美日韩视频在线一区 | 国产一区成人 | 男女激情麻豆 | 色婷婷综合视频在线观看 | 国产精品自产拍在线观看 | 黄色免费高清视频 | 人人插人人玩 | 欧美天堂久久 | 免费激情在线电影 | 国产视频色 | 69国产盗摄一区二区三区五区 | 亚洲欧洲一级 | 中文字幕黄色av | 国产91精品一区二区麻豆网站 | 色综合久久久久综合体 | 国产午夜不卡 | 国产高清网站 | 国产超碰在线观看 | 手机看片午夜 | 免费观看一区 | 高清国产午夜精品久久久久久 | 91在线免费视频 | 天天插天天色 | 欧美国产精品一区二区 | 久久久久麻豆 | 国产中文欧美日韩在线 | 日韩精品久久久久久久电影竹菊 | 国产精品免费久久久久久 | 亚洲欧美经典 | 黄色网址在线播放 | 国产欧美精品一区二区三区 | 国产成人精品久久久久 | 国内精品久久久 | 91av看片| 久久综合加勒比 | 一本—道久久a久久精品蜜桃 | 婷婷丁香av| 国产精品理论在线观看 | www.xxx.性狂虐| 欧美日韩亚洲在线 | 97色综合| 91桃色免费观看 | 久久久毛片 | 在线观看岛国 | 亚州日韩中文字幕 | 欧美一级性视频 | 国产成人免费在线 | 精品一二三四在线 | 国产手机视频在线播放 | 日本性生活免费看 | 国产分类视频 | 97成人在线观看视频 | 六月天色婷婷 | 欧美亚洲成人免费 | 欧洲一区精品 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 在线成人免费电影 | 免费麻豆视频 | 午夜精品一区二区三区在线播放 | 日韩免费在线一区 | 久久人人艹 | 国产精品久久99精品毛片三a | 激情丁香 | 深夜视频久久 | 在线观看日韩精品 | www.91国产| 岛国一区在线 | 国产精品国产自产拍高清av | 久久久18| 久久久久久久网 | 亚洲狠狠婷婷综合久久久 | 久久精品视频免费观看 | 天天躁天天操 | 人人澡超碰碰97碰碰碰软件 | 国产精品av免费观看 | 欧美精品视 | 日韩欧美在线播放 | 一区二区视频电影在线观看 | 少妇自拍av | 91日韩免费 | 国产黑丝袜在线 | 99久久精品免费看国产免费软件 | 91福利在线导航 | 亚洲精品在线观看av | 久久久久国产精品免费 | 99高清视频有精品视频 | 性色av免费看 | 亚洲艳情| 日韩一级成人av | 婷婷六月色 | 中文一二区 | 成人黄色大片在线观看 | 免费的黄色av | 99热亚洲精品 | 天天天干天天天操 | 亚洲日本韩国一区二区 | 91在线看片 | 人人澡人人草 | 久草在线视频中文 | 久久亚洲精品国产亚洲老地址 | 欧美日韩中文在线 | 中文字幕精品三区 | 中文字幕一区二区三区视频 | 欧美一级视频在线观看 | 日韩一级成人av | 欧美成人黄色 | 日韩在线色视频 | 中文字幕在线播放一区 | 久久久精品午夜 | 一级特黄aaa大片在线观看 | 国产亚洲一区二区在线观看 | 日韩欧美综合精品 | 国产精品久久久久久影院 | 99视频在线免费看 | 九九免费在线看完整版 | 99视频播放 | 国产丝袜| 久久99国产综合精品 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国产小视频免费观看 | 免费观看的av网站 | 91九色蝌蚪视频网站 | 日韩午夜电影 | 国产视频在线播放 | 国产成人av在线影院 | 国产日韩av在线 | www.伊人网.com| 人人插人人舔 | 97色资源| 五月婷婷香蕉 | 99久久电影| 亚洲精品视频国产 | 国产黄色片免费看 | 成人久久综合 | 97视频人人免费看 | av免费网站在线观看 | 人人超碰免费 | 性色va| 九九热精品视频在线观看 | 日韩久久精品一区二区 | 99精品热视频只有精品10 | 夜夜躁日日躁狠狠久久88av | 亚洲精品国偷拍自产在线观看蜜桃 | 黄色一级大片在线观看 | 青青河边草观看完整版高清 | 91热精品| 色狠狠久久av五月综合 | av综合站 | 国产精品毛片一区二区 | 在线激情影院一区 | adn—256中文在线观看 | 99在线看| 99久久国产免费,99久久国产免费大片 | 亚洲国产手机在线 | 国产精品视频线看 | 99热精品久久 | 久久成人免费视频 | 91麻豆精品国产91久久久久 | 九九热在线播放 | 永久免费的啪啪网站免费观看浪潮 | 天天激情天天干 | av电影在线免费观看 | 亚洲精品乱码 | 在线视频麻豆 | 国产精品无av码在线观看 | 91欧美日韩国产 | 久久久久久国产一区二区三区 | 五月婷亚洲 | 欧美作爱视频 | 国产午夜麻豆影院在线观看 | 欧美日韩免费视频 | 天天操天天曰 | 精品理论片 | 欧美一区二区三区在线 | 精品a在线| 99热九九这里只有精品10 | 美女免费视频观看网站 | 日本三级吹潮在线 | 人人插超碰 | 天天爱天天舔 | 亚州国产精品视频 | 9热精品 | 亚洲理论片 | 国产精品美女久久久久久久 | 中文字幕在线久一本久 | 免费福利片2019潦草影视午夜 | 天天射天天爱天天干 | 国内小视频在线观看 | 久久成人在线视频 | 国产精品久久亚洲 | 国产精品成人一区二区 | 午夜av一区 | 久久成人高清 | 狠狠操导航 | 国产高清精品在线 | 国产日韩中文在线 | 久久久高清免费视频 | 一区二区三区不卡在线 | 五月婷婷网站 | 91精品欧美一区二区三区 | 亚洲区另类春色综合小说校园片 | a√资源在线 | 91麻豆文化传媒在线观看 | 国产不卡av在线 | 欧美激情第一区 | 日日夜精品 | 99热9| 综合色在线观看 | 婷婷激情5月天 | 中文字幕在线精品 | 又爽又黄又无遮挡网站动态图 | 国产精品精品久久久久久 | 人人要人人澡人人爽人人dvd | 欧美日韩国产色综合一二三四 | 日本免费久久高清视频 | 日韩av看片 | 久久激情视频 | 色天天中文 | 国内免费的中文字幕 | 五月婷婷在线观看视频 | 欧美一区二区精品在线 | 成人免费观看视频网站 | 国产成人99久久亚洲综合精品 | 婷婷六月在线 | 日韩系列在线 | 91久久国产综合精品女同国语 | 97超碰中文字幕 | 香蕉影院在线观看 | 欧美视频www | 这里只有精品视频在线 | 99久久这里有精品 | av中文字幕电影 | 97免费中文视频在线观看 | 久久高清免费视频 | 亚洲精品午夜久久久久久久久久久 | 国产成人精品一区二区三区在线观看 | 免费在线观看不卡av | 成人黄色av网站 | 五月婷婷开心中文字幕 | 91桃色免费观看 | 人人操日日干 | 欧美日韩高清在线观看 | 午夜10000| 亚洲最大成人网4388xx | 岛国大片免费视频 | 成人三级网址 | 九月婷婷色 | 中文字幕人成人 | 欧洲精品在线视频 | 亚洲a成人v | 99久热在线精品 | 天天干天天拍天天操天天拍 | 欧美日韩在线观看一区二区三区 | 韩日电影在线免费看 | 欧美尹人 | 色综合天天干 | 日韩高清不卡在线 | 91九色老| 日韩精品一区二区三区外面 | 欧美另类激情 | 91免费的视频在线播放 | www在线观看视频 | 国产精品久久片 | av黄色免费在线观看 | 日日夜夜添 | 中文字幕 第二区 | 日韩精品免费一区二区 | 欧美大片在线观看一区 | 国产高清在线精品 | 日本中文字幕免费观看 | 亚洲精品一区二区在线观看 | 超碰人人在线观看 | 97在线看片 | 一区二区久久久久 | 久热色超碰 | 精品欧美小视频在线观看 | 在线91色 | 国产一区二区手机在线观看 | 成人免费视频免费观看 | 国产精品白浆 | 人人揉人人揉人人揉人人揉97 | 中文字幕4 | 久久1区| 最近日本韩国中文字幕 | 狠狠的操你 | 天天弄天天操 | 久久系列| www.久久99 | 免费网址你懂的 | 国产一区二区不卡视频 | 中文在线www | 国内视频1区 | 国产女人40精品一区毛片视频 | 国产黄a三级三级三级三级三级 | 亚洲男女精品 | 最近日本中文字幕 | 久久夜色网 | 免费瑟瑟网站 | 精品久久网 | 日韩av免费一区 | 国产精品亚洲人在线观看 | 亚洲视频免费视频 | 黄色三级免费网址 | 中文字幕一区二区三区乱码在线 | 成人在线你懂得 | 91久久人澡人人添人人爽欧美 | 狠狠躁日日躁夜夜躁av | 午夜精品久久久 | 青青河边草观看完整版高清 | 一区在线观看 | 国产网站在线免费观看 | 在线亚洲天堂网 | 欧美天天干 | 五月婷婷国产 | 国产视频久久久久 | 激情伊人五月天久久综合 | 国产a级免费 | 国产一二区视频 | 一本一本久久a久久精品牛牛影视 | 欧美怡红院视频 | 黄色在线网站噜噜噜 | 91久久精品一区 | 五月婷婷狠狠 | 日韩欧美大片免费观看 | 亚洲精品国产电影 | 中文亚洲欧美日韩 | 99亚洲国产精品 | 91av手机在线| 久久伊人八月婷婷综合激情 | 十八岁以下禁止观看的1000个网站 | 人人爽人人片 | 久久综合久久伊人 | 国产 视频 久久 | 日韩精品一区二区三区在线播放 | 日韩成人看片 | 91免费的视频在线播放 | a黄色一级 | 国产一二三四在线观看视频 | 国产免费高清 | 欧美一级特黄aaaaaa大片在线观看 | 91亚洲国产成人久久精品网站 | av亚洲产国偷v产偷v自拍小说 | 四虎免费在线观看 | 人人舔人人插 | 人人射网站 | 久久国产区 | 国产尤物在线观看 | 麻豆传媒电影在线观看 | 国产福利网站 | 国产一二区视频 | 99视频播放| 狠狠色丁香婷婷综合久久片 | 99日精品| 蜜臀久久99静品久久久久久 | 亚洲一级片在线看 | 在线视频免费观看 | 久久久国产精品成人免费 | 深夜男人影院 | 成人午夜电影久久影院 | 婷婷亚洲综合五月天小说 | 丁香电影小说免费视频观看 | 色偷偷888欧美精品久久久 | 国产免费三级在线观看 | 精品成人网 | 国产一区二区三区高清播放 | 欧美日韩另类在线观看 | 国产小视频国产精品 | 精品视频免费久久久看 | 欧美日韩中文在线视频 | 99热精品视 | 欧美精品免费一区二区 | 国产最顶级的黄色片在线免费观看 | 午夜12点| 99精品99| 日韩在线一区二区免费 | 激情影音先锋 | 欧美黄色高清 | 欧美欧美 | 超碰97在线资源 | a资源在线 | 国产精品com | 日本中文字幕视频 | 国精产品永久999 | 国产免费嫩草影院 | 天天操天天射天天 | 天天操天天干天天操天天干 | 97国产精品| 精品毛片一区二区免费看 | 99在线精品观看 | 91麻豆精品久久久久久 | 久久精品网站免费观看 | 久久久久久久精 | 国产视频一区在线免费观看 | 久久99久久99精品免观看粉嫩 | 欧美午夜精品久久久久久浪潮 | 中文字幕在线播放一区 | 超碰97在线资源 | 涩涩网站在线看 | 日韩女同一区二区三区在线观看 | 97超视频免费观看 | 亚洲高清在线精品 | 日韩av片免费在线观看 | 中文字幕在线成人 | 国产精品成人免费精品自在线观看 | 国产不卡免费 | 不卡的av在线播放 | 免费在线色电影 | 欧美一级久久久久 | 天天干天天操天天爱 | 日韩大片在线观看 | av免费网站在线观看 | h文在线观看免费 | av资源免费观看 | 国产破处在线视频 | 在线导航福利 | 日韩va在线观看 | 麻豆视频91| 狠狠操天天射 | 欧美三级高清 | 99精品电影 | 欧美色黄| 国产精品密入口果冻 | 最近最新最好看中文视频 | 在线免费精品视频 | 亚洲人毛片 | 欧美一区二视频在线免费观看 | 2019天天干夜夜操 | 麻豆国产电影 | 91视频大全 | 亚洲国产中文在线观看 | 69亚洲视频 | 久久久久在线视频 | 黄色电影小说 | 免费在线观看一级片 | 亚洲第一区精品 | 久久久久亚洲精品 | 久久午夜影院 | 欧美在线一 | 亚洲视频精品 | 一级一片免费视频 | 午夜精品电影一区二区在线 | www.狠狠操.com | 99热最新在线 | 波多野结衣网址 | 超碰在线资源 | 在线观看视频你懂 | 成人av地址 | 国产成人精品一区二区在线 | 国产粉嫩在线观看 | 国产精品第三页 | 一级特黄av| 精品夜夜嗨av一区二区三区 | 婷婷综合影院 | 国产色视频123区 | 在线观看免费91 | 最近高清中文字幕 | 国产亚洲激情视频在线 | 国产成a人亚洲精v品在线观看 | www麻豆视频| 亚洲国产成人久久综合 | 99久久国产免费,99久久国产免费大片 | 中文字幕免费高 | 欧美在线一 | 亚洲精品午夜视频 | 久久国产乱 | 精品日韩中文字幕 | 日日夜夜免费精品视频 | 日本高清中文字幕有码在线 | 国产精品1区2区在线观看 | 91视频啪 | 国产午夜三级一二三区 | 久久av一区二区三区亚洲 | 久久免费视频2 | 黄色精品视频 | 97人人模人人爽人人喊中文字 | 久久免费视频一区 | 人人精品久久 | 国产精品激情偷乱一区二区∴ | 国产精品网红直播 | 91精品国产成人观看 | 麻豆91视频 | 国产精品第一页在线观看 | 国产又粗又猛又色又黄网站 | 九九综合久久 | 天天曰视频 | 国产亚洲情侣一区二区无 | 精品国产成人在线影院 | 九九视频在线播放 | 亚洲国产中文字幕 | 免费看的黄色录像 | 亚洲视频1区2区 | 国内久久久久久 | 六月激情丁香 | 免费av高清 | 国产一级黄 | 九九九九九国产 | 黄色一区三区 | 日本高清dvd | 久久久一本精品99久久精品 | 在线成人免费电影 | 日韩欧美电影在线 | 天天综合入口 | 超碰人人乐| 国产在线观看一 | 欧美成人亚洲成人 | 亚洲精品视频二区 | 久久人人97超碰com | 中文字幕日韩精品有码视频 | av在线播放中文字幕 | 狠狠狠色丁香婷婷综合久久五月 | 精品高清视频 | japanese黑人亚洲人4k | 免费在线一区二区 | 亚洲欧美国产精品18p | www.久久色 | 国产精品久久久久久久久久久免费 | 日本韩国在线不卡 | 欧美一级艳片视频免费观看 | 欧美精品免费一区二区 | 欧美性生活免费 | 最近中文字幕久久 | 亚洲激情影院 | 国产精品久久久久毛片大屁完整版 | 亚洲精品高清在线观看 | 中文字幕人成不卡一区 | 亚洲乱亚洲乱亚洲 | 色婷婷久久久综合中文字幕 | 伊人五月天 | 精品电影一区 | 国产麻豆果冻传媒在线观看 | 欧美性猛片, | 国产一区成人在线 | 成人免费观看网站 | 亚洲免费黄色 | 国产精品免费成人 | 日韩免费福利 | 91av电影在线 | 国产日韩欧美在线免费观看 | 黄色日本片 | 亚洲国产精品免费 | 日韩在线短视频 | 亚洲丝袜一区二区 | 久久国产精品久久精品国产演员表 | 国产视频中文字幕 | 久久天堂精品视频 | 最新国产视频 | 久久伊人婷婷 | 天天操天天干天天综合网 | 精品久久一区二区 | 亚洲精品欧美成人 | 高清av影院| 91久久奴性调教 | 天天曰视频 | 99久高清在线观看视频99精品热在线观看视频 | 国产午夜精品一区二区三区嫩草 | 亚洲国产精品激情在线观看 | 黄色小网站在线 | 中文字幕av在线不卡 | 91精品一区二区三区蜜桃 | 在线观看国产高清视频 | 日韩电影一区二区在线 | 91传媒在线| 国产黄a三级| 69国产盗摄一区二区三区五区 | 亚洲精品tv久久久久久久久久 | 国产精品麻豆果冻传媒在线播放 | 夜夜骑天天操 | 亚洲丁香久久久 | 五月天天在线 | .精品久久久麻豆国产精品 亚洲va欧美 | 中文字幕欧美激情 | 国产在线91精品 | 国产精品99爱 | 国产色视频网站 | 夜夜躁日日躁狠狠躁 | 黄色小视频在线观看免费 | 亚洲国产日韩一区 | 超碰97人人干| 一级国产视频 | 成人久久18免费网站 | 97视频人人 | 特级黄色一级 | 91亚洲国产 | 色综合天天色综合 | 又黄又爽又刺激的视频 | 99视频精品视频高清免费 | 91在线观看高清 | 91麻豆精品国产91久久久更新时间 | 国产精品理论视频 | www..com黄色片 | 天天操欧美| 精品视频免费播放 | 人人舔人人爱 | 中文字幕av在线播放 | 99久久99视频只有精品 | 欧美成人xxxx | av永久网址| 国产视频999 | 成人资源在线观看 | 中文字幕不卡在线88 | 草久在线视频 | 亚洲毛片久久 | 色偷偷av男人天堂 | 天天婷婷 | 日批视频 | 国产在线视频一区二区 | 91亚·色| 日韩中文字幕免费视频 | 国产精品一区二区久久久久 | 在线观看国产91 | 国产精品一区二区久久国产 | 国产成人久久精品77777综合 | 91视频最新网址 | 久久天堂网站 | 天天插综合网 | 久久婷综合 | 国产成免费视频 | 久久久久国产成人精品亚洲午夜 | 97视频在线观看视频免费视频 | 黄色的视频网站 | 久久激情日本aⅴ | 欧美男同视频网站 | 成人免费在线看片 | 精品国产综合区久久久久久 | 9999激情| 天天色天天色 | 成人av高清在线观看 | 久久久久久久免费观看 | a视频免费看 | 亚洲欧美偷拍另类 | 久久久久国产a免费观看rela | 中文字幕av影院 | 久久久www成人免费毛片麻豆 | 天堂av在线网址 | 亚洲丁香日韩 |