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

這個Dubbo注冊中心擴展,有點意思!

開發 前端
今天想和大家聊聊Dubbo源碼中實現的一個注冊中心擴展。它很特殊,也幫我解決了一個困擾已久的問題,剛剛在生產中用了,效果很好,迫不及待想分享給大家。

大家好~我是小樓。其實這篇文章早就寫好了,本來上班第一天就發出來,拖到了現在。

是因為我發燒躺了3天,今天好點上班了,晚上來打最后一瓶點滴。生病真的很痛苦,大家多休息,多鍛煉,保持好的抵抗力~

今天想和大家聊聊Dubbo源碼中實現的一個注冊中心擴展。它很特殊,也幫我解決了一個困擾已久的問題,剛剛在生產中用了,效果很好,迫不及待想分享給大家。

Dubbo的擴展性非常靈活,可以無侵入源碼加載自定義擴展。能擴展協議、序列化方式、注冊中心、線程池、過濾器、負載均衡策略、路由策略、動態代理等等,甚至「擴展本身」也可以擴展。

在介紹今天的這個注冊中心擴展之前,先拋出一個問題,大家思考一下。

如何低成本遷移注冊中心?

有時出于各種目的需要遷移Dubbo的注冊中心,或因為覺得Nacos比較香,想從Zookeeper遷移到Nacos,或因前段時間曝出Consul禁止在中國境內使用。

遷移注冊中心的方案大致有兩種:

  • 方案一:使用Dubbo提供的多注冊中心能力,Provider先進行雙注冊,Consumer逐步遷移消費新注冊中心,最后下線老注冊中心。該方案的缺點是修改時有上下游依賴關系。
  • 方案二:使用一個同步工具把老注冊中心的數據同步到新注冊中心,Consumer逐步遷移到新注冊中心,最后下線老注冊中心。同步工具有開源的Nacos-sync,我之前的文章《zookeeper到nacos的遷移實踐》就提到了這個方案。這個方案的缺點是架構變得復雜,需要解決同步數據的順序性、一致性、同步組件的高可用等問題。

Nacos-sync 參考 https://github.com/nacos-group/nacos-sync

我們從「業務方成本」和「基礎架構成本」兩個角度考慮一下這兩個方案:

業務方成本我們以每次業務方修改并上線代碼為1個單位,基礎架構成本以增加一個新服務端組件為2個單位,從復雜度上來說基礎架構成本遠遠高于業務方修改并上線代碼,但這里我們認為只是2倍關系,做過基礎組件開發的同學肯定感同身受,推動別人改代碼比自己埋頭寫代碼要難。

我們統計下上述方案中,遷移一對Consumer和Provider總共需要的成本是多少:

  • 方案一:Provider雙注冊+1;Consumer消費新注冊中心+1;Provider下線舊注冊中心+1;總成本為3
  • 方案二:同步組件+2;Consumer消費新注冊中心+1;Provider下線舊注冊中心+1;總成本為4

有沒有成本更低的方案?

首先我們不考慮引入同步組件,其次Provider和Consumer能否不修改就能解決?我覺得理論上肯定可以解決,因為Java的字節碼是可以動態修改的,肯定能達到這個目的,但這樣的復雜度和風險會非常高。

退一步能否每個應用只修改發布一次就完成遷移?

Dubbo配置多注冊中心可以參考這篇文章《幾個你不知道的dubbo注冊中心細節》,你會發現多注冊中心是通過配置文件配置的,如下

dubbo.registries.zk1.address=zookeeper://127.0.0.1:2181
dubbo.registries.zk2.address=zookeeper://127.0.0.1:2182

只修改一次代碼,就必須把這個配置變成動態的,有點難,但不是做不到,可在應用啟動時遠程加載配置,或者采取替換配置文件的方式來達到目的。

但這只解決了部分問題,還有兩個問題需要解決:

  • Dubbo注冊、訂閱都發生在應用啟動時,應用啟動后就沒法修改了。也不是完全不能,如果采用了api的方式接入Dubbo可以通過改代碼來實現,但幾乎這種方式不會被采用;
  • Dubbo消費沒法動態切換,多注冊中心消費時,Dubbo默認的行為是挑第一個可用的注冊中心進行調用,無法主動地進行切換;如果實現了主動切換還有個好處是穩定性提高了很多,萬一新注冊中心出現問題還可以及時切回去。

