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

RabbitMQ如何保證消息的可靠投遞?

開(kāi)發(fā) 前端
總而言之,在生產(chǎn)環(huán)境中,我們一般都是單條手動(dòng)ack,消費(fèi)失敗后不會(huì)重新入隊(duì)(因?yàn)楹艽蟾怕蔬€會(huì)再次失敗),而是將消息重新投遞到死信隊(duì)列,方便以后排查問(wèn)題。

 

Spring Boot整合RabbitMQ

github地址:

https://github.com/erlieStar/rabbitmq-examples

Spring有三種配置方式

  1. 基于XML
  2. 基于JavaConfig
  3. 基于注解

當(dāng)然現(xiàn)在已經(jīng)很少使用XML來(lái)做配置了,只介紹一下用JavaConfig和注解的配置方式

RabbitMQ整合Spring Boot,我們只需要增加對(duì)應(yīng)的starter即可

  1. <dependency> 
  2.   <groupId>org.springframework.boot</groupId> 
  3.   <artifactId>spring-boot-starter-amqp</artifactId> 
  4. </dependency> 

基于注解

在application.yaml的配置如下

  1. spring: 
  2.   rabbitmq: 
  3.     host: myhost 
  4.     port: 5672 
  5.     username: guest 
  6.     password: guest 
  7.     virtual-host: / 
  8.  
  9. log: 
  10.   exchange: log.exchange 
  11.   info: 
  12.     queue: info.log.queue 
  13.     binding-key: info.log.key 
  14.   error: 
  15.     queue: error.log.queue 
  16.     binding-key: error.log.key 
  17.   all
  18.     queue: all.log.queue 
  19.     binding-key'*.log.key' 

