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

SpringBoot+RabbitMQ 實現 RPC 調用

開發 架構
說到 RPC(Remote Procedure Call Protocol 遠程過程調用協議),小伙伴們腦海里蹦出的估計都是 RESTful API、Dubbo、WebService、Java RMI、CORBA 等。

[[435082]]

說到 RPC(Remote Procedure Call Protocol 遠程過程調用協議),小伙伴們腦海里蹦出的估計都是 RESTful API、Dubbo、WebService、Java RMI、CORBA 等。

其實,RabbitMQ 也給我們提供了 RPC 功能,并且使用起來很簡單。

今天松哥通過一個簡單的案例來和大家分享一下 Spring Boot+RabbitMQ 如何實現一個簡單的 RPC 調用。

注意

關于 RabbitMQ 實現 RPC 調用,有的小伙伴可能會有一些誤解,心想這還不簡單?搞兩個消息隊列 queue_1 和 queue_2,首先客戶端發送消息到 queue_1 上,服務端監聽 queue_1 上的消息,收到之后進行處理;處理完成后,服務端發送消息到 queue_2 隊列上,然后客戶端監聽 queue_2 隊列上的消息,這樣就知道服務端的處理結果了。

這種方式不是不可以,就是有點麻煩!RabbitMQ 中提供了現成的方案可以直接使用,非常方便。接下來我們就一起來學習下。

1. 架構

先來看一個簡單的架構圖:

這張圖把問題說的很明白了:

首先 Client 發送一條消息,和普通的消息相比,這條消息多了兩個關鍵內容:一個是 correlation_id,這個表示這條消息的唯一 id,還有一個內容是 reply_to,這個表示消息回復隊列的名字。

Server 從消息發送隊列獲取消息并處理相應的業務邏輯,處理完成后,將處理結果發送到 reply_to 指定的回調隊列中。

Client 從回調隊列中讀取消息,就可以知道消息的執行情況是什么樣子了。

這種情況其實非常適合處理異步調用。

2. 實踐

接下來我們通過一個具體的例子來看看這個怎么玩。

2.1 客戶端開發

首先我們來創建一個 Spring Boot 工程名為 producer,作為消息生產者,創建時候添加 web 和 rabbitmq 依賴,如下圖:

項目創建成功之后,首先在 application.properties 中配置 RabbitMQ 的基本信息,如下:

  1. spring.rabbitmq.host=localhost 
  2. spring.rabbitmq.port=5672 
  3. spring.rabbitmq.username=guest 
  4. spring.rabbitmq.password=guest 
  5. spring.rabbitmq.publisher-confirm-type=correlated 
  6. spring.rabbitmq.publisher-returns=true 

這個配置前面四行都好理解,我就不贅述,后面兩行:首先是配置消息確認方式,我們通過 correlated 來確認,只有開啟了這個配置,將來的消息中才會帶 correlation_id,只有通過 correlation_id 我們才能將發送的消息和返回值之間關聯起來。最后一行配置則是開啟發送失敗退回。