這里針對第二點的消費邏輯做一點簡單說明,老版本(<2.7.5)邏輯比較簡單粗暴,代碼位于RegistryAwareClusterInvoker:

  • 挑選第一個可用的注冊中心進行調用
  • 新版本(>=2.7.5)則稍微豐富一點,代碼位于ZoneAwareClusterInvoker:
  • 挑選一個可用且帶preferred偏好配置的注冊中心進行調用,注意這個偏好配置不同版本key還不一樣,有點坑
  • 如果都不符合1,則挑選同一個分區且可用的注冊中心進行調用,分區也是通過參數配置,這個主要是為了跨機房的就近訪問

如果1、2都不符合,通過一個負載均衡算法挑選出一個可用的注冊中心進行調用

如果1、2、3都不符合,則挑選一個可用的注冊中心

如果上述都不符合,則使用第一個注冊中心進行調用

可以看出新版本功能很豐富,但它是有版本要求的,而且控制的key也變來變去,甚至去搜一下也有Bug存在,所以如果是單一穩定的高版本是可以通過這個來做,但大部分還是達不到這個要求。

很長一段時間以來,我都沒有想到一個好的辦法來解決這個問題,甚至我們公司內部有直接修改Dubbo源碼來實現動態切換消費的能力,但這種入侵修改無法持續,直到有一天瀏覽Dubbo源碼時,無意間看到了MultipleRegistry,仿佛發現了新大陸,用醍醐灌頂來形容一點不為過。

MultipleRegistry,有點意思!

MultipleRegistry是Dubbo 2.7.2引入的一個注冊中心擴展,注冊中心擴展圈起來,要考!意味著這個擴展可以在任何>=2.7.0版本上運行,稍微改改也能在2.7以下的版本使用

這究竟是個什么注冊中心的擴展呢?

實際上這個擴展并不是一個實際的注冊中心的擴展,而是一個包裝,它本身不提供服務注冊發現的能力,它只是把其他注冊中心聚合起來的一個空殼。

為什么這個「空殼」這么厲害呢?下面我們就來分析分析源碼。

由于剛好手上有3.0.0版本的源碼,所以接下來的源碼分析基于Dubbo 3.0.0版本,也不用擔心版本問題,這個擴展自從2.7.2引入之后幾乎沒有大的改動,只有Bugfix,所以什么版本基本都差不多。只分析接口級服務發現,應用級的暫時不分析,原理類似。

不過在講源碼之前,還得說說Dubbo注冊中心插件的運行原理,否則源碼可能看不懂,我們以開發一個注冊中心擴展為例:

Dubbo注冊中心擴展需實現RegistryService和RegistryFactory接口


public interface RegistryService {

void register(URL url);

void unregister(URL url);

void subscribe(URL url, NotifyListener listener);

void unsubscribe(URL url, NotifyListener listener);

List<URL> lookup(URL url);
}

這里的五個接口分別是注冊、注銷、訂閱、取消訂閱、查詢,在Dubbo應用啟動時會調用這些接口。

都比較好理解,需要提一下subscribe接口。

subscribe傳入了一個NotifyListener參數,可以理解為一個回調,當監聽的的URL發生變化時,調用這個NotifyListener通知Dubbo。

public interface NotifyListener {
void notify(List<URL> urls);
}

NotifyListener也是個接口,只有一個notify方法,這個方法傳入的參數是所消費的URL的所有Provider列表。

@SPI("dubbo")
public interface RegistryFactory {
@Adaptive({"protocol"})
Registry getRegistry(URL url);
}

RegistryFactory是描述了如何創建Registry擴展的工廠類,URL就是配置中

zookeeper://127.0.0.1:2181

還需要遵守Dubbo SPI的加載規則擴展才能被正確加載

這些內容官方文檔中說的比較清楚,如果有疑問可以看看Dubbo的官方文檔說明。

簡單介紹到此結束,接下來重點介紹MultipleRegistry。

首先看初始化,代碼只挑出重點,在初始化MultipleRegistry時,分別對注冊和訂閱的注冊中心進行初始化,這些注冊中心來自MultipleRegistry的URL配置,URL上的key分別為service-registry、reference-registry,實際測試下來URL的參數中帶奇怪的字符會導致編譯不通過,不過這并不是重點,基本的還是可用,而且也不一定要采用這種配置。

