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

Spring Cloud Bus 消息總線介紹

云計算

 [[399945]]

在 Spring 生態中玩轉 RocketMQ 系列文章:

《如何在 Spring 生態中玩轉 RocketMQ?》《羅美琪和春波特的故事...》《RocketMQ-Spring 畢業兩周年,為什么能成為 Spring 生態中最受歡迎的 messaging 實現?》《使用 rocketmq-spring-boot-starter 來配置、發送和消費 RocketMQ 消息》《Spring Cloud Stream 體系及原理介紹》

本文配套可交互教程已登錄阿里云知行動手實驗室,PC 端登錄 start.aliyun.com 在瀏覽器中立即體驗。

Spring Cloud Bus 對自己的定位是 Spring Cloud 體系內的消息總線,使用 message broker 來連接分布式系統的所有節點。Bus 官方的 Reference 文檔 比較簡單,簡單到連一張圖都沒有。

這是最新版的 Spring Cloud Bus 代碼結構(代碼量比較少):

Bus 實例演示

在分析 Bus 的實現之前,我們先來看兩個使用 Spring Cloud Bus 的簡單例子。

1. 所有節點的配置新增

Bus 的例子比較簡單,因為 Bus 的 AutoConfiguration 層都有了默認的配置,只需要引入消息中間件對應的 Spring Cloud Stream 以及 Spring Cloud Bus 依賴即可,之后所有啟動的應用都會使用同一個 Topic 進行消息的接收和發送。

Bus 對應的 Demo 已經放到了 github 上, 該 Demo 會模擬啟動 5 個節點,只需要對其中任意的一個實例新增配置項,所有節點都會新增該配置項。

Demo 地址:https://github.com/fangjian0423/rocketmq-binder-demo/tree/master/rocketmq-bus-demo

訪問任意節點提供的 Controller 提供的獲取配置的地址(key 為hangzhou):

curl -X GET 'http://localhost:10001/bus/env?key=hangzhou'

所有節點返回的結果都是 unknown,因為所有節點的配置中沒有hangzhou這個 key。

Bus 內部提供了EnvironmentBusEndpoint這個 Endpoint 通過 message broker 用來新增/更新配置。

訪問任意節點該 Endpoint 對應的 url: /actuator/bus-env?name=hangzhou&value=alibaba 進行配置項的新增(比如訪問 node1 的url):

curl -X POST 'http://localhost:10001/actuator/bus-env?name=hangzhou&value=alibaba' -H 'content-type: application/json'

然后再次訪問所有節點/bus/env獲取配置:

$ curl -X GET 'http://localhost:10001/bus/env?key=hangzhou'unknown%~ $ curl -X GET 'http://localhost:10002/bus/env?key=hangzhou'unknown%~ $ curl -X GET 'http://localhost:10003/bus/env?key=hangzhou'unknown%~ $ curl -X GET 'http://localhost:10004/bus/env?key=hangzhou'unknown%~ $ curl -X GET 'http://localhost:10005/bus/env?key=hangzhou'unknown%~ $ curl -X POST 'http://localhost:10001/actuator/bus-env?name=hangzhou&value=alibaba' -H 'content-type: application/json'~ $ curl -X GET 'http://localhost:10005/bus/env?key=hangzhou'alibaba%~ $ curl -X GET 'http://localhost:10004/bus/env?key=hangzhou'alibaba%~ $ curl -X GET 'http://localhost:10003/bus/env?key=hangzhou'alibaba%~ $ curl -X GET 'http://localhost:10002/bus/env?key=hangzhou'alibaba%~ $ curl -X GET 'http://localhost:10001/bus/env?key=hangzhou'alibaba%

可以看到,所有節點都新增了一個 key 為hangzhou的配置,且對應的 value 是alibaba。這個配置項是通過 Bus 提供的 EnvironmentBusEndpoint 完成的。

這里引用 程序猿DD 畫的一張圖片,Spring Cloud Config 配合 Bus 完成所有節點配置的刷新來描述之前的實例(本文實例不是刷新,而是新增配置,但是流程是一樣的):

