久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例

瀏覽:4日期:2023-04-25 17:03:38

本篇會和SpringBoot做整合,采用自動配置的方式進(jìn)行開發(fā),我們只需要聲明RabbitMQ地址就可以了,關(guān)于各種創(chuàng)建連接關(guān)閉連接的事都由Spring幫我們了~

交給Spring幫我們管理連接可以讓我們專注于業(yè)務(wù)邏輯,就像聲明式事務(wù)一樣易用,方便又高效。

祝有好收獲,先贊后看,快樂無限。

本文代碼:

https://gitee.com/he-erduo/spring-boot-learning-demo

https://github.com/he-erduo/spring-boot-learning-demo

1. 環(huán)境配置

第一節(jié)我們先來搞一下環(huán)境的配置,上一篇中我們已經(jīng)引入了自動配置的包,我們既然使用了自動配置的方式,那RabbitMQ的連接信息我們直接放在配置文件中就行了,就像我們需要用到JDBC連接的時(shí)候去配置一下DataSource一樣。

SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例

如圖所示,我們只需要指明一下連接的IP+端口號和用戶名密碼就行了,這里我用的是默認(rèn)的用戶名與密碼,不寫的話默認(rèn)也都是guest,端口號也是默認(rèn)5672。

主要我們需要看一下手動確認(rèn)消息的配置,需要配置成manual才是手動確認(rèn),日后還會有其他的配置項(xiàng),眼下我們配置這一個(gè)就可以了。

接下來我們要配置一個(gè)Queue,上一篇中我們往一個(gè)名叫erduo的隊(duì)列中發(fā)送消息,當(dāng)時(shí)是我們手動定義的此隊(duì)列,這里我們也需要手動配置,聲明一個(gè)Bean就可以了。