public MultipleRegistry(URL url, boolean initServiceRegistry, boolean initReferenceRegistry) {
...
Map<String, Registry> registryMap = new HashMap<>();
// 初始化注冊的注冊中心
if (initServiceRegistry) {
initServiceRegistry(url, registryMap);
}
// 初始化訂閱的注冊中心
if (initReferenceRegistry) {
initReferenceRegistry(url, registryMap);
}
...
}

我們再看注冊和訂閱:

注冊比較簡單,只需要對剛剛初始化的serviceRegistries都進行注冊即可

 public void register(URL url) {
super.register(url);
for (Registry registry : serviceRegistries.values()) {
registry.register(url);
}
}

訂閱時也是針對referenceRegistries的每個注冊中心都訂閱,但這里有個不同的點是NotifyListener的妙用。

 public void subscribe(URL url, NotifyListener listener) {
MultipleNotifyListenerWrapper multipleNotifyListenerWrapper = new MultipleNotifyListenerWrapper(listener);
multipleNotifyListenerMap.put(listener, multipleNotifyListenerWrapper);
for (Registry registry : referenceRegistries.values()) {
SingleNotifyListener singleNotifyListener = new SingleNotifyListener(multipleNotifyListenerWrapper, registry);
multipleNotifyListenerWrapper.putRegistryMap(registry.getUrl(), singleNotifyListener);
registry.subscribe(url, singleNotifyListener);
}
super.subscribe(url, multipleNotifyListenerWrapper);
}

先用MultipleNotifyListenerWrapper把最原始的NotifyListener包裝起來,NotifyListener傳給每個被包裝的注冊中心。MultipleNotifyListenerWrapper和SingleNotifyListener分別是什么?

MultipleNotifyListenerWrapper將原始的NotifyListener進行包裝,且持有SingleNotifyListener的引用,它提供了一個方法notifySourceListener的方法,將持有的SingleNotifyListener中上次變更的URL列表進行merge后調用最原始的NotifyListener.notify()

protected class MultipleNotifyListenerWrapper implements NotifyListener {

Map<URL, SingleNotifyListener> registryMap = new ConcurrentHashMap<URL, SingleNotifyListener>(4);
NotifyListener sourceNotifyListener;
...

public synchronized void notifySourceListener() {
List<URL> notifyURLs = new ArrayList<URL>();
URL emptyURL = null;
for (SingleNotifyListener singleNotifyListener : registryMap.values()) {
List<URL> tmpUrls = singleNotifyListener.getUrlList();
if (CollectionUtils.isEmpty(tmpUrls)) {
continue;
}
// empty protocol
if (tmpUrls.size() == 1
&& tmpUrls.get(0) != null
&& EMPTY_PROTOCOL.equals(tmpUrls.get(0).getProtocol())) {
// if only one empty
if (emptyURL == null) {
emptyURL = tmpUrls.get(0);
}
continue;
}
notifyURLs.addAll(tmpUrls);
}
// if no notify URL, add empty protocol URL
if (emptyURL != null && notifyURLs.isEmpty()) {
notifyURLs.add(emptyURL);
}
this.notify(notifyURLs);
}
...
}

再看SingleNotifyListener,它的notify去調用MultipleNotifyListenerWrapper的notifySourceListener

class SingleNotifyListener implements NotifyListener {

MultipleNotifyListenerWrapper multipleNotifyListenerWrapper;
Registry registry;
volatile List<URL> urlList;

@Override
public synchronized void notify(List<URL> urls) {
this.urlList = urls;
if (multipleNotifyListenerWrapper != null) {
this.multipleNotifyListenerWrapper.notifySourceListener();
}
}
...
}

仔細思考我們發現:

  • MultipleNotifyListenerWrapper是個注冊中心擴展的包裝,它本身是沒有通知能力的,只能借助的真實注冊中心擴展的通知能力
  • SingleNotifyListener是真實的注冊中心的通知回調,由它去調用MultipleNotifyListenerWrapper的notifySourceListener,調用前可將數據進行merge