消費(fèi)者代碼如下

  1. @Slf4j 
  2. @Component 
  3. public class LogReceiverListener { 
  4.  
  5.     /** 
  6.      * 接收info級(jí)別的日志 
  7.      */ 
  8.     @RabbitListener( 
  9.             bindings = @QueueBinding( 
  10.                     value = @Queue(value = "${log.info.queue}", durable = "true"), 
  11.                     exchange = @Exchange(value = "${log.exchange}", type = ExchangeTypes.TOPIC), 
  12.                     key = "${log.info.binding-key}" 
  13.             ) 
  14.     ) 
  15.     public void infoLog(Message message) { 
  16.         String msg = new String(message.getBody()); 
  17.         log.info("infoLogQueue 收到的消息為: {}", msg); 
  18.     } 
  19.  
  20.     /** 
  21.      * 接收所有的日志 
  22.      */ 
  23.     @RabbitListener( 
  24.             bindings = @QueueBinding( 
  25.                     value = @Queue(value = "${log.all.queue}", durable = "true"), 
  26.                     exchange = @Exchange(value = "${log.exchange}", type = ExchangeTypes.TOPIC), 
  27.                     key = "${log.all.binding-key}" 
  28.             ) 
  29.     ) 
  30.     public void allLog(Message message) { 
  31.         String msg = new String(message.getBody()); 
  32.         log.info("allLogQueue 收到的消息為: {}", msg); 
  33.     } 

生產(chǎn)者如下

  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest 
  3. public class MsgProducerTest { 
  4.  
  5.     @Autowired 
  6.     private AmqpTemplate amqpTemplate; 
  7.     @Value("${log.exchange}"
  8.     private String exchange; 
  9.     @Value("${log.info.binding-key}"
  10.     private String routingKey; 
  11.  
  12.     @SneakyThrows 
  13.     @Test 
  14.     public void sendMsg() { 
  15.         for (int i = 0; i < 5; i++) { 
  16.             String message = "this is info message " + i; 
  17.             amqpTemplate.convertAndSend(exchange, routingKey, message); 
  18.         } 
  19.  
  20.         System.in.read(); 
  21.     } 

Spring Boot針對(duì)消息ack的方式和原生api針對(duì)消息ack的方式有點(diǎn)不同

原生api消息ack的方式

消息的確認(rèn)方式有2種

自動(dòng)確認(rèn)(autoAck=true)

手動(dòng)確認(rèn)(autoAck=false)

消費(fèi)者在消費(fèi)消息的時(shí)候,可以指定autoAck參數(shù)

String basicConsume(String queue, boolean autoAck, Consumer callback)

autoAck=false: RabbitMQ會(huì)等待消費(fèi)者顯示回復(fù)確認(rèn)消息后才從內(nèi)存(或者磁盤)中移出消息

autoAck=true: RabbitMQ會(huì)自動(dòng)把發(fā)送出去的消息置為確認(rèn),然后從內(nèi)存(或者磁盤)中刪除,而不管消費(fèi)者是否真正的消費(fèi)了這些消息

手動(dòng)確認(rèn)的方法如下,有2個(gè)參數(shù)

basicAck(long deliveryTag, boolean multiple)

deliveryTag: 用來(lái)標(biāo)識(shí)信道中投遞的消息。RabbitMQ 推送消息給Consumer時(shí),會(huì)附帶一個(gè)deliveryTag,以便Consumer可以在消息確認(rèn)時(shí)告訴RabbitMQ到底是哪條消息被確認(rèn)了。

RabbitMQ保證在每個(gè)信道中,每條消息的deliveryTag從1開(kāi)始遞增

multiple=true: 消息id<=deliveryTag的消息,都會(huì)被確認(rèn)

myltiple=false: 消息id=deliveryTag的消息,都會(huì)被確認(rèn)

消息一直不確認(rèn)會(huì)發(fā)生啥?

如果隊(duì)列中的消息發(fā)送到消費(fèi)者后,消費(fèi)者不對(duì)消息進(jìn)行確認(rèn),那么消息會(huì)一直留在隊(duì)列中,直到確認(rèn)才會(huì)刪除。

如果發(fā)送到A消費(fèi)者的消息一直不確認(rèn),只有等到A消費(fèi)者與rabbitmq的連接中斷,rabbitmq才會(huì)考慮將A消費(fèi)者未確認(rèn)的消息重新投遞給另一個(gè)消費(fèi)者

Spring Boot中針對(duì)消息ack的方式

有三種方式,定義在AcknowledgeMode枚舉類中

方式 解釋
NONE 沒(méi)有ack,等價(jià)于原生api中的autoAck=true
MANUAL 用戶需要手動(dòng)發(fā)送ack或者nack
AUTO 方法正常結(jié)束,spring boot 框架返回ack,發(fā)生異常spring boot框架返回nack

spring boot針對(duì)消息默認(rèn)的ack的方式為AUTO。

在實(shí)際場(chǎng)景中,我們一般都是手動(dòng)ack。

application.yaml的配置改為如下

  1. spring: 
  2.   rabbitmq: 
  3.     host: myhost 
  4.     port: 5672 
  5.     username: guest 
  6.     password: guest 
  7.     virtual-host: / 
  8.     listener: 
  9.       simple: 
  10.         acknowledge-mode: manual # 手動(dòng)ack,默認(rèn)為auto 

相應(yīng)的消費(fèi)者代碼改為

  1. @Slf4j 
  2. @Component 
  3. public class LogListenerManual { 
  4.  
  5.     /** 
  6.      * 接收info級(jí)別的日志 
  7.      */ 
  8.     @RabbitListener( 
  9.             bindings = @QueueBinding( 
  10.                     value = @Queue(value = "${log.info.queue}", durable = "true"), 
  11.                     exchange = @Exchange(value = "${log.exchange}", type = ExchangeTypes.TOPIC), 
  12.                     key = "${log.info.binding-key}" 
  13.             ) 
  14.     ) 
  15.     public void infoLog(Message message, Channel channel) throws Exception { 
  16.         String msg = new String(message.getBody()); 
  17.         log.info("infoLogQueue 收到的消息為: {}", msg); 
  18.         try { 
  19.             // 這里寫各種業(yè)務(wù)邏輯 
  20.             channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); 
  21.         } catch (Exception e) { 
  22.             channel.basicNack(message.getMessageProperties().getDeliveryTag(), falsefalse); 
  23.         } 
  24.     } 

我們上面用到的注解,作用如下

注解 作用
RabbitListener 消費(fèi)消息,可以定義在類上,方法上,當(dāng)定義在類上時(shí)需要和RabbitHandler配合使用
QueueBinding 定義綁定關(guān)系
Queue 定義隊(duì)列
Exchange 定義交換機(jī)
RabbitHandler RabbitListener定義在類上時(shí),需要用RabbitHandler指定處理的方法

基于JavaConfig

既然用注解這么方便,為啥還需要JavaConfig的方式呢?

JavaConfig方便自定義各種屬性,比如同時(shí)配置多個(gè)virtual host等

具體代碼看GitHub把

RabbitMQ如何保證消息的可靠投遞

一個(gè)消息往往會(huì)經(jīng)歷如下幾個(gè)階段

在這里插入圖片描述

所以要保證消息的可靠投遞,只需要保證這3個(gè)階段的可靠投遞即可

生產(chǎn)階段

這個(gè)階段的可靠投遞主要靠ConfirmListener(發(fā)布者確認(rèn))和ReturnListener(失敗通知)

前面已經(jīng)介紹過(guò)了,一條消息在RabbitMQ中的流轉(zhuǎn)過(guò)程為

producer -> rabbitmq broker cluster -> exchange -> queue -> consumer

ConfirmListener可以獲取消息是否從producer發(fā)送到broker

ReturnListener可以獲取從exchange路由不到queue的消息

我用Spring Boot Starter 的api來(lái)演示一下效果

application.yaml

  1. spring: 
  2.   rabbitmq: 
  3.     host: myhost 
  4.     port: 5672 
  5.     username: guest 
  6.     password: guest 
  7.     virtual-host: / 
  8.     listener: 
  9.       simple: 
  10.         acknowledge-mode: manual # 手動(dòng)ack,默認(rèn)為auto 
  11.  
  12. log: 
  13.   exchange: log.exchange 
  14.   info: 
  15.     queue: info.log.queue 
  16.     binding-key: info.log.key 

發(fā)布者確認(rèn)回調(diào)

  1. @Component 
  2. public class ConfirmCallback implements RabbitTemplate.ConfirmCallback { 
  3.  
  4.     @Autowired 
  5.     private MessageSender messageSender; 
  6.  
  7.     @Override 
  8.     public void confirm(CorrelationData correlationData, boolean ack, String cause) { 
  9.         String msgId = correlationData.getId(); 
  10.         String msg = messageSender.dequeueUnAckMsg(msgId); 
  11.         if (ack) { 
  12.             System.out.println(String.format("消息 {%s} 成功發(fā)送給mq", msg)); 
  13.         } else { 
  14.             // 可以加一些重試的邏輯 
  15.             System.out.println(String.format("消息 {%s} 發(fā)送mq失敗", msg)); 
  16.         } 
  17.     } 

失敗通知回調(diào)

  1. @Component 
  2. public class ReturnCallback implements RabbitTemplate.ReturnCallback { 
  3.  
  4.     @Override 
  5.     public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { 
  6.         String msg = new String(message.getBody()); 
  7.         System.out.println(String.format("消息 {%s} 不能被正確路由,routingKey為 {%s}", msg, routingKey)); 
  8.     } 
  1. @Configuration 
  2. public class RabbitMqConfig { 
  3.  
  4.     @Bean 
  5.     public ConnectionFactory connectionFactory( 
  6.             @Value("${spring.rabbitmq.host}") String host, 
  7.             @Value("${spring.rabbitmq.port}"int port, 
  8.             @Value("${spring.rabbitmq.username}") String username, 
  9.             @Value("${spring.rabbitmq.password}") String password
  10.             @Value("${spring.rabbitmq.virtual-host}") String vhost) { 
  11.         CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host); 
  12.         connectionFactory.setPort(port); 
  13.         connectionFactory.setUsername(username); 
  14.         connectionFactory.setPassword(password); 
  15.         connectionFactory.setVirtualHost(vhost); 
  16.         connectionFactory.setPublisherConfirms(true); 
  17.         connectionFactory.setPublisherReturns(true); 
  18.         return connectionFactory; 
  19.     } 
  20.  
  21.     @Bean 
  22.     public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, 
  23.                                          ReturnCallback returnCallback, ConfirmCallback confirmCallback) { 
  24.         RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); 
  25.         rabbitTemplate.setReturnCallback(returnCallback); 
  26.         rabbitTemplate.setConfirmCallback(confirmCallback); 
  27.         // 要想使 returnCallback 生效,必須設(shè)置為true 
  28.         rabbitTemplate.setMandatory(true); 
  29.         return rabbitTemplate; 
  30.     } 

這里我對(duì)RabbitTemplate做了一下包裝,主要就是發(fā)送的時(shí)候增加消息id,并且保存消息id和消息的對(duì)應(yīng)關(guān)系,因?yàn)镽abbitTemplate.ConfirmCallback只能拿到消息id,并不能拿到消息內(nèi)容,所以需要我們自己保存這種映射關(guān)系。在一些可靠性要求比較高的系統(tǒng)中,你可以將這種映射關(guān)系存到數(shù)據(jù)庫(kù)中,成功發(fā)送刪除映射關(guān)系,失敗則一直發(fā)送

  1. @Component 
  2. public class MessageSender { 
  3.  
  4.     @Autowired 
  5.     private RabbitTemplate rabbitTemplate; 
  6.  
  7.     public final Map<String, String> unAckMsgQueue = new ConcurrentHashMap<>(); 
  8.  
  9.     public void convertAndSend(String exchange, String routingKey, String message) { 
  10.         String msgId = UUID.randomUUID().toString(); 
  11.         CorrelationData correlationData = new CorrelationData(); 
  12.         correlationData.setId(msgId); 
  13.         rabbitTemplate.convertAndSend(exchange, routingKey, message, correlationData); 
  14.         unAckMsgQueue.put(msgId, message); 
  15.     } 
  16.  
  17.     public String dequeueUnAckMsg(String msgId) { 
  18.         return unAckMsgQueue.remove(msgId); 
  19.     } 
  20.  

測(cè)試代碼為

  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest 
  3. public class MsgProducerTest { 
  4.  
  5.     @Autowired 
  6.     private MessageSender messageSender; 
  7.     @Value("${log.exchange}"
  8.     private String exchange; 
  9.     @Value("${log.info.binding-key}"
  10.     private String routingKey; 
  11.  
  12.     /** 
  13.      * 測(cè)試失敗通知 
  14.      */ 
  15.     @SneakyThrows 
  16.     @Test 
  17.     public void sendErrorMsg() { 
  18.         for (int i = 0; i < 3; i++) { 
  19.             String message = "this is error message " + i; 
  20.             messageSender.convertAndSend(exchange, "test", message); 
  21.         } 
  22.         System.in.read(); 
  23.     } 
  24.  
  25.     /** 
  26.      * 測(cè)試發(fā)布者確認(rèn) 
  27.      */ 
  28.     @SneakyThrows 
  29.     @Test 
  30.     public void sendInfoMsg() { 
  31.         for (int i = 0; i < 3; i++) { 
  32.             String message = "this is info message " + i; 
  33.             messageSender.convertAndSend(exchange, routingKey, message); 
  34.         } 
  35.         System.in.read(); 
  36.     } 

先來(lái)測(cè)試失敗者通知

輸出為

  1. 消息 {this is error message 0} 不能被正確路由,routingKey為 {test} 
  2. 消息 {this is error message 0} 成功發(fā)送給mq 
  3. 消息 {this is error message 2} 不能被正確路由,routingKey為 {test} 
  4. 消息 {this is error message 2} 成功發(fā)送給mq 
  5. 消息 {this is error message 1} 不能被正確路由,routingKey為 {test} 
  6. 消息 {this is error message 1} 成功發(fā)送給mq 

消息都成功發(fā)送到broker,但是并沒(méi)有被路由到queue中

再來(lái)測(cè)試發(fā)布者確認(rèn)

輸出為

  1. 消息 {this is info message 0} 成功發(fā)送給mq 
  2. infoLogQueue 收到的消息為: {this is info message 0} 
  3. infoLogQueue 收到的消息為: {this is info message 1} 
  4. 消息 {this is info message 1} 成功發(fā)送給mq 
  5. infoLogQueue 收到的消息為: {this is info message 2} 
  6. 消息 {this is info message 2} 成功發(fā)送給mq 

消息都成功發(fā)送到broker,也成功被路由到queue中

存儲(chǔ)階段

這個(gè)階段的高可用還真沒(méi)研究過(guò),畢竟集群都是運(yùn)維搭建的,后續(xù)有時(shí)間的話會(huì)把這快的內(nèi)容補(bǔ)充一下

消費(fèi)階段

消費(fèi)階段的可靠投遞主要靠ack來(lái)保證。

總而言之,在生產(chǎn)環(huán)境中,我們一般都是單條手動(dòng)ack,消費(fèi)失敗后不會(huì)重新入隊(duì)(因?yàn)楹艽蟾怕蔬€會(huì)再次失敗),而是將消息重新投遞到死信隊(duì)列,方便以后排查問(wèn)題

總結(jié)一下各種情況

  1. ack后消息從broker中刪除
  2. nack或者reject后,分為如下2種情況

(1) reque=true,則消息會(huì)被重新放入隊(duì)列

(2) reque=fasle,消息會(huì)被直接丟棄,如果指定了死信隊(duì)列的話,會(huì)被投遞到死信隊(duì)列

本文轉(zhuǎn)載自微信公眾號(hào)「Java識(shí)堂」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java識(shí)堂公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Java識(shí)堂
相關(guān)推薦

2023-03-06 08:16:04

SpringRabbitMQ

2021-04-27 07:52:18

RocketMQ消息投遞

2024-05-09 08:04:23

RabbitMQ消息可靠性

2021-02-02 11:01:31

RocketMQ消息分布式

2024-12-18 07:43:49

2020-09-27 07:44:08

RabbitMQ投遞消息

2023-12-04 09:23:49

分布式消息

2023-11-30 18:03:02

TCP傳輸

2024-08-12 12:17:03

2024-02-20 11:30:23

光纖

2022-07-26 20:00:35

場(chǎng)景RabbitMQMQ

2022-08-02 11:27:25

RabbitMQ消息路由

2023-10-17 16:30:00

TCP

2024-08-06 09:55:25

2024-06-27 08:00:17

2023-11-27 17:29:43

Kafka全局順序性

2024-05-23 12:11:39

2024-12-04 15:38:43

2021-03-08 10:19:59

MQ消息磁盤

2017-08-21 08:51:22

CAN網(wǎng)絡(luò)通訊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本免费在线播放| 久久综合久久色| 中文字幕一区二区三区免费看 | 亚洲精品wwww| av日韩一区二区三区| 亚洲 精品 综合 精品 自拍| 日韩午夜激情| 亚洲欧美制服综合另类| 99视频在线视频| 天堂资源在线中文| 国产久卡久卡久卡久卡视频精品| 欧美高清视频一区二区| 91传媒理伦片在线观看| 亚洲国产福利| 中文字幕一区二区三区蜜月| 91视频免费在线观看| 国产成人精品a视频一区| 免费久久久久久久久| 欧美日韩高清一区二区不卡 | 久久久久久青草| 麻豆中文一区二区| 国内精品视频久久| 亚洲av无码一区二区二三区| 精品久久毛片| 亚洲国产视频一区| 欧美一区二区综合| 精品女同一区二区三区| 久久亚洲精品伦理| 久久偷看各类女兵18女厕嘘嘘| 97中文字幕在线观看| 精品成人免费一区二区在线播放| 亚洲欧洲精品一区二区三区不卡| 国产一区二区三区四区五区加勒比| 天天综合网入口| 偷偷www综合久久久久久久| 亚洲国产精品久久91精品| www.涩涩涩| 自拍一区在线观看| 亚洲精品成人少妇| 一区不卡字幕| 毛片网站在线| av在线这里只有精品| 国产成人精品在线观看| 国产又黄又粗又猛又爽的| 琪琪久久久久日韩精品| 91精品国产麻豆国产自产在线| 国产xxxxx在线观看| 草草在线视频| 亚洲成年人网站在线观看| 精品国产三级a∨在线| 日本在线观看www| 国产精品久久久久久久久久久免费看| 另类欧美小说| 国产在线中文字幕| 久久久久久久久蜜桃| 欧美凹凸一区二区三区视频| 污污网站在线免费观看| 99久久国产综合色|国产精品| 成人免费视频视频在| av免费在线观看不卡| 国产精品一二三区| 成人3d动漫一区二区三区91| 成人黄色在线观看视频| 成人黄色在线视频| 国内精品久久国产| 免费国产在线视频| 中文字幕av一区二区三区| 亚洲精品一品区二品区三品区| 黄色毛片在线观看| 欧美激情一区在线观看| 伊人色综合影院| 成人福利片网站| 亚洲国产精品久久人人爱| 国产原创中文在线观看 | 日韩不卡一区| 久久久www成人免费精品张筱雨 | 成人性生交大片免费看午夜| 国产精品美女久久久久久2018| 伊人久久99| 国模私拍视频在线播放| 精品欧美激情精品一区| 中文字幕永久视频| 精品视频91| 日韩av中文字幕在线| 欧美福利第一页| 亚洲欧美色图| 欧美最顶级的aⅴ艳星| 探花国产精品一区二区| 国产aⅴ综合色| 欧美国产综合视频| 毛片av在线| 黑人巨大精品欧美一区二区免费| xxxx一级片| 高潮按摩久久久久久av免费| 亚洲天堂网在线观看| 好吊日在线视频| 国产精品毛片在线| 成人精品一区二区三区电影黑人 | 97精品视频在线观看自产线路二| 日本高清久久一区二区三区| 久久久久久国产精品免费无遮挡| 亚洲一区av在线| 亚洲成人av免费看| 91久久精品无嫩草影院| 亚洲人成网站免费播放| 青青草激情视频| 天堂一区二区在线免费观看| a级国产乱理论片在线观看99| 国产一级在线| 亚洲r级在线视频| 国产永久免费网站| 妖精视频一区二区三区| 九九精品视频在线观看| 国产成人av免费| 97久久精品人人做人人爽| 99精品视频网站| 欧洲一级精品| 亚洲国产成人精品久久| √天堂中文官网8在线| 丝袜诱惑亚洲看片| 精品无码久久久久国产| 一色桃子av在线| 欧美在线播放高清精品| 一起草在线视频| 欧美日韩亚洲国产精品| 成人美女av在线直播| 国产私拍精品| 色94色欧美sute亚洲线路一ni| 女女调教被c哭捆绑喷水百合| 91亚洲国产| 国产精品视频男人的天堂| 青青操在线视频| 亚洲6080在线| 在线观看亚洲免费视频| 欧美全黄视频| 亚洲综合色激情五月| 日本三级视频在线观看| 欧美亚洲日本国产| av网站免费在线看| 另类av一区二区| 久久国产精品久久| h片在线观看| 亚洲国内精品在线| 国产一二三四在线| 国产精品18久久久久久久久久久久 | 国精品人妻无码一区二区三区喝尿 | 亚洲精品美女久久久| 久久精品国产亚洲av麻豆色欲| 国产一区二区三区免费| 成年人三级视频| 日韩精品中文字幕吗一区二区| 久久久成人的性感天堂| 国产xxxxxx| 亚洲自拍偷拍九九九| 日本wwwxx| 亚洲第一黄色| 久久久久久久久一区| 超级碰碰久久| 国产午夜精品一区二区三区 | 日本一区二区三区视频在线播放 | 亚洲影院色无极综合| 成人在线免费看黄| 精品久久五月天| 精品成人免费视频| www精品美女久久久tv| 中文字幕第21页| 日本黄色精品| 亚洲自拍小视频| 成人性生交大片免费看网站 | 亚洲专区一区二区三区| 欧美色欧美亚洲另类七区| 成人看片毛片免费播放器| 日韩最新在线视频| 成人h动漫精品一区二区无码| 午夜精品福利久久久| 亚洲av无码国产精品麻豆天美| 美日韩一级片在线观看| 国产日韩第一页| 欧美大胆a级| 国产精品视频一区国模私拍| 精产国品自在线www| 亚洲精品一区二区三区精华液| 美日韩一二三区| 综合久久综合久久| 性久久久久久久久久久| 日本午夜一区二区| 男女激情免费视频| 国产一区2区| 9a蜜桃久久久久久免费| 婷婷综合六月| 欧美国产日韩一区二区三区| 青青草免费在线视频| 91精品国产综合久久久久久漫画| 日本三级片在线观看| 国产亲近乱来精品视频| 野花视频免费在线观看| 日韩在线a电影| 国产亚洲精品久久久久久久| 精品久久久久久久久久久aⅴ| 91久久偷偷做嫩草影院| 偷拍精品精品一区二区三区| 欧美肥臀大乳一区二区免费视频| 九一国产在线| 精品国产99国产精品| 最近中文字幕在线视频| 亚洲不卡av一区二区三区| 国产aaaaaaaaa| 91网站最新网址| 国产成人精品综合久久久久99| 三级欧美在线一区| 日韩国产一级片| 一本精品一区二区三区| 欧洲亚洲一区二区| 欧亚精品一区| y111111国产精品久久婷婷| 成人亚洲视频| 日韩av片电影专区| av资源在线看片| 免费不卡在线观看av| 成年人视频在线观看免费| 亚洲国产成人精品一区二区| 国内精品久久久久久久久久| 欧美丝袜丝交足nylons图片| 特黄视频免费看| 亚洲成人自拍网| 亚洲av无码一区二区三区在线| 国产色91在线| 91国模少妇一区二区三区| 99免费精品在线| 黄色av电影网站| 国产一区二区伦理| 亚洲第一区第二区第三区| 久久精品国产成人一区二区三区| 97视频在线免费播放| 亚洲三级影院| 国产中文字幕视频在线观看| 好看不卡的中文字幕| 欧美大片免费播放| 天天综合亚洲| 看一级黄色录像| 中文字幕日韩一区二区不卡 | 无码少妇精品一区二区免费动态| av一区二区久久| 这里只有精品在线观看视频| 国产69精品久久99不卡| 午夜福利三级理论电影| 成人综合婷婷国产精品久久蜜臀 | 在线免费看av片| 欧美日韩一区高清| 亚洲天堂视频在线| 欧美日韩1234| 国产精品爽爽久久| 欧美疯狂做受xxxx富婆| 97人妻精品一区二区三区视频| 欧美男女性生活在线直播观看| 中文字幕在线播放av| 欧美日本高清视频在线观看| 国产一卡二卡三卡| 色丁香久综合在线久综合在线观看| 波多野结衣激情视频| 欧美撒尿777hd撒尿| 国产又粗又猛又色又| 日韩亚洲欧美一区二区三区| 亚洲精品国产精品国| 亚洲精品720p| 欧美大片aaa| 中文字幕久久久| 黄色精品在线观看| 欧美激情奇米色| 筱崎爱全乳无删减在线观看| 国产精品999999| 国产精品高清一区二区| 国产传媒一区| 国产videos久久| 久久久一二三四| 亚洲东热激情| 熟女少妇精品一区二区| 韩国欧美国产一区| 老司机免费视频| 国产精品三级视频| 免费在线视频一区二区| 日韩人体视频一二区| 亚洲系列在线观看| 精品国产乱码久久久久久蜜臀| 每日更新在线观看av| 久久人人爽人人爽爽久久| 99色在线观看| 国产欧美va欧美va香蕉在| 91久久偷偷做嫩草影院电| 日本视频一区二区在线观看| 在线观看国产精品入口| 18禁男女爽爽爽午夜网站免费| 美女精品一区二区| 色婷婷精品久久二区二区密| 欧美韩国一区二区| 日韩女优在线观看| 5566中文字幕一区二区电影 | 久久这里只有精品首页| 999精品视频在线观看播放| 婷婷成人综合网| 99久久免费国产精精品| 亚洲欧美中文另类| sis001亚洲原创区| 国产日韩欧美视频在线| 亚洲精华一区二区三区| 老司机午夜免费福利视频| 米奇777在线欧美播放| 欧美老女人bb| 国产精品成人一区二区艾草| 久久久久亚洲av成人毛片韩| 日韩女优av电影在线观看| av福利在线播放| 26uuu另类亚洲欧美日本一| 亚洲国产精品免费视频| 夜夜爽99久久国产综合精品女不卡| 最新成人av网站| 久久aaaa片一区二区| 国产精品不卡视频| 无码一区二区三区在线观看| 亚洲国产精品热久久| 蜜臀av在线播放| 91影视免费在线观看| 成人aaaa| 日韩免费高清在线| 久久综合九色综合久久久精品综合| 天天综合天天做| 欧美精品粉嫩高潮一区二区| 二人午夜免费观看在线视频| 欧美在线免费观看| 欧美巨大xxxx| 精品久久久久久久久久中文字幕| 国产精品综合网| 欧美国产日韩在线观看成人| 欧美中文字幕亚洲一区二区va在线 | 欧美成人一二区| 手机成人在线| 美女视频黄久久| 娇小11一12╳yⅹ╳毛片| 欧美性做爰猛烈叫床潮| 国产一二三区在线视频| 日本不卡高字幕在线2019| 西野翔中文久久精品字幕| 成人一对一视频| 91丨九色丨尤物| 欧美精品韩国精品| 亚洲天堂av电影| 99re66热这里只有精品4| 日韩中文字幕一区| 日本午夜精品视频在线观看| 男人的天堂官网| 精品污污网站免费看| 免费黄色网页在线观看| 成人免费福利在线| 午夜久久99| 自拍视频第一页| 亚洲香肠在线观看| 天天干天天插天天操| 欧美自拍视频在线观看| 欧美精品系列| 亚洲三级在线观看视频| 亚洲欧美一区二区三区孕妇| 亚洲第一黄色片| 97国产一区二区精品久久呦| 免费观看不卡av| 天堂在线中文在线| 亚洲综合色自拍一区| 少妇高潮久久久| 国产精品扒开腿做爽爽爽男男| 日韩欧美视频| 人妻换人妻a片爽麻豆| 欧美日韩免费看| 8888四色奇米在线观看| 亚洲在线免费视频| 国产精品试看| 免费黄色激情视频| 亚洲第一中文字幕在线观看| 欧美成人黑人| www.亚洲一区二区| 99精品一区二区三区| 最新黄色网址在线观看| 欧美福利视频在线观看| 蜜桃a∨噜噜一区二区三区| 狠狠操狠狠干视频| 亚洲成a人v欧美综合天堂 | 欧美国产日韩一二三区| 国产麻豆免费观看| 欧美亚洲另类激情另类| 97精品视频在线看| 玖玖爱在线精品视频| 欧美日韩免费在线视频| 91桃色在线| 亚洲日本一区二区三区在线不卡 | 摸摸摸bbb毛毛毛片| 欧美不卡在线视频| 成人全视频免费观看在线看| 久操网在线观看| 亚洲欧洲99久久| 同心难改在线观看| 91成人理论电影| 日韩不卡在线观看日韩不卡视频|