@Configuration public class RabbitmqConfig { @Bean public Queue erduo() { // 其三個(gè)參數(shù):durable exclusive autoDelete // 一般只設(shè)置一下持久化即可 return new Queue('erduo',true); } }

就這么簡單聲明一下就可以了,當(dāng)然了RabbitMQ畢竟是一個(gè)獨(dú)立的組件,如果你在RabbitMQ中通過其他方式已經(jīng)創(chuàng)建過一個(gè)名叫erduo的隊(duì)列了,你這里也可以不聲明,這里起到的一個(gè)效果就是如果你沒有這個(gè)隊(duì)列,會按照你聲明的方式幫你創(chuàng)建這個(gè)隊(duì)列。

配置完環(huán)境之后,我們就可以以SpringBoot的方式來編寫生產(chǎn)者和消費(fèi)者了。

2. 生產(chǎn)者與RabbitTemplate

和上一篇的節(jié)奏一樣,我們先來編寫生產(chǎn)者,不過這次我要引入一個(gè)新的工具:RabbitTemplate。

聽它的這個(gè)名字就知道,又是一個(gè)拿來即用的工具類,Spring家族這點(diǎn)就很舒服,什么東西都給你封裝一遍,讓你用起來更方便更順手。

RabbitTemplate實(shí)現(xiàn)了標(biāo)準(zhǔn)AmqpTemplate接口,功能大致可以分為發(fā)送消息和接受消息。

我們這里是在生產(chǎn)者中來用,主要就是使用它的發(fā)送消息功能:send和convertAndSend方法。

// 發(fā)送消息到默認(rèn)的Exchange,使用默認(rèn)的routing key void send(Message message) throws AmqpException; // 使用指定的routing key發(fā)送消息到默認(rèn)的exchange void send(String routingKey, Message message) throws AmqpException; // 使用指定的routing key發(fā)送消息到指定的exchange void send(String exchange, String routingKey, Message message) throws AmqpException;

send方法是發(fā)送byte數(shù)組的數(shù)據(jù)的模式,這里代表消息內(nèi)容的對象是Message對象,它的構(gòu)造方法就是傳入byte數(shù)組數(shù)據(jù),所以我們需要把我們的數(shù)據(jù)轉(zhuǎn)成byte數(shù)組然后構(gòu)造成一個(gè)Message對象再進(jìn)行發(fā)送。

// Object類型,可以傳入POJO void convertAndSend(Object message) throws AmqpException; void convertAndSend(String routingKey, Object message) throws AmqpException; void convertAndSend(String exchange, String routingKey, Object message) throws AmqpException;

convertAndSend方法是可以傳入POJO對象作為參數(shù),底層是有一個(gè)MessageConverter幫我們自動將數(shù)據(jù)轉(zhuǎn)換成byte類型或String或序列化類型。

所以這里支持的傳入對象也只有三種:byte類型,String類型和實(shí)現(xiàn)了Serializable接口的POJO。

介紹完了,我們可以看一下代碼:

@Slf4j @Component('rabbitProduce') public class RabbitProduce { @Autowired private RabbitTemplate rabbitTemplate; public void send() { String message = 'Hello 我是作者和耳朵,歡迎關(guān)注我。' + LocalDateTime.now().toString(); System.out.println('Message content : ' + message); // 指定消息類型 MessageProperties props = MessagePropertiesBuilder.newInstance() .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN).build(); rabbitTemplate.send(Producer.QUEUE_NAME,new Message(message.getBytes(StandardCharsets.UTF_8),props)); System.out.println('消息發(fā)送完畢。'); } public void convertAndSend() { User user = new User(); System.out.println('Message content : ' + user); rabbitTemplate.convertAndSend(Producer.QUEUE_NAME,user); System.out.println('消息發(fā)送完畢。'); } }

這里我特意寫明了兩個(gè)例子,一個(gè)用來測試send,另一個(gè)用來測試convertAndSend。

send方法里我們看下來和之前的代碼是幾乎一樣的,定義一個(gè)消息,然后直接send,但是這個(gè)構(gòu)造消息的構(gòu)造方法可能比我們想的要多一個(gè)參數(shù),我們原來說的只要把數(shù)據(jù)轉(zhuǎn)成二進(jìn)制數(shù)組放進(jìn)去即可,現(xiàn)在看來還要多放一個(gè)參數(shù)了。

MessageProperties,是的我們需要多放一個(gè)MessageProperties對象,從他的名字我們也可以看出它的功能就是附帶一些參數(shù),但是某些參數(shù)是少不了的,不帶不行。

比如我的代碼這里就是設(shè)置了一下消息的類型,消息的類型有很多種可以是二進(jìn)制類型,文本類型,或者序列化類型,JSON類型,我這里設(shè)置的就是文本類型,指定類型是必須的,也可以為我們拿到消息之后要將消息轉(zhuǎn)換成什么樣的對象提供一個(gè)參考。

convertAndSend方法就要簡單太多,這里我放了一個(gè)User對象拿來測試用,直接指定隊(duì)列然后放入這個(gè)對象即可。

Tips:User必須實(shí)現(xiàn)Serializable接口,不然的話調(diào)用此方法的時(shí)候會拋出IllegalArgumentException異常。

代碼完成之后我們就可以調(diào)用了,這里我寫一個(gè)測試類進(jìn)行調(diào)用:

@SpringBootTest public class RabbitProduceTest { @Autowired private RabbitProduce rabbitProduce; @Test public void sendSimpleMessage() { rabbitProduce.send(); rabbitProduce.convertAndSend(); } }

效果如下圖~

SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例

同時(shí)在控制臺使用命令rabbitmqctl.bat list_queues查看隊(duì)列-erduo現(xiàn)在的情況:

如此一來,我們的生產(chǎn)者測試就算完成了,現(xiàn)在消息隊(duì)列里兩條消息了,而且消息類型肯定不一樣,一個(gè)是我們設(shè)置的文本類型,一個(gè)是自動設(shè)置的序列化類型。

3. 消費(fèi)者與RabbitListener

既然隊(duì)列里面已經(jīng)有消息了,接下來我們就要看我們該如何通過新的方式拿到消息并消費(fèi)與確認(rèn)了。

消費(fèi)者這里我們要用到@RabbitListener來幫我們拿到指定隊(duì)列消息,它的用法很簡單也很復(fù)雜,我們可以先來說簡單的方式,直接放到方法上,指定監(jiān)聽的隊(duì)列就行了。

@Slf4j @Component('rabbitConsumer') public class RabbitConsumer { @RabbitListener(queues = Producer.QUEUE_NAME) public void onMessage(Message message, Channel channel) throws Exception { System.out.println('Message content : ' + message); channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); System.out.println('消息已確認(rèn)'); } }

這段代碼就代表onMessage方法會處理erduo(Producer.QUEUE_NAME是常量字符串'erduo')隊(duì)列中的消息。

我們可以看到這個(gè)方法里面有兩個(gè)參數(shù),Message和Channel,如果用不到Channel可以不寫此參數(shù),但是Message消息一定是要的,它代表了消息本身。

我們可以想想,我們的程序從RabbitMQ之中拉回一條條消息之后,要以怎么樣的方式展示給我們呢?

沒錯,就是封裝為一個(gè)個(gè)Message對象,這里面放入了一條消息的所有信息,數(shù)據(jù)結(jié)構(gòu)是什么樣一會我一run你就能看到了。

同時(shí)這里我們使用Channel做一個(gè)消息確認(rèn)的操作,這里的DeliveryTag代表的是這個(gè)消息在隊(duì)列中的序號,這個(gè)信息存放在MessageProperties中。

4. SpringBoot 啟動!

編寫完生產(chǎn)者和消費(fèi)者,同時(shí)已經(jīng)運(yùn)行過生產(chǎn)者往消息隊(duì)列里面放了兩條信息,接下來我們可以直接啟動消息,查看消費(fèi)情況:

SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例

在我紅色框線標(biāo)記的地方可以看到,因?yàn)槲覀冇辛讼M(fèi)者所以項(xiàng)目啟動后先和RabbitMQ建立了一個(gè)連接進(jìn)行監(jiān)聽隊(duì)列。

隨后就開始消費(fèi)我們隊(duì)列中的兩條消息:

第一條信息是contentType=text/plain類型,所以直接就在控制臺上打印出了具體內(nèi)容。

第二條信息是contentType=application/x-java-serialized-object,在打印的時(shí)候只打印了一個(gè)內(nèi)存地址+字節(jié)大小。

不管怎么說,數(shù)據(jù)我們是拿到了,也就是代表我們的消費(fèi)是沒有問題的,同時(shí)也都進(jìn)行了消息確認(rèn)操作,從數(shù)據(jù)上看,整個(gè)消息可以分為兩部分:body和MessageProperties。

我們可以單獨(dú)使用一個(gè)注解拿到這個(gè)body的內(nèi)容 - @Payload

@RabbitListener(queues = Producer.QUEUE_NAME) public void onMessage(@Payload String body, Channel channel) throws Exception { System.out.println('Message content : ' + body); }

也可以單獨(dú)使用一個(gè)注解拿到MessageProperties的headers屬性,headers屬性在截圖里也可以看到,只不過是個(gè)空的 - @Headers。

@RabbitListener(queues = Producer.QUEUE_NAME) public void onMessage(@Payload String body, @Headers Map<String,Object> headers) throws Exception { System.out.println('Message content : ' + body); System.out.println('Message headers : ' + headers); }

這兩個(gè)注解都算是擴(kuò)展知識,我還是更喜歡直接拿到全部,全都要!!!

上面我們已經(jīng)完成了消息的發(fā)送與消費(fèi),整個(gè)過程我們可以再次回想一下,一切都和我畫的這張圖上一樣的軌跡:

SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例

只不過我們一直沒有指定Exchage一直使用的默認(rèn)路由,希望大家好好記住這張圖。

5. @RabbitListener與@RabbitHandler

下面再來補(bǔ)一些知識點(diǎn),有關(guān)@RabbitListener與@RabbitHandler。

@RabbitListener上面我們已經(jīng)簡單的進(jìn)行了使用,稍微擴(kuò)展一下它其實(shí)是可以監(jiān)聽多個(gè)隊(duì)列的,就像這樣:

@RabbitListener(queues = { 'queue1', 'queue2' }) public void onMessage(Message message, Channel channel) throws Exception { System.out.println('Message content : ' + message); channel.basicAck(message.getMessageProperties().getDeliveryTag(),false) System.out.println('消息已確認(rèn)'); }

還有一些其他的特性如綁定之類的,這里不再贅述因?yàn)樘簿幋a了一般用不上。

下面來說說這節(jié)要主要講的一個(gè)特性:@RabbitListener和@RabbitHandler的搭配使用。

前面我們沒有提到,@RabbitListener注解其實(shí)是可以注解在類上的,這個(gè)注解在類上標(biāo)志著這個(gè)類監(jiān)聽某個(gè)隊(duì)列或某些隊(duì)列。

這兩個(gè)注解的搭配使用就要讓@RabbitListener注解在類上,然后用@RabbitHandler注解在方法上,根據(jù)方法參數(shù)的不同自動識別并去消費(fèi),寫個(gè)例子給大家看一看更直觀一些。

@Slf4j @Component('rabbitConsumer') @RabbitListener(queues = Producer.QUEUE_NAME) public class RabbitConsumer { @RabbitHandler public void onMessage(@Payload String message){ System.out.println('Message content : ' + message); } @RabbitHandler public void onMessage(@Payload User user) { System.out.println('Message content : ' + user); } }

大家可以看看這個(gè)例子,我們先用@RabbitListener監(jiān)聽erduo隊(duì)列中的消息,然后使用@RabbitHandler注解了兩個(gè)方法。

第一個(gè)方法的body類型是String類型,這就代表著這個(gè)方法只能處理文本類型的消息。 第二個(gè)方法的body類型是User類型,這就代表著這個(gè)方法只能處理序列化類型且為User類型的消息。

這兩個(gè)方法正好對應(yīng)著我們第二節(jié)中測試類會發(fā)送的兩種消息,所以我們往RabbitMQ中發(fā)送兩條測試消息,用來測試這段代碼,看看效果:

SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例

都在控制臺上如常打印了,如果@RabbitHandler注解的方法中沒有一個(gè)的類型可以和你消息的類型對的上,比如消息都是byte數(shù)組類型,這里沒有對應(yīng)的方法去接收,系統(tǒng)就會在控制臺不斷的報(bào)錯,如果你出現(xiàn)這個(gè)情況就證明你類型寫的不正確。

假設(shè)你的erduo隊(duì)列中會出現(xiàn)三種類型的消息:byte,文本和序列化,那你就必須要有對應(yīng)的處理這三種消息的方法,不然消息發(fā)過來的時(shí)候就會因?yàn)闊o法正確轉(zhuǎn)換而報(bào)錯。