2. 部分節點的配置修改

比如在 node1 上指定 destination 為 rocketmq-bus-node2 ( node2 配置了 spring.cloud.bus.id 為rocketmq-bus-node2:10002,可以匹配上) 進行配置的修改:

curl -X POST 'http://localhost:10001/actuator/bus-env/rocketmq-bus-node2?name=hangzhou&value=xihu' -H 'content-type: application/json'

訪問/bus/env 獲取配置(由于在 node1 上發送消息,Bus 也會對發送方的節點 node1 進行配置修改):

~ $ curl -X POST 'http://localhost:10001/actuator/bus-env/rocketmq-bus-node2?name=hangzhou&value=xihu' -H 'content-type: application/json'~ $ curl -X GET 'http://localhost:10005/bus/env?key=hangzhou'alibaba%~ $ curl -X GET 'http://localhost:10004/bus/env?key=hangzhou'alibaba%~ $ curl -X GET 'http://localhost:10003/bus/env?key=hangzhou'alibaba%~ $ curl -X GET 'http://localhost:10002/bus/env?key=hangzhou'xihu%~ $ curl -X GET 'http://localhost:10001/bus/env?key=hangzhou'xihu%

可以看到,只有 node1 和 node2 修改了配置,其余的 3 個節點配置未改變。

Bus 的實現

1. Bus 概念介紹

1)事件

Bus 中定義了遠程事件RemoteApplicationEvent,該事件繼承了 Spring 的事件ApplicationEvent,而且它目前有 4 個具體的實現:

EnvironmentChangeRemoteApplicationEvent:遠程環境變更事件。主要用于接收一個 Map<String,String> 類型的數據并更新到 Spring 上下文中 Environment 中的事件。文中的實例就是使用這個事件并配合 EnvironmentBusEndpoint 和 EnvironmentChangeListener 完成的。AckRemoteApplicationEvent:遠程確認事件。Bus 內部成功接收到遠程事件后會發送回AckRemoteApplicationEvent確認事件進行確認。RefreshRemoteApplicationEvent: 遠程配置刷新事件。配合 @RefreshScope 以及所有的 @ConfigurationProperties注解修飾的配置類的動態刷新。UnknownRemoteApplicationEvent:遠程未知事件。Bus 內部消息體進行轉換遠程事件的時候如果發生異常會統一包裝成該事件。

Bus 內部還存在一個非RemoteApplicationEvent事件 -SentApplicationEvent消息發送事件,配合 Trace 進行遠程消息發送的記錄。

這些事件會配合ApplicationListener進行操作,比如EnvironmentChangeRemoteApplicationEvent配了EnvironmentChangeListener進行配置的新增/修改:

public class EnvironmentChangeListener implements ApplicationListener<EnvironmentChangeRemoteApplicationEvent> { private static Log log = LogFactory.getLog(EnvironmentChangeListener.class); @Autowired private EnvironmentManager env; @Override public void onApplicationEvent(EnvironmentChangeRemoteApplicationEvent event) { Map<String, String> values = event.getValues(); log.info("Received remote environment change request. Keys/values to update " + values); for (Map.Entry<String, String> entry : values.entrySet()) { env.setProperty(entry.getKey(), entry.getValue()); } }}

收到其它節點發送來EnvironmentChangeRemoteApplicationEven事件之后調用EnvironmentManager#setProperty進行配置的設置,該方法內部針對每一個配置項都會發送一個EnvironmentChangeEvent事件,然后被ConfigurationPropertiesRebinder所監聽,進行 rebind 操作新增/更新配置。

2)Actuator Endpoint

Bus 內部暴露了 2 個 Endpoint,分別是EnvironmentBusEndpoint和RefreshBusEndpoint,進行配置的新增/修改以及全局配置刷新。它們對應的 Endpoint id 即 url 是 bus-env和bus-refresh。

3)配置

Bus 對于消息的發送必定涉及到 Topic、Group 之類的信息,這些內容都被封裝到了BusProperties中,其默認的配置前綴為spring.cloud.bus,比如:

spring.cloud.bus.refresh.enabled用于開啟/關閉全局刷新的 Listener。spring.cloud.bus.env.enabled 用于開啟/關閉配置新增/修改的 Endpoint。spring.cloud.bus.ack.enabled 用于開啟開啟/關閉AckRemoteApplicationEvent事件的發送。spring.cloud.bus.trace.enabled 用于開啟/關閉息記錄 Trace 的 Listener。

消息發送涉及到的 Topic 默認用的是springCloudBus,可以配置進行修改,Group 可以設置成廣播模式或使用 UUID 配合 offset 為 lastest 的模式。

每個 Bus 應用都有一個對應的 Bus id,官方取值方式較復雜:

${vcap.application.name:${spring.application.name:application}}:${vcap.application.instance_index:${spring.application.index:${local.server.port:${server.port:0}}}}:${vcap.application.instance_id:${random.value}}

建議手動配置 Bus id,因為 Bus 遠程事件中的 destination 會根據 Bus id 進行匹配:

spring.cloud.bus.id=${spring.application.name}-${server.port}

2. Bus 底層分析

Bus 的底層分析無非牽扯到這幾個方面:

消息是如何發送的消息是如何接收的destination 是如何匹配的遠程事件收到后如何觸發下一個 action

BusAutoConfiguration自動化配置類被@EnableBinding(SpringCloudBusClient.class)所修飾。

@EnableBinding的用法在文章《Spring Cloud Stream 體系及原理介紹》中已經說明,且它的 value 為SpringCloudBusClient.class,會在SpringCloudBusClient中基于代理創建出 input 和 output 的DirectChannel:

public interface SpringCloudBusClient { String INPUT = "springCloudBusInput"; String OUTPUT = "springCloudBusOutput"; @Output(SpringCloudBusClient.OUTPUT) MessageChannel springCloudBusOutput(); @Input(SpringCloudBusClient.INPUT) SubscribableChannel springCloudBusInput();}

springCloudBusInput 和 springCloudBusOutput 這兩個 Binding 的屬性可以通過配置文件進行修改(比如修改 topic):

spring.cloud.stream.bindings: springCloudBusInput: destination: my-bus-topic springCloudBusOutput: destination: my-bus-topic

消息的接收和發送:

// BusAutoConfiguration@EventListener(classes = RemoteApplicationEvent.class) // 1public void acceptLocal(RemoteApplicationEvent event) { if (this.serviceMatcher.isFromSelf(event) && !(event instanceof AckRemoteApplicationEvent)) { // 2 this.cloudBusOutboundChannel.send(MessageBuilder.withPayload(event).build()); // 3 }}@StreamListener(SpringCloudBusClient.INPUT) // 4public void acceptRemote(RemoteApplicationEvent event) { if (event instanceof AckRemoteApplicationEvent) { if (this.bus.getTrace().isEnabled() && !this.serviceMatcher.isFromSelf(event) && this.applicationEventPublisher != null) { // 5 this.applicationEventPublisher.publishEvent(event); } // If it's an ACK we are finished processing at this point return; } if (this.serviceMatcher.isForSelf(event) && this.applicationEventPublisher != null) { // 6 if (!this.serviceMatcher.isFromSelf(event)) { // 7 this.applicationEventPublisher.publishEvent(event); } if (this.bus.getAck().isEnabled()) { // 8 AckRemoteApplicationEvent ack = new AckRemoteApplicationEvent(this, this.serviceMatcher.getServiceId(), this.bus.getAck().getDestinationService(), event.getDestinationService(), event.getId(), event.getClass()); this.cloudBusOutboundChannel .send(MessageBuilder.withPayload(ack).build()); this.applicationEventPublisher.publishEvent(ack); } } if (this.bus.getTrace().isEnabled() && this.applicationEventPublisher != null) { // 9 // We are set to register sent events so publish it for local consumption, // irrespective of the origin this.applicationEventPublisher.publishEvent(new SentApplicationEvent(this, event.getOriginService(), event.getDestinationService(), event.getId(), event.getClass())); }}