接下來我們來提供一個配置類,如下:

  1. /** 
  2.  * @author 江南一點雨 
  3.  * @微信公眾號 江南一點雨 
  4.  * @網站 http://www.itboyhub.com 
  5.  * @國際站 http://www.javaboy.org 
  6.  * @微信 a_java_boy 
  7.  * @GitHub https://github.com/lenve 
  8.  * @Gitee https://gitee.com/lenve 
  9.  */ 
  10. @Configuration 
  11. public class RabbitConfig { 
  12.  
  13.     public static final String RPC_QUEUE1 = "queue_1"
  14.     public static final String RPC_QUEUE2 = "queue_2"
  15.     public static final String RPC_EXCHANGE = "rpc_exchange"
  16.  
  17.     /** 
  18.      * 設置消息發送RPC隊列 
  19.      */ 
  20.     @Bean 
  21.     Queue msgQueue() { 
  22.         return new Queue(RPC_QUEUE1); 
  23.     } 
  24.  
  25.     /** 
  26.      * 設置返回隊列 
  27.      */ 
  28.     @Bean 
  29.     Queue replyQueue() { 
  30.         return new Queue(RPC_QUEUE2); 
  31.     } 
  32.  
  33.     /** 
  34.      * 設置交換機 
  35.      */ 
  36.     @Bean 
  37.     TopicExchange exchange() { 
  38.         return new TopicExchange(RPC_EXCHANGE); 
  39.     } 
  40.  
  41.     /** 
  42.      * 請求隊列和交換器綁定 
  43.      */ 
  44.     @Bean 
  45.     Binding msgBinding() { 
  46.         return BindingBuilder.bind(msgQueue()).to(exchange()).with(RPC_QUEUE1); 
  47.     } 
  48.  
  49.     /** 
  50.      * 返回隊列和交換器綁定 
  51.      */ 
  52.     @Bean 
  53.     Binding replyBinding() { 
  54.         return BindingBuilder.bind(replyQueue()).to(exchange()).with(RPC_QUEUE2); 
  55.     } 
  56.  
  57.  
  58.     /** 
  59.      * 使用 RabbitTemplate發送和接收消息 
  60.      * 并設置回調隊列地址 
  61.      */ 
  62.     @Bean 
  63.     RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { 
  64.         RabbitTemplate template = new RabbitTemplate(connectionFactory); 
  65.         template.setReplyAddress(RPC_QUEUE2); 
  66.         template.setReplyTimeout(6000); 
  67.         return template; 
  68.     } 
  69.  
  70.  
  71.     /** 
  72.      * 給返回隊列設置監聽器 
  73.      */ 
  74.     @Bean 
  75.     SimpleMessageListenerContainer replyContainer(ConnectionFactory connectionFactory) { 
  76.         SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
  77.         container.setConnectionFactory(connectionFactory); 
  78.         container.setQueueNames(RPC_QUEUE2); 
  79.         container.setMessageListener(rabbitTemplate(connectionFactory)); 
  80.         return container; 
  81.     } 

這個配置類中我們分別配置了消息發送隊列 msgQueue 和消息返回隊列 replyQueue,然后將這兩個隊列和消息交換機進行綁定。這個都是 RabbitMQ 的常規操作,沒啥好說的。

在 Spring Boot 中我們負責消息發送的工具是 RabbitTemplate,默認情況下,系統自動提供了該工具,但是這里我們需要對該工具重新進行定制,主要是添加消息發送的返回隊列,最后我們還需要給返回隊列設置一個監聽器。

好啦,接下來我們就可以開始具體的消息發送了:

  1. /** 
  2.  * @author 江南一點雨 
  3.  * @微信公眾號 江南一點雨 
  4.  * @網站 http://www.itboyhub.com 
  5.  * @國際站 http://www.javaboy.org 
  6.  * @微信 a_java_boy 
  7.  * @GitHub https://github.com/lenve 
  8.  * @Gitee https://gitee.com/lenve 
  9.  */ 
  10. @RestController 
  11. public class RpcClientController { 
  12.  
  13.     private static final Logger logger = LoggerFactory.getLogger(RpcClientController.class); 
  14.  
  15.     @Autowired 
  16.     private RabbitTemplate rabbitTemplate; 
  17.  
  18.     @GetMapping("/send"
  19.     public String send(String message) { 
  20.         // 創建消息對象 
  21.         Message newMessage = MessageBuilder.withBody(message.getBytes()).build(); 
  22.  
  23.         logger.info("client send:{}", newMessage); 
  24.  
  25.         //客戶端發送消息 
  26.         Message result = rabbitTemplate.sendAndReceive(RabbitConfig.RPC_EXCHANGE, RabbitConfig.RPC_QUEUE1, newMessage); 
  27.  
  28.         String response = ""
  29.         if (result != null) { 
  30.             // 獲取已發送的消息的 correlationId 
  31.             String correlationId = newMessage.getMessageProperties().getCorrelationId(); 
  32.             logger.info("correlationId:{}", correlationId); 
  33.  
  34.             // 獲取響應頭信息 
  35.             HashMap<String, Object> headers = (HashMap<String, Object>) result.getMessageProperties().getHeaders(); 
  36.  
  37.             // 獲取 server 返回的消息 id 
  38.             String msgId = (String) headers.get("spring_returned_message_correlation"); 
  39.  
  40.             if (msgId.equals(correlationId)) { 
  41.                 response = new String(result.getBody()); 
  42.                 logger.info("client receive:{}", response); 
  43.             } 
  44.         } 
  45.         return response; 
  46.     } 

這塊的代碼其實也都是一些常規代碼,我挑幾個關鍵的節點說下:

  • 消息發送調用 sendAndReceive 方法,該方法自帶返回值,返回值就是服務端返回的消息。
  • 服務端返回的消息中,頭信息中包含了 spring_returned_message_correlation 字段,這個就是消息發送時候的 correlation_id,通過消息發送時候的 correlation_id 以及返回消息頭中的 spring_returned_message_correlation 字段值,我們就可以將返回的消息內容和發送的消息綁定到一起,確認出這個返回的內容就是針對這個發送的消息的。

這就是整個客戶端的開發,其實最最核心的就是 sendAndReceive 方法的調用。調用雖然簡單,但是準備工作還是要做足夠。例如如果我們沒有在 application.properties 中配置 correlated,發送的消息中就沒有 correlation_id,這樣就無法將返回的消息內容和發送的消息內容關聯起來。

2.2 服務端開發

再來看看服務端的開發。

首先創建一個名為 consumer 的 Spring Boot 項目,創建項目添加的依賴和客戶端開發創建的依賴是一致的,不再贅述。

然后配置 application.properties 配置文件,該文件的配置也和客戶端中的配置一致,不再贅述。

接下來提供一個 RabbitMQ 的配置類,這個配置類就比較簡單,單純的配置一下消息隊列并將之和消息交換機綁定起來,如下:

  1. /** 
  2.  * @author 江南一點雨 
  3.  * @微信公眾號 江南一點雨 
  4.  * @網站 http://www.itboyhub.com 
  5.  * @國際站 http://www.javaboy.org 
  6.  * @微信 a_java_boy 
  7.  * @GitHub https://github.com/lenve 
  8.  * @Gitee https://gitee.com/lenve 
  9.  */ 
  10. @Configuration 
  11. public class RabbitConfig { 
  12.  
  13.     public static final String RPC_QUEUE1 = "queue_1"
  14.     public static final String RPC_QUEUE2 = "queue_2"
  15.     public static final String RPC_EXCHANGE = "rpc_exchange"
  16.  
  17.     /** 
  18.      * 配置消息發送隊列 
  19.      */ 
  20.     @Bean 
  21.     Queue msgQueue() { 
  22.         return new Queue(RPC_QUEUE1); 
  23.     } 
  24.  
  25.     /** 
  26.      * 設置返回隊列 
  27.      */ 
  28.     @Bean 
  29.     Queue replyQueue() { 
  30.         return new Queue(RPC_QUEUE2); 
  31.     } 
  32.  
  33.     /** 
  34.      * 設置交換機 
  35.      */ 
  36.     @Bean 
  37.     TopicExchange exchange() { 
  38.         return new TopicExchange(RPC_EXCHANGE); 
  39.     } 
  40.  
  41.     /** 
  42.      * 請求隊列和交換器綁定 
  43.      */ 
  44.     @Bean 
  45.     Binding msgBinding() { 
  46.         return BindingBuilder.bind(msgQueue()).to(exchange()).with(RPC_QUEUE1); 
  47.     } 
  48.  
  49.     /** 
  50.      * 返回隊列和交換器綁定 
  51.      */ 
  52.     @Bean 
  53.     Binding replyBinding() { 
  54.         return BindingBuilder.bind(replyQueue()).to(exchange()).with(RPC_QUEUE2); 
  55.     } 

最后我們再來看下消息的消費:

  1. @Component 
  2. public class RpcServerController { 
  3.     private static final Logger logger = LoggerFactory.getLogger(RpcServerController.class); 
  4.     @Autowired 
  5.     private RabbitTemplate rabbitTemplate; 
  6.  
  7.     @RabbitListener(queues = RabbitConfig.RPC_QUEUE1) 
  8.     public void process(Message msg) { 
  9.         logger.info("server receive : {}",msg.toString()); 
  10.         Message response = MessageBuilder.withBody(("i'm receive:"+new String(msg.getBody())).getBytes()).build(); 
  11.         CorrelationData correlationData = new CorrelationData(msg.getMessageProperties().getCorrelationId()); 
  12.         rabbitTemplate.sendAndReceive(RabbitConfig.RPC_EXCHANGE, RabbitConfig.RPC_QUEUE2, response, correlationData); 
  13.     } 

這里的邏輯就比較簡單了:

  • 服務端首先收到消息并打印出來。
  • 服務端提取出原消息中的 correlation_id。
  • 服務端調用 sendAndReceive 方法,將消息發送給 RPC_QUEUE2 隊列,同時帶上 correlation_id 參數。

服務端的消息發出后,客戶端將收到服務端返回的結果。

OK,大功告成。

2.3 測試

接下來我們進行一個簡單測試。

首先啟動 RabbitMQ。

接下來分別啟動 producer 和 consumer,然后在 postman 中調用 producer 的接口進行測試,如下:

可以看到,已經收到了服務端的返回信息。

來看看 producer 的運行日志:

可以看到,消息發送出去后,同時也收到了 consumer 返回的信息。

可以看到,consumer 也收到了客戶端發來的消息。

3. 小結

好啦,一個小小的案例,帶小伙伴們體驗一把 RabbitMQ 實現 RPC 調用。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2020-09-14 11:50:21

SpringBootRabbitMQJava

2024-05-31 08:45:24

2014-09-02 10:43:45

RedisRPC

2024-09-05 08:58:37

2024-11-04 08:02:23

SpringRabbitMQ中間件

2024-12-24 08:44:55

ActiveMQRabbitMQ交換機

2022-04-02 07:52:47

DubboRPC調用動態代理

2023-10-10 13:39:53

Spring隊列優化

2020-09-08 07:37:44

springBoot MQ rabbitMQ

2023-08-30 08:33:07

RabbitMQSpringBoot消息信息

2024-11-14 09:40:06

RPC框架NettyJava

2014-07-22 10:42:04

2024-09-02 09:14:36

SpringRabbitMQ數據

2022-01-07 06:12:08

RPC框架限流

2012-11-23 14:26:40

IBMdW

2023-09-05 15:48:14

RabbitMQ延遲隊列

2024-12-31 00:00:00

RabbitMQ插件代碼

2021-10-21 08:21:10

Java Reflect Java 基礎

2021-10-19 08:58:48

Java 語言 Java 基礎

2021-01-19 09:19:33

RPC調用過程框架
點贊
收藏

51CTO技術棧公眾號

成年人在线观看| 国产无精乱码一区二区三区| 在线成人视屏| 国产精品国产自产拍高清av王其| 国产精品无av码在线观看| 免费看裸体网站| 日韩久久99| 亚洲激情五月婷婷| 精品国产一区二区三区日日嗨| 国产性xxxx高清| 妖精视频一区二区三区| 欧美日韩综合一区| 黄网站色视频免费观看| 无码精品在线观看| 日本不卡视频在线| 久久99精品久久久久久噜噜| 亚洲熟妇无码av| 另类一区二区三区| 亚洲国产日韩av| 日韩国产一区久久| 亚洲黄色小说网| 丝袜诱惑亚洲看片| 精品视频9999| 国产精品国产三级国产专业不 | 欧美做爰性生交视频| 国产午夜精品福利视频| 911亚洲精品| 日本韩国精品在线| 中文字幕黄色大片| 精品欧美不卡一区二区在线观看| 国产综合色精品一区二区三区| 午夜精品久久久久久99热| 亚欧精品视频一区二区三区| 国内视频在线精品| 欧美久久久久免费| 人妻无码视频一区二区三区| 日本伦理一区二区| 亚洲欧洲精品一区二区三区| 欧美成人蜜桃| 亚洲大尺度网站| 日本在线播放一区二区三区| 97高清免费视频| 国产一区二区视频在线观看免费| 国产成人高清精品免费5388| 一本大道久久a久久精品综合| 国产一级做a爰片久久毛片男| 日本中文字幕在线观看| 久久久亚洲午夜电影| 国产一区二区在线观看免费播放| 国产美女www爽爽爽视频| 日韩电影一区二区三区四区| 4p变态网欧美系列| 香蕉免费毛片视频| 精品91在线| 色综合久久久888| 欧美h片在线观看| 日韩精品一区二区久久| 亚洲欧美中文另类| 精品人妻无码一区二区三区| 乱中年女人伦av一区二区| 欧美不卡视频一区| 巨乳女教师的诱惑| 日韩三级网址| 欧美一级生活片| 中文av字幕在线观看| aaaa欧美| 欧美日本乱大交xxxxx| 久久久精品麻豆| 色婷婷综合久久久中字幕精品久久| 精品国产91久久久久久| 久久久亚洲精品无码| 91制片在线观看| 亚洲福利视频一区| 69堂免费视频| 暖暖成人免费视频| 在线观看欧美精品| jizz18女人| 91成人app| 欧美一级淫片007| 久久久久亚洲AV成人网人人小说| 99re热精品视频| 精品av久久707| 国产xxxx视频| 欧美一级三级| 夜夜嗨av色一区二区不卡| 亚洲色图日韩精品| 欧美高清日韩| 97精品国产97久久久久久免费| 一级片中文字幕| 日韩制服丝袜先锋影音| 成人久久久久久| 成人免费一级视频| 久久久影院官网| 亚洲国产一区二区三区在线| 国产人成网在线播放va免费| 亚洲影视在线播放| 激情六月丁香婷婷| 亚洲伊人精品酒店| 亚洲国产欧美自拍| 国产欧美小视频| 欧美在线影院| 91精品国产成人www| 男人天堂视频网| 国产乱码精品一区二区三区忘忧草 | 亚洲天堂五月天| 美女视频黄 久久| 91传媒视频在线观看| 亚洲色图21p| 国产精品久久毛片| 国产av天堂无码一区二区三区| 神马电影网我不卡| 日韩欧美卡一卡二| 亚洲 小说 欧美 激情 另类| 91九色精品国产一区二区| 欧美精品videossex性护士| 日韩在线 中文字幕| 国产一区二区久久| 欧洲亚洲一区二区| 日本天码aⅴ片在线电影网站| 在线亚洲+欧美+日本专区| 日本女人黄色片| 国产一区二区三区天码| 欧美激情乱人伦一区| 国产精品sm调教免费专区| 成人激情视频网站| 国产成人精品免费看在线播放| 中文一区一区三区高中清不卡免费| 欧美高清hd18日本| a级大片在线观看| 黄色在线一区| 国产日本欧美一区二区三区| 无码国产精品一区二区免费16| 亚洲欧洲精品一区二区精品久久久 | 日韩精品视频在线观看网址| 午夜爱爱毛片xxxx视频免费看| 久久蜜桃精品| 国产一区二区在线网站| 在线中文字幕视频观看| 欧美久久高跟鞋激| 日本一卡二卡在线播放| 国产精品一区毛片| 动漫3d精品一区二区三区| 夜级特黄日本大片_在线| 一道本成人在线| 成年人的黄色片| 韩国av一区| 亚洲japanese制服美女| 日本免费中文字幕在线| 欧美又粗又大又爽| 久久久久久九九九九九| 国产精品社区| 国产综合av一区二区三区| 毛片在线导航| 日韩欧美黄色影院| 久久久久性色av无码一区二区| 国产一区二区在线影院| 中文字幕中文字幕在线中一区高清| 韩日精品一区| 在线看日韩欧美| 亚洲午夜在线播放| 国产精品天美传媒| 天堂av在线8| 天天影视欧美综合在线观看| 91精品国产综合久久久久久久久 | 久久久久久久性潮| 最近2019中文字幕在线高清| 中文字幕久久久久| 国产精品色哟哟| 午夜免费看毛片| 国产精品久久久久久久久久10秀| 国产精品免费小视频| www.亚洲资源| 欧美日韩成人综合天天影院| 麻豆精品国产免费| 国产宾馆实践打屁股91| av网站手机在线观看| 色吊丝一区二区| 国产成人啪精品视频免费网| 高清福利在线观看| 在线综合视频播放| 久久97人妻无码一区二区三区| 成人免费毛片高清视频| 久久久一本二本三本| 你懂的一区二区三区| 国产精品免费一区二区三区都可以| 男人资源在线播放| 日韩午夜电影av| 日韩av电影网址| 久久精品亚洲国产奇米99| 欧美特级aaa| 中文字幕免费一区二区三区| 国产亚洲精品自在久久| 人人视频精品| 久久精品视频亚洲| 污污网站在线免费观看| 欧美日韩午夜影院| 国产一级久久久| 久久精品日韩一区二区三区| 国产成人美女视频| 亚洲经典三级| 视频一区二区三区免费观看| 欧美二区观看| 日韩av手机在线看| caoporn免费在线| 精品一区二区亚洲| 国产伦理吴梦梦伦理| 亚洲成av人片一区二区| 呻吟揉丰满对白91乃国产区| 成人av在线电影| 国产日韩欧美久久| 国产欧美一级| 中文字幕欧美日韩一区二区三区| 国产精品色在线网站| 国产久一一精品| 国产伦久视频在线观看| 久久精品国产亚洲7777| 嫩草研究院在线观看| 欧美一级精品大片| 中文在线字幕av| 午夜激情综合网| 无码人妻精品一区二区三区夜夜嗨| 久久欧美中文字幕| 中文字幕18页| 精品在线你懂的| 国产精彩免费视频| 亚洲精品婷婷| 国产免费xxx| 欧美色婷婷久久99精品红桃| 狠狠干一区二区| 精品视频一区二区三区在线观看| 日本久久精品视频| √最新版天堂资源网在线| 久色乳综合思思在线视频| 成人影视在线播放| 亚洲欧美国产日韩中文字幕| 男人天堂综合网| 欧美一级专区免费大片| 91福利在线观看视频| 91黄色小视频| wwwxxx亚洲| 亚洲大尺度视频在线观看| 日本中文在线视频| 国产精品成人免费精品自在线观看| 国产精品三级在线观看无码| 成人午夜激情在线| 中文字幕 欧美 日韩| 狠狠色丁香婷婷综合久久片| 欧美三级理论片| 日韩中文字幕区一区有砖一区| 2022亚洲天堂| 国产精品普通话对白| 日本午夜激情视频| 99成人免费视频| www.射射射| 亚洲一级影院| cao在线观看| 最新国产拍偷乱拍精品 | www.久久com| 国产一区二区日韩精品| 亚洲综合123| 国内一区二区视频| 先锋资源在线视频| 国产高清在线观看免费不卡| 欧美熟妇另类久久久久久多毛| 国产一区二区h| 中国老熟女重囗味hdxx| 国产99精品在线观看| 欧美xxxxx少妇| 9i在线看片成人免费| 亚洲熟妇一区二区三区| 久久久久久久国产精品影院| 国产高清一区二区三区四区| 国产午夜精品一区二区| 成年人免费视频播放| 最新热久久免费视频| 国产精品成人免费观看| 亚洲成人福利片| 4438国产精品一区二区| 在线视频国产一区| 国产精品日韩无码| 精品乱码亚洲一区二区不卡| 香蕉视频成人在线| 亚洲天堂av在线播放| 久热国产在线| 欧美极品美女电影一区| 性国裸体高清亚洲| 国产精品网站入口| 波多野结衣欧美| 日本成人三级| 亚洲成人最新网站| 欧美日韩在线一| 人人狠狠综合久久亚洲| 国产精品探花在线播放| 99久久久国产精品免费蜜臀| 日本成人午夜影院| 一区二区三区小说| 日本黄色一级视频| 欧美二区三区91| 亚洲精品人妻无码| 这里只有精品久久| 金瓶狂野欧美性猛交xxxx| 国产精品69精品一区二区三区| 北岛玲精品视频在线观看| 韩日午夜在线资源一区二区| 日本a级不卡| 成人精品视频在线播放| 免费观看成人av| 中文字幕99页| 国产精品久久久久久久久果冻传媒 | 日韩高清av在线| 男人天堂久久久| 国外成人在线直播| 91精品国产一区二区在线观看| 精品久久久久久一区二区里番| 99久久99视频只有精品| 国产a级一级片| 国产精品中文字幕日韩精品 | 日韩av在线网页| 国产欧美久久久久久久久| 日本一区二区三区在线播放| 精品久久免费| 亚洲电影一二三区| 国产一区白浆| 91精品国产高清91久久久久久| 亚洲国产高清不卡| 在线精品免费视| 精品少妇一区二区三区在线视频 | 91在线观看视频| avove在线播放| 欧美日韩国产精选| 国产一区二区三区不卡在线| 欧美精品www在线观看| 久久av网站| 一区二区成人国产精品| 久久精品中文| 中文文字幕文字幕高清| 亚洲精品视频一区二区| 怡红院男人天堂| 亚洲人线精品午夜| 成人欧美一区二区三区的电影| 成人在线视频电影| 99视频精品全部免费在线视频| 99免费视频观看| 91麻豆国产在线观看| 日本三级午夜理伦三级三| 日韩一级片在线观看| 久久久久久久久免费视频| 国产精品丝袜一区二区三区| 少妇精品久久久一区二区三区| 欧美 丝袜 自拍 制服 另类| 福利一区二区在线观看| 免费又黄又爽又色的视频| 欧美一级夜夜爽| 18加网站在线| 999热视频在线观看| 欧美有码视频| 四虎国产精品永久免费观看视频| 亚洲天堂久久久久久久| 国产精品呻吟久久| 久久久国产一区| 国产一区二区三区免费观看在线| 亚洲 欧洲 日韩| 国内精品自线一区二区三区视频| 日韩在线一卡二卡| 91精品国产综合久久久久久| 神马午夜伦理不卡| 国产精品区一区二区三含羞草| 影音先锋久久久| xxxx黄色片| 一本一道综合狠狠老| 色多多视频在线观看| 18成人在线| 亚洲二区在线| 91精彩刺激对白露脸偷拍| 在线一区二区视频| 久久综合网导航| 国产精品久久久久免费| 男人天堂欧美日韩| 国产美女网站视频| 日韩精品在线一区二区| 女海盗2成人h版中文字幕| 色乱码一区二区三在线看| 国内久久精品视频| 日韩高清精品免费观看| 国产亚洲精品一区二555| 91麻豆精品| 日韩极品视频在线观看| 91首页免费视频| 最新中文字幕第一页| 美女黄色丝袜一区| 全球av集中精品导航福利| 91国产精品视频在线观看| 亚洲欧美激情小说另类| 少妇荡乳情欲办公室456视频| 日韩av黄色在线观看| 五月开心六月丁香综合色啪| 日本69式三人交| 欧美色老头old∨ideo| 日本在线视频网址| 色999五月色|