而且使用了@RabbitHandler注解之后就不能再和之前一樣使用Message做接收類型。

@RabbitHandler public void onMessage(Message message, Channel channel) throws Exception { System.out.println('Message content : ' + message); channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); System.out.println('消息已確認(rèn)'); }

這樣寫的話會報(bào)類型轉(zhuǎn)換異常的,所以二者選其一。

同時(shí)上文我的@RabbitHandler沒有進(jìn)行消息確認(rèn),大家可以自己試一下進(jìn)行消息確認(rèn)。

6. 消息的序列化轉(zhuǎn)換

通過上文我們已經(jīng)知道,能被自動轉(zhuǎn)換的對象只有byte[]、String、java序列化對象(實(shí)現(xiàn)了Serializable接口的對象),但是并不是所有的Java對象都會去實(shí)現(xiàn)Serializable接口,而且序列化的過程中使用的是JDK自帶的序列化方法,效率低下。

所以我們更普遍的做法是:使用Jackson先將數(shù)據(jù)轉(zhuǎn)換成JSON格式發(fā)送給RabbitMQ,再接收消息的時(shí)候再用Jackson將數(shù)據(jù)反序列化出來。

這樣做可以完美解決上面的痛點(diǎn):消息對象既不必再去實(shí)現(xiàn)Serializable接口,也有比較高的效率(Jackson序列化效率業(yè)界應(yīng)該是最好的了)。