利用 Spring 事件的監聽機制監聽本地所有的RemoteApplicationEvent遠程事件(比如bus-env會在本地發送EnvironmentChangeRemoteApplicationEvent事件,bus-refresh會在本地發送RefreshRemoteApplicationEvent事件,這些事件在這里都會被監聽到)。判斷本地接收到的事件不是AckRemoteApplicationEvent遠程確認事件(不然會死循環,一直接收消息,發送消息...)以及該事件是應用自身發送出去的(事件發送方是應用自身),如果都滿足執行步驟 3。構造 Message 并將該遠程事件作為 payload,然后使用 Spring Cloud Stream 構造的 Binding name 為 springCloudBusOutput 的 MessageChannel 將消息發送到 broker。

4.@StreamListener注解消費 Spring Cloud Stream 構造的 Binding name 為 springCloudBusInput 的 MessageChannel,接收的消息為遠程消息。

如果該遠程事件是AckRemoteApplicationEvent遠程確認事件并且應用開啟了消息追蹤 trace 開關,同時該遠程事件不是應用自身發送的(事件發送方不是應用自身,表示事件是其它應用發送過來的),那么本地發送AckRemoteApplicationEvent遠程確認事件表示應用確認收到了其它應用發送過來的遠程事件,流程結束。如果該遠程事件是其它應用發送給應用自身的(事件的接收方是應用自身),那么進行步驟 7 和 8,否則執行步驟 9。該遠程事件不是應用自身發送(事件發送方不是應用自身)的話,將該事件以本地的方式發送出去。應用自身一開始已經在本地被對應的消息接收方處理了,無需再次發送。如果開啟了AckRemoteApplicationEvent遠程確認事件的開關,構造AckRemoteApplicationEvent事件并在遠程和本地都發送該事件(本地發送是因為步驟 5 沒有進行本地AckRemoteApplicationEvent事件的發送,也就是自身應用對自身應用確認; 遠程發送是為了告訴其它應用,自身應用收到了消息)。如果開啟了消息記錄 Trace 的開關,本地構造并發送SentApplicationEvent事件。

bus-env觸發后所有節點的EnvironmentChangeListener監聽到了配置的變化,控制臺都會打印出以下信息:

o.s.c.b.event.EnvironmentChangeListener : Received remote environment change request. Keys/values to update {hangzhou=alibaba}

如果在本地監聽遠程確認事件 AckRemoteApplicationEvent,都會收到所有節點的信息,比如 node5 節點的控制臺監聽到的 AckRemoteApplicationEvent事件如下:

ServiceId [rocketmq-bus-node5:10005] listeners on {"type":"AckRemoteApplicationEvent","timestamp":1554124670484,"originService":"rocketmq-bus-node5:10005","destinationService":"**","id":"375f0426-c24e-4904-bce1-5e09371fc9bc","ackId":"750d033f-356a-4aad-8cf0-3481ace8698c","ackDestinationService":"**","event":"org.springframework.cloud.bus.event.EnvironmentChangeRemoteApplicationEvent"}ServiceId [rocketmq-bus-node5:10005] listeners on {"type":"AckRemoteApplicationEvent","timestamp":1554124670184,"originService":"rocketmq-bus-node1:10001","destinationService":"**","id":"91f06cf1-4bd9-4dd8-9526-9299a35bb7cc","ackId":"750d033f-356a-4aad-8cf0-3481ace8698c","ackDestinationService":"**","event":"org.springframework.cloud.bus.event.EnvironmentChangeRemoteApplicationEvent"}ServiceId [rocketmq-bus-node5:10005] listeners on {"type":"AckRemoteApplicationEvent","timestamp":1554124670402,"originService":"rocketmq-bus-node2:10002","destinationService":"**","id":"7df3963c-7c3e-4549-9a22-a23fa90a6b85","ackId":"750d033f-356a-4aad-8cf0-3481ace8698c","ackDestinationService":"**","event":"org.springframework.cloud.bus.event.EnvironmentChangeRemoteApplicationEvent"}ServiceId [rocketmq-bus-node5:10005] listeners on {"type":"AckRemoteApplicationEvent","timestamp":1554124670406,"originService":"rocketmq-bus-node3:10003","destinationService":"**","id":"728b45ee-5e26-46c2-af1a-e8d1571e5d3a","ackId":"750d033f-356a-4aad-8cf0-3481ace8698c","ackDestinationService":"**","event":"org.springframework.cloud.bus.event.EnvironmentChangeRemoteApplicationEvent"}ServiceId [rocketmq-bus-node5:10005] listeners on {"type":"AckRemoteApplicationEvent","timestamp":1554124670427,"originService":"rocketmq-bus-node4:10004","destinationService":"**","id":"1812fd6d-6f98-4e5b-a38a-4b11aee08aeb","ackId":"750d033f-356a-4aad-8cf0-3481ace8698c","ackDestinationService":"**","event":"org.springframework.cloud.bus.event.EnvironmentChangeRemoteApplicationEvent"}