如果你仔細讀完上面的文章你會發現,這不就是包裝了一下注冊中心擴展嗎?就這?哪里醍醐灌頂了?

不著急,我們先扒一扒作者為什么寫這樣一個擴展,他的初衷是想解決什么問題?

參考這個issue:https://github.com/apache/dubbo/issues/3932

作者說:我們可以在程序運行時下線(注銷)服務,如果有個Dubbo服務同時注冊了Zookeeper和Nacos,而我只想注銷其中一個注冊中心,MultipleRegistry就可以解決這種場景。

作者的初衷很簡單,但當我看到這個實現時,靈光乍現,感覺這個實現如果稍微改一改,簡直就是一個Dubbo多注冊中心遷移神器。

Dubbo多注冊中心遷移神器

Dubbo多注冊中心遷移神器具有什么樣的特性?

  • 可以動態(遠程配置)地注冊到一個或多個注冊中心,且在程序不重啟的情況下可以動態調整
  • 可以動態(遠程配置)地消費某一個或多個注冊中心,同樣可以在程序不重啟的情況下可以動態調整
  • 消費有兜底邏輯,比如配置了消費Zookeeper,但Zookeeper上可能只有A服務,B服務不存在,那么調用B服務時可以用其他注冊中心的Provider來兜底,這就保證了注冊中心遷移過程中沒用上下游的依賴

如果上面說的能夠領會到,這些需求實現起來就很簡單:

  • 啟動時,Provider和Consumer都分別監聽對應的配置項,按需注冊和消費,目前MultipleRegistry已經實現
  • Dubbo應用運行中,配置項變更事件驅動
  • Provider:觸發一個重新注冊、注銷的事件,根據最新的配置項將需要注冊的注冊中心再注冊一遍,需要注銷的注冊中心注銷
  • Consumer:觸發重新進行訂閱和取消訂閱,
  • 消費兜底邏輯,將MultipleNotifyListenerWrapper中的notifySourceListener的merge邏輯進行重寫,可以實現有線消費、無對應Provider兜底消費。當然如果配置變更也需要觸發一次notify

按照這個思路,我已經實現了一個版本在線上跑了起來!不過耦合了公司內部的配置中心。

如果想不耦合,可以采用Dubbo SPI擴展的方式來擴展「讀取監聽配置變更部分」,擴展中的擴展,有點騷~

這篇文章有點長,最后來回顧一下講了啥:

首先文章從一個Dubbo注冊中心遷移成本的問題講起,現有的方案成本都是比較高,一直苦苦找尋更低成本、兼容性更強的方案。終于在一次瀏覽Dubbo源碼過程中發現了MultipleRegistry源碼,經過研究發現只需要經過稍微的修改就能符合我們對完美動態注冊中心的定義。

在我寫這篇文章的時候,又試圖搜索了一下Dubbo動態注冊中心,發現了「Kirito的技術分享」的一篇文章《平滑遷移 Dubbo 服務的思考》提到了阿里云的一個產品的實現和上文提到的方案類似。

如果剛好你也有這個需求,可以用上文的思路實現看看,并不復雜,是不是感覺賺了一個億。


責任編輯:武曉燕 來源: 捉蟲大師
相關推薦

2022-04-27 20:02:22

Dubbo注冊中心開發

2023-01-30 22:43:39

DubboZooKeeper

2024-04-10 12:22:19

DubboNacos微服務

2021-03-09 07:37:41

DHCP協議地址

2022-02-10 08:07:45

DubboRPC框架

2014-09-17 14:05:14

2013-09-16 11:04:23

大數據大數據發展

2021-03-09 08:00:13

設計秒殺TPS

2013-01-06 12:57:23

2013-09-17 10:04:36

大數據西大荒

2016-08-16 11:53:37

2025-05-08 03:25:00

DubboSPI機制

2023-12-21 08:02:31

React DnD拖拽庫組件

2021-06-07 17:34:39

拓撲排序排序算法數據結構與算法

2020-12-14 05:57:01

clipboard.Selection execCommand

2021-05-27 11:10:23

注冊中心業務

2023-11-21 09:01:30

2025-06-30 08:43:50

網關代碼

2021-08-12 23:03:21

5G運營商基站

2020-12-24 08:37:41

Css前端加載動畫
點贊
收藏

51CTO技術棧公眾號