默認(rèn)的消息轉(zhuǎn)換方案是消息轉(zhuǎn)換頂層接口-MessageConverter的一個(gè)子類:SimpleMessageConverter,我們?nèi)绻獡Q到另一個(gè)消息轉(zhuǎn)換器只需要替換掉這個(gè)轉(zhuǎn)換器就行了。

SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例

上圖是MessageConverter結(jié)構(gòu)樹的結(jié)構(gòu)樹,可以看到除了SimpleMessageConverter之外還有一個(gè)Jackson2JsonMessageConverter,我們只需要將它定義為Bean,就可以直接使用這個(gè)轉(zhuǎn)換器了。

@Bean public MessageConverter jackson2JsonMessageConverter() { return new Jackson2JsonMessageConverter(jacksonObjectMapper); }

這樣就可以了,這里的jacksonObjectMapper可以不傳入,但是默認(rèn)的ObjectMapper方案對JDK8的時(shí)間日期序列化會不太友好,具體可以參考我的上一篇文章:從LocalDateTime序列化探討全局一致性序列化,總的來說就是定義了自己的ObjectMapper。

同時(shí)為了接下來測試方便,我又定義了一個(gè)專門測試JSON序列化的隊(duì)列:

@Bean public Queue erduoJson() { // 其三個(gè)參數(shù):durable exclusive autoDelete // 一般只設(shè)置一下持久化即可 return new Queue('erduo_json',true); }

如此之后就可以進(jìn)行測試了,先是生產(chǎn)者代碼:

public void sendObject() { Client client = new Client(); System.out.println('Message content : ' + client); rabbitTemplate.convertAndSend(RabbitJsonConsumer.JSON_QUEUE,client); System.out.println('消息發(fā)送完畢。'); }

我又重新定義了一個(gè)Client對象,它和之前測試使用的User對象成員變量都是一樣的,不一樣的是它沒有實(shí)現(xiàn)Serializable接口。

同時(shí)為了保留之前的測試代碼,我又新建了一個(gè)RabbitJsonConsumer,用于測試JSON序列化的相關(guān)消費(fèi)代碼,里面定義了一個(gè)靜態(tài)變量:JSON_QUEUE = 'erduo_json';

所以這段代碼是將Client對象作為消息發(fā)送到'erduo_json'隊(duì)列中去,隨后我們在測試類中run一下進(jìn)行一次發(fā)送。

緊著是消費(fèi)者代碼:

@Slf4j @Component('rabbitJsonConsumer') @RabbitListener(queues = RabbitJsonConsumer.JSON_QUEUE) public class RabbitJsonConsumer { public static final String JSON_QUEUE = 'erduo_json'; @RabbitHandler public void onMessage(Client client, @Headers Map<String,Object> headers, Channel channel) throws Exception { System.out.println('Message content : ' + client); System.out.println('Message headers : ' + headers); channel.basicAck((Long) headers.get(AmqpHeaders.DELIVERY_TAG),false); System.out.println('消息已確認(rèn)'); } }

有了上文的經(jīng)驗(yàn)之后,這段代碼理解起來也是很簡單了吧,同時(shí)給出了上一節(jié)沒寫的如何在@RabbitHandler模式下進(jìn)行消息簽收。

我們直接來看看效果:

SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例

SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例

在打印的Headers里面,往后翻可以看到contentType=application/json,這個(gè)contentType是表明了消息的類型,這里正是說明我們新的消息轉(zhuǎn)換器生效了,將所有消息都轉(zhuǎn)換成了JSON類型。

后記

這兩篇講完了RabbitMQ的基本收發(fā)消息,包括手動配置和自動配置的兩種方式,這些大家仔細(xì)研讀之后應(yīng)該會對RabbitMQ收發(fā)消息沒什么疑問了~

不過我們一直以來發(fā)消息時(shí)都是使用默認(rèn)的交換機(jī),下篇將會講述一下RabbitMQ的幾種交換機(jī)類型,以及其使用方式。

到此這篇關(guān)于SpringBoot+RabbitMQ方式收發(fā)消息的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot RabbitMQ 收發(fā)消息內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 亚洲精品在线播放视频 | 日本爱爱 | 日韩精品一区二区三区在线观看 | 日本免费一区二区三区 | 91视频88av | 国产福利在线观看 | 91精品国产一区二区 | 久久免费在线观看 | 婷婷久久五月天 | 日本成人黄色网址 | 国精品一区 | 成人在线播放 | 国产日韩欧美视频 | 久久成人精品 | 免费久久99精品国产婷婷六月 | 精品国产黄a∨片高清在线 激情网站免费 | 91在线影院 | 中文字幕一区二区在线观看 | 奇米av在线| 精品婷婷 | 亚洲精品在线视频观看 | 中文字幕7777 | 日本成人在线视频网站 | 精品亚洲永久免费精品 | 日本中文字幕一区 | 欧美日韩一区二区三区在线观看 | 欧美在线视频一区二区 | 国产成人精品亚洲777人妖 | 色婷婷国产精品久久包臀 | 国产一级免费网站 | 国产亚洲一区二区三区在线观看 | 在线精品亚洲欧美日韩国产 | 日韩在线视频资源 | 久久国产精品久久久久久 | 欧美日韩在线播放 | 成人午夜免费视频 | 女朋友的闺蜜3韩国三级 | 91社区在线观看高清 | 少妇色欲网| 国产精产国品一二三产区视频 | 天天躁日日躁狠狠躁av麻豆 | 亚洲人成在线观看 | 在线视频中文字幕 | 日韩精品一区二区三区四区视频 | 久久久久一区二区 | 国产日本韩国在线 | 国产精品爱久久久久久久 | 在线免费观看黄色 | 精品国产91久久久久久久 | 亚洲一级毛片 | 亚洲综合成人网 | 国产精品成人在线观看 | 亚洲精品久久久 | 成人免费视频网站在线观看 | 欧美日在线 | 99热这里有精品 | 亚洲精品乱码久久久久久久久 | 大陆一级毛片免费视频观看 | 人人草视频在线观看 | 亚洲精品亚洲人成人网 | 在线免费观看色视频 | 精品国产高清一区二区三区 | 国产一区二区在线视频 | www.五月天婷婷 | 久久久久国产一级毛片 | 日韩视频精品在线观看 | 少妇久久久 | 成人在线播放 | 鲁一鲁影院 | 欧美色欧美亚洲另类七区 | 成年人av网站 | 成人在线播放器 | 亚洲国产精品一区二区三区 | 在线观看国精产品二区1819 | 精品国产一区二区三区久久影院 | 在线视频 欧美日韩 | www.操操操.com| 可以免费观看的av片 | 在线一区二区三区视频 | 精品国产欧美一区二区三区成人 | 日韩国产| 青娱乐国产精品视频 | 日韩日日夜夜 | 81精品国产乱码久久久久久 | 成人亚洲区 | 亚洲高清在线观看 | 亚欧毛片 | 免费在线成人 | av一区二区三区在线观看 | 久久永久视频 | 在线成人av | 欧美日韩国产一区二区在线观看 | 欧美日本一区 | 国产日产精品一区二区三区四区 | 成人免费一区二区三区视频网站 | 国产一区二区三区视频 | 久久久久久免费看 | 先锋av资源在线 | 国产三级在线观看 | 成年网站在线 | 久久99国产精品免费网站 | 国产1区2区3区 | 日韩一二三区 | 色婷婷综合网 | 男女羞羞视频在线免费观看 | 成人免费一区二区三区 | 亚洲成人日韩 | 黄视频在线播放 | 99精品在线| av网站推荐 | 欧美激情久久久 | 国产日韩免费视频 | 国产一区在线视频 | 在线欧美日韩 | 成人一区二区三区在线观看 | 在线中文字幕第一页 | 91精品国产91久久久久久最新 | 久久这里只有精品首页 | a免费观看 | 国产一级片 | 久久久久久艹 | 欧美日韩一区二区三区在线电影 | 久久91 | 91极品国产| 二区视频| 神马香蕉久久 | 最新亚洲黄色网址 | 国产91在线播放精品91 | 国产91视频一区二区 | 亚洲精品区 | 亚洲伊人成人 | 精品一区二区三区在线观看 | 一区二区免费在线播放 | 亚洲视频在线观看免费 | 久久99久久98精品免观看软件 | 色99在线 | 天天干国产 | 亚洲精品一区二区三区蜜桃久 | 在线视频 亚洲 | 极品久久| 亚洲九九 | 99精品欧美一区二区三区综合在线 | 亚洲久视频| 国产成人精品在线 | 亚洲综合色自拍一区 | 亚洲三级在线看 | 亚洲1区2区在线 | 成人看的免费视频 | 午夜在线视频 | 91国内外精品自在线播放 | 国产精品高潮呻吟 | 中文字幕日韩欧美一区二区三区 | 黄色二区 | 亚洲人成在线播放 | 狠狠操夜夜操 | 在线观看国产视频 | 麻豆精品久久 | 99爱视频 | 国产精品45p | 欧美福利一区 | 天天射欧美| 欧美激情在线免费观看 | 日日夜夜爽 | 欧美视频免费在线 | 武道仙尊动漫在线观看 | 久久精品成人 | 国产精品久久久久婷婷二区次 | 精品久久一区二区三区 | 美女视频一区二区三区 | 日韩福利视频 | 亚洲一区二区中文字幕 | 4h影视 | 国产精品一区一区三区 | 91久久国产综合久久蜜月精品 | 少妇久久久 | 欧美日韩成人在线观看 | 黄色一级片免费播放 | 精品在线看 | the蜜臀av入口| jizz国产免费| 日本成人在线视频网站 | 99pao成人国产永久免费视频 | 久久成年人视频 | 国产成人天天爽高清视频 | 中文字幕在线三区 | 中文久久| 国产三级在线 | 品久久久久久久久久96高清 | 国产97碰免费视频 | 久久成人久久爱 | 一区二区三区免费网站 | 中文字幕在线精品 | 成人a在线 | 粉嫩视频在线观看 | 亚洲一区电影 | 中文字幕乱码一区二区三区 | 国产裸体bbb视频 | 欧美日韩精品综合 | 午夜精品在线观看 | 精品久久一区二区三区 | 午夜国产精品成人 | 电影午夜精品一区二区三区 | 午夜视频在线观看网址 | 青青草精品 | 日韩一区二区在线免费观看 | 亚洲高清av| 一区二区三区国产精品 | 欧美一区二区在线免费观看 | 成人做爰www免费看视频网站 | 91久久夜色精品国产九色 | 息与子猛烈交尾一区二区 | 欧美三级在线 | 免费在线观看成年人视频 | 91成人免费在线视频 | 国产性×xxx盗摄xxxx | 国产在线小视频 | 久久亚洲欧美日韩精品专区 | 免费一级欧美在线观看视频 | 久久9999| 黄色综合网 | 天天干天天去 | 天堂资源av | 成人免费一区 | 亚洲精品一区二区三区蜜桃久 | 冷水浴在线观看 | 人人草天天草 | 久久午夜精品 | 成人在线免费 | 国产精品久久久久久久午夜片 | 国产精品日产欧美久久久久 | 国产999久久| 国产97在线 | 亚洲 | 天天操狠狠操网站 | 久久精品网 | 午夜成人免费电影 | 欧美三级视频在线播放 | 人人干在线| 成人在线高清 | 久久精品一区二区三区四区 | 天天干国产 | 精品99视频 | 亚洲欧洲日本国产 | 香蕉av777xxx色综合一区 | 亚洲av毛片一级二级在线 | 精品国产乱码久久久久久久软件 | 另类 综合 日韩 欧美 亚洲 | 久久免费福利视频 | 国产视频一区二区 | 久久免费视频国产 | 亚洲欧美国产毛片在线 | 免费看国产片在线观看 | 国产精品视频一区二区三区, | 欧美一区永久视频免费观看 | 国产干干干 | 蜜桃免费一区二区三区 | jizz在线播放 | 午夜精品在线观看 | 欧美日韩亚洲一区 | 亚洲福利在线观看 | 精品99久久久久久 | 色999精品 | 久草精品视频 | 成人精品在线观看 | 国产精品美乳一区二区免费 | 午夜免费一区二区播放 | 久久久精品网站 | 国产精品久久久久久网站 | eeuss国产一区二区三区四区 | 99视频免费在线观看 | 一区二区三区四区精品 | h片免费 | 亚洲自拍一区在线 | 狠狠撸在线 | 在线观看国产精品一区二区 | 91精品视频在线播放 | 91福利在线播放 | 黄色影片网址 | 97国产资源 | 久久久久久国产精品 | 羞羞视频在线观免费观看 | 欧美一区二区三区精品 | 欧美一区在线看 | 久久久久久1| 日韩精品一区二区在线观看视频 | 中午字幕在线观看 | 久久av综合 | 国产精品美女久久久久久久久久久 | 国产超碰人人爽人人做人人爱 | 国产精品精品 | 久久久久九九九九九 | 国产三级在线观看 | 色综合天天综合网国产成人网 | av在线入口 | 国产视频久久久 | 99精品欧美一区二区三区 | 91视频电影| 亚洲精品国产高清 | 色婷婷在线播放 | 九九色影院 | 一级毛片大全免费播放 | 欧美精品一区二区三区在线播放 | 日韩精品1区2区 | 一级a毛片 | 国产精品无码久久久久 | 久久国产精品99久久久久久牛牛 | 国外成人在线视频网站 | 日韩精品在线网站 | 久久视频在线 | 日本全黄裸体片 | 成人精品久久 | 久久av网址 | 91视频在线免费观看 | 国产一区二区三区在线免费 | 日韩av不卡在线 | 羞羞视频免费观看 | 国产高潮失禁喷水爽网站 | 一区二区三区视频 | 免费观看国产精品 | 台湾佬成人 | 免费av大全 | 欧美视频区 | 精品亚洲自拍 | 国产激情网站 | 日韩在线二区 | 成人久久久 | 午夜在线电影 | 欧美精品1区2区3区 国产女无套免费网站 | 国产永久免费 | 成人在线精品视频 | 美日一级毛片 | 亚洲 国产 另类 精品 专区 | 毛片aaa | 免费观看羞羞视频网站 | 欧美精品1区 | 日韩一本 | 久久爱综合网 | av中文字幕网 | 亚洲视频一区在线播放 | 欧美2区| 亚洲最黄视频 | 日韩欧美国产成人一区二区 | 国产精品综合久久 | 国产免费国产 | 午夜免费电影 | 四虎影院最新地址 | 国产亚洲精品综合一区91555 | 99资源 | 亚洲欧美日韩电影 | 一本一道久久久a久久久精品91 | 国产第一区二区三区 | 国产情侣自拍啪啪 | 天天干夜夜操 | 精品久久久久一区二区国产 | 久草精品在线观看 | 色综合av | 国产精品一区二区三区免费 | 欧美亚洲专区 | 日韩艹逼视频 | 美女黄视频网站 | 九九综合 | 国产精品成av人在线视午夜片 | 国产伦精品一区二区三区四区视频 | 久久se精品一区精品二区 | 亚洲精品二区三区 | 久久av一区二区三区 | 高清一区二区三区 | 美女扒开尿口来摸 | 久久久久99 | 特黄特黄aaaa级毛片免费看 | 成人精品视频在线观看 | 日韩视频一区二区三区 | 久久国产一区二区 | 黄色激情网站 | 欧美一区二区在线观看 | 国产免费黄色大片 | 日韩色综合| 在线观看a视频 | 国产精品视频免费观看 | 国产三级在线免费观看 | 一级黄色片美国 | 免费爱爱视频 | 欧美日韩一区精品 | www日本高清视频 | 久艹精品 | 成人精品久久久 | 999精品在线| 亚洲欧美日韩国产综合 | 黄色地址 | 男人的天堂在线视频 | 中文字幕一页二页 | 日本精品网站 | 欧美1区 | 精品一区视频 | 精品国产一区二区三区久久久蜜臀 | 天天色天天看 | 久久99这里只有精品 | 国产一区二区在线免费观看 | 男女视频在线观看 | 99精品久久 | 免费亚洲成人 | 欧美一级日韩 | 久久久国色 | 亚洲成人精品 | 91精品国产乱码久久久久久 | 极品一区 | 成人午夜精品一区二区三区 | 国产一级一级毛片女人精品 | 中国1级黄色片 | 亚洲欧洲在线观看 | 国产精品久久久久久久久久10秀 | a久久| 成人黄色在线视频 | 最新国产在线 | 一区二区免费在线观看 | 亚洲精品久久久 | 91社影院在线观看 | 91中文字幕 | 亚洲高清视频一区二区三区 | 91麻豆视频 | 国产高潮失禁喷水爽网站 | 国产一区免费在线观看 | 东北一级毛片 | 精品一区二区三区国产 | 亚洲国产精品综合久久久 | 夜夜艹 | 国产午夜精品在线 | 久久99精品久久久久蜜臀 | 久久精彩 | 欧美女优在线视频 | 色视频免费在线观看 | 日本久草| 久久高清一区 | 做视频免费观看网站 | 国产精品精品 | 国产精品久久久一区二区 | 亚洲成人在线视频播放 | 日韩素人一区二区三区 | 亚洲综合精品视频 | 久久久国产精品一区 | 日韩视频中文 | 亚州成人 | 欧美黄视频在线观看 | 夜夜av | 男女啪啪免费网站 | 日韩天堂 | 免费观看毛片 | 国产午夜精品一区二区三区嫩草 | 日韩一区二区福利 | 日韩精品一区在线 | 激情五月综合网 | 国产成人亚洲综合 | 欧美视频一区二区 | 国产精品99久久 | 国产亚洲一区在线 | www.一区| 日韩精品专区在线影院重磅 | 国产91一区| 在线播放国产一区二区三区 | 爱爱视频在线 | 久久久美女| 岛国a视频 | 国产精品久久久久9999赢消 | 精品毛片在线 | 91九色网站 | www91在线观看 | 日韩国产在线 | 视频在线一区 | 嫩草视频入口 | 日韩一级免费在线观看 | 欧洲毛片| 午夜视频一区 | 午夜av电影 | 亚洲国产成人在线视频 | 美女操av| 亚洲一区成人 | 国产精品一品二区三区的使用体验 | 成人免费一区二区三区视频网站 | 在线欧美亚洲 | 四季久久免费一区二区三区四区 | 国产精品极品美女在线观看免费 | 亚洲精品大片 | 精品国产免费久久久久久尖叫 | 日本一二三视频 | 国产亚洲欧美一区二区三区 | 日韩欧美综合 | 国产视频一区在线 | 狠狠干美女 | 亚洲精选免费视频 | 天天操天操 | 99精品一区二区三区 | 欧美一级淫片免费视频黄 | 久久久精品国产 | 国产成人久久精品麻豆二区 | 日韩毛片免费视频一级特黄 | 欧美激情视频一区二区三区在线播放 | 欧美在线网站 | 亚洲小视频 | 精品视频网站 | 欧美日韩精品久久久 | 精品久久久久久久久久久久久久 | 日韩福利片 | 成人网址在线观看 | 污色视频在线观看 | 999精品在线| 久久91精品 | 国产区视频在线 | 一区二区免费播放 | 色婷婷久久 | 亚洲福利社区 | 日本另类αv欧美另类aⅴ | 久色视频在线 | 成人高清视频免费观看 | 天天干狠狠干 | 91色在线观看 | 久久99精品久久久久婷婷暖91 | 99国产视频| 国产欧美日韩 | 99久久婷婷国产精品综合 | 日韩美女av在线 | 天天舔夜夜操 | 亚洲精品一区在线观看 | 在线99| 亚洲一区二区免费在线观看 | 国产欧美精品一区二区三区四区 | 久久精品无码一区二区日韩av | 国产成年人小视频 | 欧美精品在线观看 | 欧美黄色一级毛片 | 欧美男男videos | 综合网av| 99re在线播放视频 | 成人精品久久久 | 欧美视频第一页 | 欧美成年黄网站色视频 | 国产成人免费视频 | 三级欧美在线观看 | 久在草视频 | 国产成人免费视频网站视频社区 | 91免费在线播放 | 好色视频在线观看 | 欧美精品一区二区三区蜜桃视频 | 欧美国产综合一区 | 欧美a级成人淫片免费看 | 玖玖玖精品视频 | 91日日夜夜 | 日本成人福利视频 | 日韩三级在线 | 久久99精品久久久久久久青青日本 | 欧美一级黄色片网站 | 大香一网 | 在线观看一区 | 成人av电影网址 | 伊人狠狠干| 国产精品揄拍一区二区久久国内亚洲精 | 青青操av | www91在线观看 | 欧美成人综合在线 | 亚洲成人一区 | 日本免费网站 | 国产成人精品一区二区三区视频 | 在线视频二区 | 成人在线视频网 | 欧美日韩一区二区三区在线观看 | 欧美视频精品在线观看 | 99爱视频 | 欧美一区二区三区在线视频 | 亚洲自拍在线观看 | 国产精品欧美一区二区 | 午夜视频网址 | 午夜日韩 | 99精品国产在热久久 | 亚洲狠狠 | 成人在线小视频 | 99re在线视频精品 | 国产无套一区二区三区久久 | 久久精品国产一区二区三区不卡 | 国产一区91 | japan护士性xxxⅹhd | 久久这 | 国产综合亚洲精品一区二 | 欧美精品一区二区三区蜜臀 | 久久成人免费视频 | 国产综合亚洲精品一区二 | 中文成人无字幕乱码精品 | 精品在线播放 | 国产在线在线 | 国产成人精品一区二区三区在线 | a视频在线观看免费 | 精品国产青草久久久久福利 | 国产成人精品综合 | 欧美综合精品 | 神马久久久久久久 | 北条麻妃99精品青青久久主播 | 国产精品99 | 欧美一区二区在线视频 | 亚洲精品国产偷自在线观看 | 午夜日韩| 三区在线观看 | 国产欧美日韩精品一区二区三区 | 久久一级| 黄色官网在线观看 | √8天堂资源地址中文在线 成人欧美一区二区三区白人 | 欧美视频一区二区三区在线观看 | 久热精品在线视频 | 97精品国产97久久久久久免费 | 国产一区二区在线观看视频 | 久久小视频 | 91高清在线观看 | 91高清视频| 久久99国产精品久久99果冻传媒 | 欧美中文在线 | 欧美大片一区二区 | 91在线高清 | caoporn国产精品免费公开 | 亚洲一区综合 |