那么回到本章節開頭提到的 4 個問題,我們分別做一下解答:

消息是如何發送的: 在BusAutoConfiguration#acceptLocal方法中通過 Spring Cloud Stream 發送事件到springCloudBustopic 中。消息是如何接收的: 在BusAutoConfiguration#acceptRemote方法中通過 Spring Cloud Stream 接收springCloudBustopic 的消息。destination 是如何匹配的: 在BusAutoConfiguration#acceptRemote方法中接收遠程事件方法里對 destination 進行匹配。遠程事件收到后如何觸發下一個 action: Bus 內部通過 Spring 的事件機制接收本地的RemoteApplicationEvent具體的實現事件再做下一步的動作(比如EnvironmentChangeListener接收了EnvironmentChangeRemoteApplicationEvent事件,RefreshListener接收了RefreshRemoteApplicationEvent事件)。

總結

Spring Cloud Bus 自身內容還是比較少的,不過還是需要提前了解 Spring Cloud Stream 體系以及 Spring 自身的事件機制,在此基礎上,才能更好地理解 Spring Cloud Bus 對本地事件和遠程事件的處理邏輯。

目前 Bus 內置的遠程事件較少,大多數為配置相關的事件,我們可以繼承RemoteApplicationEvent并配合@RemoteApplicationEventScan注解構建自身的微服務消息體系。

責任編輯:梁菲 來源: 阿里云云棲號
相關推薦

2017-03-20 09:50:35

消息隊列架構消息

2017-07-02 13:43:42

大數據kafka數據總線

2021-06-07 12:06:19

SpringCloud Sleuth微服務

2019-02-25 15:44:16

開源RabbitMQSpring Clou

2021-01-07 07:40:31

驅動微服務消息

2017-04-03 21:23:44

消息總線冪等性消息

2019-02-19 15:20:12

消息總線架構異步

2021-02-14 21:05:05

通信消息系統

2017-10-11 15:08:28

消息隊列常見

2025-04-14 05:00:00

2017-09-20 09:46:38

Spring BootSpring Clou內存

2017-12-20 15:37:39

Spring Clou微服務架構

2022-08-11 09:17:38

架構開發

2021-06-04 08:48:46

Spring ClouMaven Centr版本

2009-12-07 09:23:05

2009-06-17 17:59:01

介紹Spring

2009-06-17 16:56:46

Spring JMS

2021-10-24 11:11:30

Spring開源Java開發

2017-12-01 08:54:18

SpringCloudHystrix

2020-12-30 07:49:32

KubernetesJava Spring Clo
點贊
收藏

51CTO技術棧公眾號