秋霞国产精品| 国产污视频在线| 黄色在线成人| 精品视频在线观看日韩| 15—17女人毛片| 中中文字幕av在线| 26uuu色噜噜精品一区二区| 国产欧美日韩免费看aⅴ视频| 免费网站看av| 国内亚洲精品| 亚洲精品一区二区在线观看| 国产精品亚洲二区在线观看| 99视频免费在线观看| 久久嫩草精品久久久精品| 亚洲精品免费网站| 精品国产乱子伦| 国产精品a久久久久| 国产亚洲精品久久久久久777| 日本女人性视频| 日韩精品第一| 天天亚洲美女在线视频| 熟妇熟女乱妇乱女网站| 蜜芽tv福利在线视频| 国产成人亚洲综合色影视| 国产国语刺激对白av不卡| 精品无码久久久久久久久| 日韩成人免费| 亚洲欧美国产视频| 你懂的在线观看网站| 91精品麻豆| 欧美亚洲国产一区二区三区| 欧美精品自拍视频| 伊人电影在线观看| 亚洲欧洲日韩一区二区三区| 欧美另类高清视频在线| 日韩中文字幕免费观看| 国产伦精品一区二区三区在线观看| 国产v综合ⅴ日韩v欧美大片 | 精品久久久久久无码国产| 久草中文在线| 国产精品免费视频网站| 久久久久久亚洲精品不卡4k岛国| 亚洲爱情岛论坛永久| 国内成人精品2018免费看| 国产情人节一区| 亚洲视频久久久| 免费美女久久99| 国产精品久久在线观看| 成人黄色激情视频| 日韩av在线播放中文字幕| 日韩av电影在线网| 欧美国产成人精品一区二区三区| 在线日韩欧美| 韩剧1988在线观看免费完整版| 欧美精品一区二区成人| 黄色另类av| 久久久久久香蕉网| 亚洲一区欧美在线| 在线亚洲欧美| 欧洲成人性视频| 亚洲天堂男人av| 日韩—二三区免费观看av| 日韩免费在线播放| 伊人久久中文字幕| 精品一区二区影视| 亚洲字幕在线观看| 亚洲不卡免费视频| 99久久久无码国产精品| 欧美极品一区| 欧美边添边摸边做边爱免费| 亚洲精品五月天| 高清无码视频直接看| 欧美黑人xx片| 日韩欧美在线网址| 亚洲欧美日本一区二区三区| 超碰国产精品一区二页| 精品国产一区二区三区不卡| 久久久久久久久久久久国产精品| 欧美xxxx在线| 永久免费看mv网站入口亚洲| 成人涩涩小片视频日本| 影音先锋久久久| 日韩免费观看高清| 国产精品色综合| 国模少妇一区二区三区| 国产精品二区三区| 国产精品视频二区三区| 亚洲欧美区自拍先锋| 日韩av新片网| 国产成人精品一区二三区在线观看 | 亚洲网址你懂得| 免费看黄色三级| 欧美亚洲激情| 久久99精品久久久久久青青91| 久久不卡免费视频| 久久99久久久欧美国产| 国产日韩欧美二区| av网站无病毒在线| 亚洲成av人片在线观看无码| 天天操天天爽天天射| 日韩视频一二区| 国产午夜精品全部视频播放| 日本老熟俱乐部h0930| 久久aⅴ乱码一区二区三区| 成人久久久久爱| 青青青草原在线| 一区二区三区蜜桃网| 热久久精品免费视频| 国产亚洲成av人片在线观黄桃| 国产一区二区三区精品久久久| 久久综合亚洲色hezyo国产| 日韩激情av在线| 黄色99视频| 成人日日夜夜| 欧美日韩一区久久| 中文字幕高清视频| 影音先锋在线一区| 91中文精品字幕在线视频| 国产免费av在线| 欧美日韩国产页| 美女伦理水蜜桃4| 雨宫琴音一区二区三区| 国产精品久久电影观看| 天堂资源中文在线| 亚洲午夜在线视频| 操人视频免费看| 久久视频在线| 国产精品69av| 免费在线一级视频| 欧美视频第一页| 在线免费看黄色片| 欧美日韩免费| 91在线在线观看| 国产人成网在线播放va免费| 欧美色窝79yyyycom| 国产综合精品在线| 久久亚洲精选| 欧美亚洲另类久久综合| 亚洲插插视频| 日韩精品视频在线播放| 欧美一级片免费在线观看| www.亚洲精品| 黄色大片在线免费看| 菁菁伊人国产精品| 性色av一区二区三区免费 | 国产成人精品一区二区三区在线 | 黄色大片在线| 欧美精品一区二区在线播放| 精品99久久久久成人网站免费| 狠狠色狠狠色综合系列| 欧美性视频在线播放| vam成人资源在线观看| 欧美成在线观看| 精品国产无码一区二区| 夜夜爽夜夜爽精品视频| 深田咏美中文字幕| av成人毛片| 日韩欧美视频一区二区| 国产精品久久亚洲不卡| 少妇久久久久久| 国产精品视频第一页| 亚洲欧洲中文日韩久久av乱码| 亚洲免费在线播放视频| 好看的av在线不卡观看| 国产另类自拍| 高清不卡av| 色老头一区二区三区在线观看| 91久久久久国产一区二区| 亚洲激情五月婷婷| 国产xxxx视频| 日韩精品一二三四| 强伦女教师2:伦理在线观看| 香蕉免费一区二区三区在线观看 | 波多野结衣激情| jizz国产精品| 日韩av免费看| 国产秀色在线www免费观看| 精品久久人人做人人爽| 国产成人免费看| 国产精品三级电影| 一级全黄裸体片| 天堂一区二区在线| 国产成年人在线观看| a看欧美黄色女同性恋| 国产不卡精品视男人的天堂| 高清全集视频免费在线| 亚洲爱爱爱爱爱| 中文字幕 国产| 一区二区久久久久久| 欧美深性狂猛ⅹxxx深喉| 日韩高清一区在线| 久草免费福利在线| 第一会所亚洲原创| 国产精品免费一区二区三区在线观看| 人人视频精品| 欧美激情视频在线免费观看 欧美视频免费一 | 国产精品成人va在线观看| 在线中文资源天堂| 亚洲成在人线av| 一区二区日韩在线观看| 一区二区国产视频| 成人欧美一区二区三区黑人一| 懂色一区二区三区免费观看| 国产精品入口免费软件| 亚洲黄色一区| 国产91av视频在线观看| 羞羞色国产精品网站| 亚洲一区二区免费在线| 电影在线观看一区二区| 91精品国产高清久久久久久91| 日本福利专区在线观看| 亚洲欧美日韩图片| 男人天堂一区二区| 91精品中文字幕一区二区三区 | 欧美放荡的少妇| 天堂中文字幕在线观看| 亚洲精品成a人| 中文字幕精品亚洲| 久久色视频免费观看| 日本50路肥熟bbw| 国内精品久久久久影院色| 日韩手机在线观看视频| 一本久道综合久久精品| 免费极品av一视觉盛宴| 99国产精品一区二区| 日本高清不卡三区| 欧美**字幕| 久久久久久久久久码影片| 6080亚洲理论片在线观看| 91性高湖久久久久久久久_久久99| 日韩欧美一区二区三区在线观看 | 性无码专区无码| 亚洲国产视频直播| 精品99在线观看| 亚洲女爱视频在线| 老熟妻内射精品一区| 国产精品美女久久久久av爽李琼 | 亚洲美女屁股眼交| 激情五月激情综合| 国产精品久久国产精麻豆99网站| 永久免费成人代码| 久久精品网站免费观看| 玖玖爱在线精品视频| www.亚洲人| 黄色国产在线观看| 久久综合色鬼综合色| 久久精品综合视频| 久久日一线二线三线suv| 中文字幕人妻一区二区| 91丝袜国产在线播放| 五月婷婷综合在线观看| 久久久午夜精品理论片中文字幕| 李宗瑞91在线正在播放| 久久青草国产手机看片福利盒子 | 欧美mv日韩| 亚洲欧美日韩精品在线| 久久神马影院| 在线观看成人免费| 国产精品va| 无罩大乳的熟妇正在播放| 一本久道久久综合狠狠爱| 午夜肉伦伦影院| 男人的天堂亚洲一区| 亚洲 国产 图片| 国产一区二区三区国产| 人妻 丝袜美腿 中文字幕| av亚洲产国偷v产偷v自拍| 国产麻豆天美果冻无码视频| 久久久久国产精品人| 91大神福利视频| 亚洲激情六月丁香| 91视频免费网址| 欧美视频一二三区| 国产夫绿帽单男3p精品视频| 亚洲第一视频网| 国产小视频免费在线网址| 日韩中文在线视频| 欧美1234区| 日本成人黄色片| 成人噜噜噜噜| 精品综合久久久| 欧美电影一区| 国产一二三在线视频| 日韩精品亚洲一区| a级大片免费看| 91蜜桃婷婷狠狠久久综合9色| 能直接看的av| 性做久久久久久免费观看| 无码视频在线观看| 日韩欧美一区在线| 黄色av网址在线免费观看| 久久精品99久久久久久久久 | 欧美性猛交xxxx偷拍洗澡| 在线观看亚洲一区二区| 精品福利一区二区三区| 99视频在线观看地址| 久久久久久久999| 四虎视频在线精品免费网址| 久久福利电影| 欧美激情一区二区三区不卡| 免费人成自慰网站| 日韩国产高清在线| 91超薄肉色丝袜交足高跟凉鞋| 久久九九久久九九| 久久精品亚洲无码| 欧美日韩综合在线| 欧美一区二区三区少妇| 久久99久久亚洲国产| 精品久久99| 久久精品国产综合精品| 欧美激情第二页| 中文字幕 91| 91免费小视频| 杨钰莹一级淫片aaaaaa播放| 在线观看精品一区| 无码精品黑人一区二区三区| 国产亚洲一区精品| 无遮挡爽大片在线观看视频| www 成人av com| 图片小说视频色综合| 青青青免费在线| 国产91丝袜在线播放0| 欧美一区二区三区观看| 91成人看片片| 天堂av网在线| 久久久亚洲国产| 天堂精品久久久久| 美女黄色片网站| 久久精品国产99久久6| 欧洲av一区二区三区| 偷拍亚洲欧洲综合| 免费av网站在线播放| 欧美激情xxxxx| 日本亚洲视频| 国产高清不卡无码视频| 国产一区二区三区久久久| 污污视频网站在线免费观看| 欧洲亚洲国产日韩| 成人午夜电影在线观看| 国产99久久精品一区二区| 久久99国产精品视频| 情侣黄网站免费看| 久久精品在线观看| 波多野结衣大片| 中文字幕精品—区二区| 国产三级一区| 伊人久久大香线蕉av一区| 免费欧美日韩国产三级电影| 91无套直看片红桃在线观看| 欧美日韩国产一区| 黄色成人影院| av一本久道久久波多野结衣| 午夜精品久久久久99热蜜桃导演| 国产精品久久久久野外| 亚洲一区二区在线免费观看视频| 亚洲精品.www| 5278欧美一区二区三区| 亚洲影院天堂中文av色| 老熟妇仑乱视频一区二区| 国产精品欧美极品| 国产高清视频免费| 韩日精品中文字幕| 韩日一区二区三区| 久久综合在线观看| 午夜亚洲国产au精品一区二区| 无码国产色欲xxxx视频| 日韩av手机在线| 999视频精品| 在线中文字日产幕| 日韩欧美在线视频日韩欧美在线视频 | 亚洲免费福利一区| 已婚少妇美妙人妻系列| 国产精品福利一区二区| 成人h动漫精品一区二区无码 | jizz内谢中国亚洲jizz| 青青成人在线| 国产在线一区二区综合免费视频| 欧美精品一区二区成人| 国产视频久久久久| 亚洲精品乱码日韩| 无码av天堂一区二区三区| 国产欧美一二三区| 精品国产乱码一区二区三| 欧美亚洲免费电影| 国产精品7m凸凹视频分类| 国产伦精品一区二区免费| 91久久一区二区| 视频在线这里都是精品| 欧美激情www| 国产乱人伦偷精品视频不卡| 国产精品免费av一区二区| 中文字幕在线观看日韩| 久久精品亚洲成在人线av网址| 国产91色在线观看| 性欧美大战久久久久久久久| 日本在线观看| 欧美在线视频二区| 成人激情小说乱人伦| 在线视频 91| 欧美在线国产精品|