麻豆精品久久久| 1024在线看片你懂得| 国产成a人亚洲精v品无码| 里番在线观看网站| 日韩美女毛片| 一区二区中文字幕在线| 久久免费视频观看| 日韩精品av一区二区三区| 亚洲成人生活片| 日本成人片在线| av午夜精品一区二区三区| 日韩在线小视频| 黄色片视频在线播放| 粉嫩小泬无遮挡久久久久久| 久久人人99| 一本一道久久a久久精品综合蜜臀| 亚洲一区二区免费| 五月激情四射婷婷| 91精品xxx在线观看| 亚洲免费av高清| 成人午夜在线影院| 人与动物性xxxx| 九九热这里有精品| 国产女主播视频一区二区| 欧洲日韩成人av| 欧美日韩高清丝袜| 成人免费看视频网站| 2020国产精品| 日韩av123| 欧美18—19性高清hd4k| 春暖花开亚洲一区二区三区| 久久精品人人爽人人爽| 国产精品xxx视频| 日韩毛片无码永久免费看| 999久久精品| 亚洲一区二区三区激情| 国产麻豆乱码精品一区二区三区| 久久免费精彩视频| 91亚洲无吗| 欧美精品久久天天躁| 自拍偷拍一区二区三区| av中文在线观看| 久久国产三级精品| 国产精品久久久久高潮| 无码人妻精品一区二区三区蜜桃91 | 亚洲欧美se| 91麻豆国产福利精品| 97超级碰碰人国产在线观看| wwwwww日本| 日韩免费小视频| 欧美性猛交xxxx免费看| 亚洲人一区二区| 亚洲精选一区二区三区| 久久精品九九| 久久精品国产91精品亚洲| 中文字幕1区2区| 毛片电影在线| 亚洲欧洲成人av每日更新| 四虎一区二区| 亚洲老妇色熟女老太| 国产成人啪免费观看软件| 97精品在线视频| 老司机精品免费视频| 欧美亚洲国产激情| 亚洲成人亚洲激情| 午夜久久福利视频| 99riav视频在线观看| 亚洲午夜日本在线观看| 日韩在线一级片| 国产福利在线播放麻豆| 99精品视频在线播放观看| 国产女同一区二区| 国产手机在线视频| 欧美国产激情| 最近更新的2019中文字幕| 五月婷六月丁香| 999久久久91| 久久99国产精品自在自在app| 免费在线观看成年人视频| 一区二区三区日本视频| 日本韩国一区二区| 久久久久久久久久网| 精品176二区| 亚洲一区精品在线| 青青在线视频免费| 日本不卡1234视频| 91高清视频免费看| 天天操夜夜操很很操| av在线一区不卡| 精品久久久久久中文字幕一区奶水| 亚洲国产日韩美| 免费黄色片在线观看| 成人小视频在线| 91影院在线免费观看视频| 中文字幕无线码一区| 最新日韩av| 欧美剧在线观看| 天天干在线播放| 亚洲精品一二| 国产女人18毛片水18精品| 成人午夜免费福利| 国产精品麻豆网站| 亚洲精品高清视频| 久久亚洲导航| 亚洲综合成人在线| 男人添女荫道口女人有什么感觉| 国产黄色小视频在线| 午夜电影一区二区三区| 国产黄色一级网站| 国产午夜精品一区在线观看| 欧美一区二区三区电影| 亚洲第一成肉网| 亚洲毛片在线免费| 精品亚洲一区二区三区在线观看| 伊人网综合视频| 乱中年女人伦av一区二区| 精品粉嫩aⅴ一区二区三区四区| 久久久无码人妻精品无码| 九色91国产| 可以免费看av的网址| jlzzjlzz亚洲女人| 综合网日日天干夜夜久久| 69视频在线观看免费| 欧美午夜国产| 国模叶桐国产精品一区| 在线观看亚洲一区二区| 国产伦精品一区二区三区视频青涩 | 国内精品伊人久久久久av一坑| 国产欧美在线看| 国产欧美久久久| 国产成人免费视频网站| 少妇特黄a一区二区三区| 蜜臀av在线| 日韩欧美一级在线播放| 香港三日本8a三级少妇三级99| 婷婷伊人综合| 午夜精品免费视频| 亚洲欧美激情国产综合久久久| 亚洲欧洲成人精品av97| 中文字幕丰满乱码| 荡女精品导航| 国产一区二区三区丝袜 | 亚洲精品精品亚洲| 五十路熟女丰满大屁股| caoporn成人| 欧美激情中文字幕乱码免费| 国产美女激情视频| 97成人超碰视| 欧美 日韩精品| 亚洲日本中文| 久久精品久久久久久| 国产在成人精品线拍偷自揄拍| 丁香婷婷综合五月| 2022中文字幕| 韩日一区二区| 中日韩美女免费视频网站在线观看| 中文字幕免费观看| 欧美国产日韩精品免费观看| 69精品丰满人妻无码视频a片| 日韩成人在线观看视频| 一本一道久久a久久精品逆3p| 五月婷婷一区二区| 亚洲欧美清纯在线制服| 91精品综合视频| av色综合久久天堂av色综合在| 懂色av一区二区三区| 亚洲美女性囗交| 久久久久久久久久久9不雅视频 | 国产精品7777777| 久久综合九色综合欧美98| 日韩毛片在线免费看| 日韩精品水蜜桃| 热久久99这里有精品| 国产在线超碰| 亚洲电影一区二区三区| 青青草原国产在线视频| 91精品啪在线观看国产18| 成人动漫在线观看视频| 色欧美激情视频在线| 天天综合网 天天综合色| 色婷婷免费视频| 欧美黄色大片网站| 国产午夜精品一区| 黄网站免费在线观看| 日韩一区二区免费高清| 国产主播av在线| 日韩精品成人一区二区在线| 韩国成人av| 久久免费电影| 亚洲人av在线影院| 99超碰在线观看| 99精品视频在线免费观看| wwwwxxxx日韩| 欧美先锋资源| 国产精品视频免费一区| 88xx成人免费观看视频库| 成年无码av片在线| www.国产黄色| 亚洲综合免费观看高清完整版| 亚洲永久无码7777kkk| 久久精品av麻豆的观看方式| 无码专区aaaaaa免费视频| 性欧美69xoxoxoxo| 欧美人xxxxx| 成人黄色图片网站| 欧美精品18videosex性欧美| yiren22亚洲综合伊人22| 欧美在线视频全部完| 日韩女同一区二区三区| 成人免费视频app| 国产美女18xxxx免费视频| 国产精品夜夜夜| 日本视频一区在线观看| 国产一区一一区高清不卡| 久久久久久久久久久91| 乱人伦中文视频在线| 国产亚洲欧美日韩精品| 日韩一区免费视频| 一本到不卡免费一区二区| 黄色一级片在线| av影院午夜一区| 熟妇无码乱子成人精品| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲电影免费| 免费视频一区三区| 国产美女精品视频免费观看| 在线观看的黄色| 91国内在线视频| 国产第一页在线视频| 亚洲男人av在线| 一级黄色小视频| 亚洲欧美日韩国产一区二区三区 | 日本一区二区在线播放| 电影在线观看一区| 亚洲视频精品在线| 天堂av在线7| 欧美日韩一卡二卡三卡 | 香港欧美日韩三级黄色一级电影网站| 日日噜噜噜噜夜夜爽亚洲精品| 午夜欧洲一区| 日本精品一区二区三区视频| 亚洲精品亚洲人成在线观看| 国产精品久久久久久av福利软件 | 欧美日韩在线视频观看| 国产成人在线观看网站| 欧美日韩免费在线观看| 日本韩国欧美中文字幕| 日韩欧美在线免费| 天堂网一区二区| 亚洲欧美日韩国产综合在线 | 中文字幕在线一| 欧美巨大另类极品videosbest| 一级爱爱免费视频| 欧美日韩成人一区| av资源免费观看| 中文字幕制服丝袜成人av| 婷婷五月精品中文字幕| 蜜桃视频免费观看一区| 亚洲一级片网站| 午夜在线视频观看日韩17c| 国产 福利 在线| 蜜桃av一区| 九色porny自拍| 国产一区欧美二区| 九热视频在线观看| 久草精品在线观看| wwwxxx黄色片| 日韩二区在线观看| 激情文学亚洲色图| 成人精品在线视频观看| 国产成人无码精品久久二区三| 中文幕一区二区三区久久蜜桃| 亚洲精品国产精品乱码在线观看| 亚洲男人的天堂网| 69av.com| 欧美视频在线观看 亚洲欧| 中文字幕永久在线观看| 欧美一级免费观看| 午夜性色福利影院| 日韩一区二区在线观看| 手机看片1024日韩| 欧美大黄免费观看| 欧美在线一卡| 亚洲二区在线播放视频| 飘雪影院手机免费高清版在线观看| 国产午夜精品免费一区二区三区| av网站免费在线观看| 欧美中在线观看| 九九99久久精品在免费线bt| 国产精品亚洲视频在线观看| 精品国产鲁一鲁****| 久久久久久艹| 在线国产一区| 亚洲成年人专区| 日韩av专区| 777精品久无码人妻蜜桃| 狠狠网亚洲精品| 久久久久久国产精品无码| 久久综合狠狠综合久久综合88| 国产白丝一区二区三区 | 中文字幕第一区二区| 久久久久久久久毛片| 欧美丝袜自拍制服另类| 懂色av中文字幕| 日韩欧美高清一区| 1769在线观看| 精品国产区一区二区三区在线观看| 91亚洲精选| 欧美又大又粗又长| 欧美与亚洲与日本直播| 国产精品区二区三区日本| 色综合色综合| 亚洲色成人一区二区三区小说| 亚洲自拍另类| 欧美人与性动交α欧美精品| 国产成人欧美日韩在线电影| 妖精视频在线观看免费| 欧美日韩性生活视频| 亚洲AV无码成人片在线观看| 色黄久久久久久| 性欧美videohd高精| 狠狠色噜噜狠狠色综合久| 亚洲激情中文在线| 男女视频在线看| 国产麻豆精品95视频| 超碰97av在线| 欧美视频在线观看一区二区| 你懂的在线观看视频网站| 91极品女神在线| 久本草在线中文字幕亚洲| www.国产二区| 国产高清久久久| 国产大片免费看| 欧美一卡在线观看| 成视频免费观看在线看| 91亚洲精品久久久久久久久久久久| 日韩欧美一区二区三区免费看| 天堂社区在线视频| 国产亚洲精品超碰| 波多野结衣影片| 在线成人免费网站| 懂色aⅴ精品一区二区三区| 91免费看国产| 午夜精品毛片| 日韩欧美中文视频| 亚洲女人的天堂| 国产成人精品免费看视频| 欧美另类交人妖| 99ri日韩精品视频| 久久亚洲精品无码va白人极品| 久久性天堂网| 人妻少妇偷人精品久久久任期| 亚洲视频资源在线| av资源免费看| 欧美激情精品久久久久久变态| 日本一道高清亚洲日美韩| 日韩免费中文专区| 美女一区二区三区| 91麻豆免费视频网站| 欧美日韩亚洲视频| 国产精品一级伦理| 孩xxxx性bbbb欧美| 风间由美中文字幕在线看视频国产欧美 | 国产乱理伦片a级在线观看| 国产精品你懂得| 欧美精品国产白浆久久久久| 在线观看一区欧美| 国产精品综合网| 日本熟妇毛茸茸丰满| 91精品蜜臀在线一区尤物| 狠狠狠综合7777久夜色撩人| 国产精品96久久久久久又黄又硬 | 麻豆久久久久久| 欧美三级 欧美一级| 亚洲福利在线看| 国产综合av| 嫩草影院中文字幕| 久久亚洲二区三区| 国产口爆吞精一区二区| 91精品国产乱码久久久久久久久| 国产真实有声精品录音| 无码专区aaaaaa免费视频| 久久精品一级爱片| 国产三级av片| 日韩视频免费在线观看| 精品国产午夜肉伦伦影院| 青青在线免费观看视频| 一区二区三区日韩欧美| 黄色av网站在线| 91久久极品少妇xxxxⅹ软件 | 国产av人人夜夜澡人人爽麻豆| 国内精品伊人久久久久影院对白| 99免费在线观看| www.久久撸.com| 亚洲免费福利一区| 香蕉视频在线观看黄| 一本一本久久a久久精品综合麻豆| bestiality新另类大全| 日本成人三级电影网站| 国产不卡视频在线观看|