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

Dubbo原理剖析 之 @DubboReference.version設置為*

開發 前端
Dubbo在消費端提供了一個功能,即將消費者的版本號指定為*,那么不管服務端的接口版本是啥,都可以調用成功。

 [[398274]]

本文轉載自微信公眾號「不送花的程序猿」,作者Howinfun。轉載本文請聯系不送花的程序猿公眾號。  

1 背景

Dubbo在消費端提供了一個功能,即將消費者的版本號指定為*,那么不管服務端的接口版本是啥,都可以調用成功。

2 初步猜測

dubbo接口定位邏輯:接口(全路徑)+服務分組(group字段)+版本號(version字段)。

Zookeeper 是用樹狀來保存數據的,在 Zookeeper 中,可以利用Dubbo接口(全路徑)作為父節點,再根據group和version信息寫入子節點。

而 Nacos,在 Nacos 的控制臺中,我們看到可以根據服務名或服務分組來模糊查詢服務列表,那么在消費者訂閱的時候,就根據這兩個模糊查詢就可以了,查出來的健康提供者都是符合的。

下面就深入一下源碼,看看實際的邏輯是不是類似我們的猜想。

3 源碼剖析

3.1 Zookeeper 作為注冊中心

3.1.1 準備

弄一個服務提供者、一個服務消費者。服務提供者對外提供一個dubbo接口,版本有1.0.0和2.0.0;服務消費者引入服務提供者提供的dubbo接口,version設置為*。

啟動服務提供者、接著啟動消費者,觀察后臺日志打印:

我們可以看到,當我們將@DubboReference的version設置為*的時候,他就根據注冊url(帶*)去找有哪些服務提供者,然后返回的urls會有多個,其中包含版本號為1.0.0和2.0.0的url。

  1. 2021-05-01 10:24:08.561 [main] [INFO ] [o.a.d.r.z.ZookeeperRegistry] [] [] -  [DUBBO] Subscribe: consumer://127.0.0.1/com.winfun.service.DubboServiceOne?application=dubbo-service&category=providers,configurators,routers&dubbo=2.0.2&init=false&interface=com.winfun.service.DubboServiceOne&methods=sayHello&pid=14021&qos.enable=false&reference.filter=default,dubboLogFilter,sentinel.dubbo.consumer.filter&release=2.7.7&revision=*&side=consumer&sticky=false&timestamp=1619835848549&version=*, dubbo version: 2.7.7, current host: 127.0.0.1 
  2. 2021-05-01 10:24:08.572 [main] [INFO ] [o.a.d.r.z.ZookeeperRegistry] [] [] -  [DUBBO] Notify urls for subscribe url consumer://127.0.0.1/com.winfun.service.DubboServiceOne?application=dubbo-service&category=providers,configurators,routers&dubbo=2.0.2&init=false&interface=com.winfun.service.DubboServiceOne&methods=sayHello&pid=14021&qos.enable=false&reference.filter=default,dubboLogFilter,sentinel.dubbo.consumer.filter&release=2.7.7&revision=*&side=consumer&sticky=false&timestamp=1619835848549&version=*, urls: [dubbo://192.168.2.10:20880/com.winfun.service.DubboServiceOne?anyhost=true&application=dubbo-provider-one&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.winfun.service.DubboServiceOne&metadata-type=remote&methods=sayHello&pid=13996&release=2.7.8&revision=1.0.0&service.filter=default,dubboLogFilter&side=provider&timestamp=1619835820516&version=1.0.0, dubbo://192.168.2.10:20880/com.winfun.service.DubboServiceOne?anyhost=true&application=dubbo-provider-one&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.winfun.service.DubboServiceOne&metadata-type=remote&methods=sayHello&pid=13996&release=2.7.8&revision=2.0.0&service.filter=default,dubboLogFilter&side=provider&timestamp=1619835820187&version=2.0.0, empty://127.0.0.1/com.winfun.service.DubboServiceOne?application=dubbo-service&category=configurators&dubbo=2.0.2&init=false&interface=com.winfun.service.DubboServiceOne&methods=sayHello&pid=14021&qos.enable=false&reference.filter=default,dubboLogFilter,sentinel.dubbo.consumer.filter&release=2.7.7&revision=*&side=consumer&sticky=false&timestamp=1619835848549&version=*, empty://127.0.0.1/com.winfun.service.DubboServiceOne?application=dubbo-service&category=routers&dubbo=2.0.2&init=false&interface=com.winfun.service.DubboServiceOne&methods=sayHello&pid=14021&qos.enable=false&reference.filter=default,dubboLogFilter,sentinel.dubbo.consumer.filter&release=2.7.7&revision=*&side=consumer&sticky=false&timestamp=1619835848549&version=*], dubbo version: 2.7.7, current host: 127.0.0.1 

3.1.2 源碼分析

上面我們看到,version=*可以成功訂閱,并且服務提供者有兩個,分別是version=1.0.0和version=2.0.0。

結果是看得出來了,但是我們還是需要看看Zookeeper是怎么的判斷邏輯。

3.1.2.1 服務消費者訂閱過程

我們都知道,正常發布Dubbo的消費者,需要配置ReferenceConfig,然后調用export方法;當然了,我們這里就不過于深入了,直接從日志的入口來開始:org.apache.dubbo.registry.zookeeper.ZookeeperRegistry#doSubscribe

我們服務消費者的訂閱url:

  1. consumer://127.0.0.1/com.winfun.service.DubboServiceOne?application=dubbo-service&category=providers,configurators,routers&dubbo=2.0.2&init=false&interface=com.winfun.service.DubboServiceOne&methods=sayHello&pid=16215&qos.enable=false&reference.filter=default,dubboLogFilter,sentinel.dubbo.consumer.filter&release=2.7.7&revision=*&side=consumer&sticky=false&timestamp=1619842106726&version=* 

第一步:獲取dubbo接口全路徑

  1. url.getServiceInterface() -> com.winfun.service.DubboServiceOne 

接著判斷是否等于“*”,明顯不是,跳到else分支

第二步:根據url獲取path

獲取根節點:

  1. toCategoriesPath(url) -> /dubbo/com.winfun.service.DubboServiceOne/providers、/dubbo/com.winfun.service.DubboServiceOne/configurators、/dubbo/com.winfun.service.DubboServiceOne/consumers 

第三步:遍歷第二步的path、創建父節點

重點在path=/dubbo/com.winfun.service.DubboServiceOne/providers,其他忽略即可

根據path創建節點(非持久化):zkClient.create(root, false);

給path添加子節點監聽器:zkClient.addChildListener(path, zkListener) 并返回子節點列表

  • dubbo://192.168.2.10:20880/com.winfun.service.DubboServiceOne?anyhost=true&application=dubbo-provider-one&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.winfun.service.DubboServiceOne&metadata-type=remote&methods=sayHello&pid=13996&release=2.7.8&revision=1.0.0&service.filter=default,dubboLogFilter&side=provider×tamp=1619835820516&version=1.0.0
  • dubbo://192.168.2.10:20880/com.winfun.service.DubboServiceOne?anyhost=true&application=dubbo-provider-one&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.winfun.service.DubboServiceOne&metadata-type=remote&methods=sayHello&pid=13996&release=2.7.8&revision=2.0.0&service.filter=default,dubboLogFilter&side=provider×tamp=1619835820187&version=2.0.0

configurators 和 consumers 不存在子節點,所以子節點是根據規則生成的url,前綴為empty

第四步:對上面獲取到的urls進行監聽

調用org.apache.dubbo.registry.support.FailbackRegistry#notify方法。

最后會去到 org.apache.dubbo.registry.support.AbstractRegistry#notify(org.apache.dubbo.common.URL, org.apache.dubbo.registry.NotifyListener, java.util.List)

重點:在監聽前,會先匹配根據path查詢的所有子節點中,匹配符合當前消費者的子節點(根據group和version判斷),利用org.apache.dubbo.common.utils.UrlUtils#isMatch判斷。

判斷中最重要的邏輯:

  1. String ANY_VALUE = "*"
  2.  
  3. String consumerGroup = consumerUrl.getParameter(GROUP_KEY); 
  4. String consumerVersion = consumerUrl.getParameter(VERSION_KEY); 
  5. String consumerClassifier = consumerUrl.getParameter(CLASSIFIER_KEY, ANY_VALUE); 
  6.  
  7. String providerGroup = providerUrl.getParameter(GROUP_KEY); 
  8. String providerVersion = providerUrl.getParameter(VERSION_KEY); 
  9. String providerClassifier = providerUrl.getParameter(CLASSIFIER_KEY, ANY_VALUE); 
  10. return (ANY_VALUE.equals(consumerGroup) || StringUtils.isEquals(consumerGroup, providerGroup) || StringUtils.isContains(consumerGroup, providerGroup)) 
  11.         && (ANY_VALUE.equals(consumerVersion) || StringUtils.isEquals(consumerVersion, providerVersion)) 
  12.         && (consumerClassifier == null || ANY_VALUE.equals(consumerClassifier) || StringUtils.isEquals(consumerClassifier, providerClassifier)); 

上面完全可以體現出:當版本號等于*號,dubbo接口根節點下的服務都會作為當前消費者的服務提供者。

好了,到這里,我們可以知道Zookeeper是怎么為version=*的消費者訂閱服務的,直接根據接口全路徑名到Zookeeper里獲取所有子節點,并都可以作為服務提供者。

其實這里會有一個擴展點:多個服務提供者,調用的時候是怎么負載的,其實在@DubboReference中的loadbance屬性中看得出,默認的負載策略是隨機。

  1. /** 
  2.  * Load balance strategy, legal values include: random, roundrobin, leastactive 
  3.  * <p> 
  4.  * see Constants#DEFAULT_LOADBALANCE 
  5.  */ 
  6. String loadbalance() default ""
  7.  
  8. org.apache.dubbo.common.constants.CommonConstants#DEFAULT_LOADBALANCE="random"

3.1.2.2 服務消費者執行過程

proxy執行入口

我們可以通過debug模式,進入到Dubbo方法執行的入口:org.apache.dubbo.rpc.proxy.InvokerInvocationHandler#invoke

第一步:初步判斷

如果是 Object類 或者 toString、destory、hashCode等方法,直接執行

第二步:創建RpcInvocation

根據執行方法、參數等信息創建RpcInvocation

獲取serviceKey:-> serviceKey = dubbo-api-path/group:version

RpcInvocation設置TargetServiceUniqueName

第三步:調用invoker的invoke方法

來到org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker#invoke

判斷是否設置了 mock 或 force

  • 如果是調用org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker#doMockInvoke方法
  • 否則來到org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster.InterceptorInvokerNode#invoke

第四步:AbstractClusterInvoker#invoke

調用AbstractClusterInvoker#list獲取invoker列表,可以看到拿到的就是1.0.0版本和2.0.0版本的服務提供者

接著調用 initLoadBalance 方法來初始化負載均衡策略,從訂閱url里面獲取loadbalance的值,如果沒有設置,返回默認值“random”

  1. /** 
  2.  * Init LoadBalance. 
  3.  * <p> 
  4.  * if invokers is not empty, init from the first invoke's url and invocation 
  5.  * if invokes is empty, init a default LoadBalance(RandomLoadBalance) 
  6.  * </p> 
  7.  * 
  8.  * @param invokers   invokers 
  9.  * @param invocation invocation 
  10.  * @return LoadBalance instance. if not need init, return null
  11.  */ 
  12. protected LoadBalance initLoadBalance(List<Invoker<T>> invokers, Invocation invocation) { 
  13.     if (CollectionUtils.isNotEmpty(invokers)) { 
  14.         return ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(invokers.get(0).getUrl() 
  15.                 .getMethodParameter(RpcUtils.getMethodName(invocation), LOADBALANCE_KEY, DEFAULT_LOADBALANCE)); 
  16.     } else { 
  17.         return ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(DEFAULT_LOADBALANCE); 
  18.     } 

第五步:根據集群策略執行方法

由于Dubbo默認的集群策略是 failover,所以會來到來到:org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoker

首先會從注冊url里面的retries字段獲取重試次數(如果為空,默認重試次數為2),此次取的是默認值,所以最后最大調用次數為3.

循環retries+1次

  • 來到:org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#select 選擇Invoker

在RandomLoadBalance#doSelect 中,首先會根據服務提供者的權重判斷,如果權重沒賦值,最后會利用ThreadLocalRandom.current().nextInt(invokers.size())隨機選擇一個invoker。

  • 下一步:org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#doSelect
  • 下一步:org.apache.dubbo.rpc.cluster.loadbalance.AbstractLoadBalance#select由于默認是random的負載均衡策略,所以最后來到:org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance#doSelect
  • 執行invoke方法,返回結果
  • 如果有錯誤,記錄著,下次循環打印warn日志
  • 如果超過retries+1次調用失敗,往外拋出RpcException異常

到這里,我們已經非常清楚Zookeeper 是如何支持消費者將 version設置為*,并且方法調用時是如何選擇服務提供者。

3.2 Nacos 作為注冊中心

3.2.1 準備

弄一個服務提供者、一個服務消費者,這次不再是Zookeeper作為注冊中心,而是Nacos作為注冊中心。服務提供者對外提供一個dubbo接口,版本有1.0.0和2.0.0;服務消費者引入服務提供者提供的dubbo接口,version設置為*。

啟動服務提供者、接著啟動消費者,觀察后臺日志打?。?/p>

3.2.2 源碼分析

3.2.2.1 服務消費者訂閱過程

Nacos 源碼分析也是直接從 NacosRegistry#doSubscribe 入口開始:

  1. org.apache.dubbo.registry.nacos.NacosRegistry#doSubscribe(org.apache.dubbo.common.URL, org.apache.dubbo.registry.NotifyListener) 

消費者的注冊url:

  1. consumer://192.168.3.3/com.winfun.service.DubboServiceOne?application=dubbo-consumer-nacos&category=providers,configurators,routers&dubbo=2.0.2&init=false&interface=com.winfun.service.DubboServiceOne&metadata-type=remote&methods=sayHello&pid=39203&qos.enable=false&reference.filter=default,dubboLogFilter&release=2.7.8&revision=*&side=consumer&sticky=false&timestamp=1620177626113&version=* 

第一步、根據url獲取serviceName集合:

  1. org.apache.dubbo.registry.nacos.NacosRegistry#getServiceNames0 

1、創建 NacosServiceName:

  1. providers:com.winfun.service.DubboServiceOne:*: 

2、接著到:org.apache.dubbo.registry.nacos.NacosRegistry#filterServiceNames(org.apache.dubbo.registry.nacos.NacosServiceName)

根據上面的servicename過濾出所有的serviceName

2.1、 先利用NamingProxy查詢:

  1. com.alibaba.nacos.client.naming.net.NamingProxy#getServiceList(intint, java.lang.String, com.alibaba.nacos.api.selector.AbstractSelector) 

利用接口全路徑名+group查詢,沒有帶版本號

2.2、最后到:

  1. com.alibaba.nacos.common.http.client.NacosRestTemplate#exchangeForm 

http 請求:

url:

  1. http://127.0.0.1:8848/nacos/v1/ns/service/list 
  2. params:{app=unknown, pageSize=2147483647, groupName=DEFAULT_GROUP, namespaceId=public, pageNo=1} 

返回結果:

  1. RestResult{code=200, message='null', data={"doms":["providers:com.winfun.service.DubboServiceOne:1.0.0:","providers:com.winfun.service.DubboServiceOne:2.0.0:"],"count":2}} 

明顯包含兩個版本的service

第二步、根據條件過濾合適的 service

  1. public boolean isCompatible(NacosServiceName concreteServiceName) { 
  2.  
  3.     if (!concreteServiceName.isConcrete()) { // The argument must be the concrete NacosServiceName 
  4.         return false
  5.     } 
  6.  
  7.     // Not match comparison 
  8.     if (!StringUtils.isEquals(this.category, concreteServiceName.category) 
  9.             && !matchRange(this.category, concreteServiceName.category)) { 
  10.         return false
  11.     } 
  12.  
  13.     if (!StringUtils.isEquals(this.serviceInterface, concreteServiceName.serviceInterface)) { 
  14.         return false
  15.     } 
  16.  
  17.     // wildcard condition 
  18.     // 重點在這里 
  19.     if (isWildcard(this.version)) { 
  20.         return true
  21.     } 
  22.  
  23.     if (isWildcard(this.group)) { 
  24.         return true
  25.     } 
  26.  
  27.     // range condition 
  28.     if (!StringUtils.isEquals(this.version, concreteServiceName.version) 
  29.             && !matchRange(this.version, concreteServiceName.version)) { 
  30.         return false
  31.     } 
  32.  
  33.     if (!StringUtils.isEquals(this.group, concreteServiceName.group) && 
  34.             !matchRange(this.group, concreteServiceName.group)) { 
  35.         return false
  36.     } 
  37.  
  38.     return true
  39.  
  40. private boolean isWildcard(String value) { 
  41.     return WILDCARD.equals(value); 
  42.  
  43. public static final String WILDCARD = "*"

過濾后的 service 有兩個,分別是1.0.0和2.0.0

那么繼續深一步的訂閱流程:org.apache.dubbo.registry.nacos.NacosRegistry#doSubscribe(org.apache.dubbo.common.URL, org.apache.dubbo.registry.NotifyListener, java.util.Set)

第三步、遍歷serviceNames,根據serviceName+group查詢所有實例列表并且進行實例監聽

  1. List<Instance> instances = new LinkedList<>(); 
  2. for (String serviceName : serviceNames) { 
  3.     instances.addAll(namingService.getAllInstances(serviceName 
  4.             , getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP))); 
  5.     notifySubscriber(url, listener, instances); 
  6.     subscribeEventListener(serviceName, url, listener); 

到這里,整個訂閱流程已經結束,主要是看version=*如何判斷哪些服務實例可提供服務,再深入的就沒有了。

Nacos 作為注冊中心,查詢服務實例主要是根據 serviceName(接口全路徑名)和group(分組),這是因為Nacos的數據結構本身主要的就是服務名+分組名。

3.2.2.2 服務消費者調用過程

這個就不再深入講解了,調用過程和 Zookeeper 上基本一致。

責任編輯:武曉燕 來源: 不送花的程序猿
相關推薦

2022-09-05 22:22:00

Stream操作對象

2017-03-02 12:39:04

移動端iOS監控體系

2016-12-19 14:35:32

Spark Strea原理剖析數據

2009-09-14 10:35:15

Linq內部執行原理

2020-09-16 10:31:58

SMTP網絡電子郵件

2025-06-30 02:22:00

2024-04-10 12:22:19

DubboNacos微服務

2024-03-12 12:57:07

Redis主從架構

2014-02-12 10:07:07

三層交換原理

2011-05-18 09:47:17

LVSDR模式

2009-11-16 11:41:19

PHP上傳大文件

2009-03-06 16:48:23

數據塊原理Oracle

2009-03-26 10:33:34

Oracle數據塊數據庫

2010-09-06 12:50:09

PPP鏈路

2010-08-30 17:35:45

端口DHCP

2012-02-08 10:37:42

Java反射

2024-06-20 08:06:51

2019-12-05 15:45:51

SpringSecur權限系統

2021-07-20 10:26:53

源碼底層ArrayList

2010-09-17 15:32:52

JVM工作原理
點贊
收藏

51CTO技術棧公眾號

国内黄色精品| 色8久久影院午夜场| 懂色中文一区二区在线播放| 性色av一区二区三区红粉影视| 大地资源二中文在线影视观看 | 手机版av在线| sqte在线播放| 欧美激情一区二区三区不卡| 国产91一区二区三区| 岛国av中文字幕| 午夜久久福利| 中文字幕精品www乱入免费视频| 97超碰人人看| 台湾成人免费视频| 亚洲综合成人在线| 日韩精品久久久毛片一区二区| 国产夫绿帽单男3p精品视频| 巨乳诱惑日韩免费av| 欧美乱大交xxxxx另类电影| 久久精品国产亚洲av麻豆| 国产区一区二| 欧美三级在线看| 五十路熟女丰满大屁股| 巨大荫蒂视频欧美大片| 久久久精品免费网站| 国产亚洲情侣一区二区无 | 亚洲国产精品999| jizzzz日本| 黄色片视频免费观看| 天天干视频在线观看| 在线国产欧美| xxav国产精品美女主播| 国产精品揄拍100视频| 一区二区亚洲视频| 91精品国产丝袜白色高跟鞋| 天天爽天天爽夜夜爽| 黑人巨大亚洲一区二区久| 亚洲国产一区二区在线播放| 最新av在线免费观看| 99re热久久这里只有精品34| 91蝌蚪porny| 久久久精彩视频| 欧美一级视频免费| 成人午夜激情影院| 99精品在线直播| 国产成人精品白浆久久69| 韩国一区二区视频| 国产欧美精品xxxx另类| 伊人久久国产精品| 麻豆免费看一区二区三区| 国产精彩精品视频| 一级黄色在线观看| 日韩和欧美一区二区| 日本精品一区二区三区在线播放视频 | 日韩亚洲精品电影| 国产精品麻豆免费版现看视频| 精品国产1区| 亚洲午夜小视频| 山东少妇露脸刺激对白在线| 成人免费看片39| 日韩中文字幕视频在线| 男人av资源站| 中文字幕一区二区三区久久网站 | 日韩一区二区三区免费观看| 日本一本在线视频| baoyu135国产精品免费| 日韩风俗一区 二区| 日韩av一二区| 大色综合视频网站在线播放| 精品国产一区av| 久久精品99国产精| 蘑菇福利视频一区播放| 国产精品久久久久久久7电影| 中文字幕免费高清在线观看| 九色porny丨国产精品| aa日韩免费精品视频一| 日韩在线观看视频一区二区三区| 99国产精品久| 日韩中文字幕一区二区| 久久99精品久久久久久野外| 亚洲一二三四区| av天堂永久资源网| 日韩av一级| 日韩欧美成人一区| 国产精品久久无码| 色狮一区二区三区四区视频| 欧美精品在线免费| 亚洲欧美一区二区三区在线观看| 美女在线观看视频一区二区| αv一区二区三区| 欧美扣逼视频| 亚洲免费观看在线视频| 欧美大片在线播放| 青青国产精品| 亚洲第一免费播放区| 欧美大波大乳巨大乳| 中文字幕一区二区三区久久网站 | 国产亚洲日本欧美韩国| 日韩一区二区三区四区在线| 亚洲视频二区| 91在线视频免费| 四虎影视精品成人| 一区二区三区不卡视频| 高清一区二区视频| 老司机aⅴ在线精品导航| 日韩中文字幕第一页| 国产综合精品视频| 国产精品18久久久久久久久| 欧美日韩国产精品一区二区| 特级毛片在线| 欧美天天综合网| 无码精品一区二区三区在线播放| 久久神马影院| 欧洲精品在线视频| 日本美女一级片| 亚洲欧美中日韩| 不卡视频一二三| 蜜桃视频日韩| 色女人在线视频| 欧美午夜视频网站| 受虐m奴xxx在线观看| 极品日韩av| 亚洲一区二区三区视频播放| 国产中文字幕在线播放| 午夜久久久影院| 国产精品日日摸夜夜爽| 国产精品99久久久久久动医院| 国产91免费观看| 日韩欧美在线番号| 婷婷开心久久网| 熟妇高潮一区二区| 欧美精品二区| 91免费观看| 51xtv成人影院| 欧美一区二区成人| 欧美亚洲日本在线| 国内成人精品2018免费看| 亚洲欧美电影在线观看| 欧美最新精品| 国产亚洲日本欧美韩国| 久久精品视频5| 久久精品日韩一区二区三区| 免费看日本毛片| 亚瑟一区二区三区四区| 欧美亚洲另类激情另类| 免费在线毛片| 色婷婷国产精品综合在线观看| www.自拍偷拍| 久久久www| 日韩区国产区| av免费在线一区| 日韩中文视频免费在线观看| 亚洲一卡二卡在线观看| 最新高清无码专区| 欧美日韩一区二区区| 黄色另类av| 九色一区二区| 欧美电影免费观看网站| 亚洲午夜av电影| 亚洲怡红院av| 一区二区三区日本| 在线免费观看污视频| 羞羞视频在线观看欧美| 日本一区美女| 祥仔av免费一区二区三区四区| 久久亚洲精品成人| 隣の若妻さん波多野结衣| 婷婷综合在线观看| 国产91丝袜美女在线播放| 麻豆中文一区二区| 路边理发店露脸熟妇泻火| 国产精品玖玖玖在线资源| 91av在线视频观看| 在线激情小视频| 日韩欧美的一区二区| 四虎成人永久免费视频| 国产精品网曝门| 在线观看一区二区三区视频| 亚洲激情黄色| 性欧美videosex高清少妇| 精品国产一级| 清纯唯美亚洲综合| 免费a级毛片在线播放| 精品粉嫩超白一线天av| 天堂免费在线视频| 一区二区三区小说| 日本少妇色视频| 久草精品在线观看| 无码人妻丰满熟妇区96| 色小子综合网| 国模精品一区二区三区| 福利一区二区三区视频在线观看| 久久久久成人网| 国产爆初菊在线观看免费视频网站| 91精品国产一区二区三区香蕉| 天天操天天摸天天干| 亚洲欧洲日产国码二区| av网页在线观看| 精品一区二区三区在线播放视频| 国产中文字幕二区| 99re66热这里只有精品8| 国产亚洲情侣一区二区无 | 91视频婷婷| 欲香欲色天天天综合和网| 久久精品国产96久久久香蕉| 色哟哟中文字幕| 日韩一区二区精品| 日本视频免费观看| 香蕉成人伊视频在线观看| 亚洲欧美综合7777色婷婷| 91免费看片在线观看| 少妇性l交大片7724com| 奇米四色…亚洲| 激情六月丁香婷婷| 狠狠综合久久| 久久福利一区二区| 91综合网人人| 神马一区二区影院| 久久99国内| 国产精品一区二区三区在线观| 亚洲精品伊人| 国产精品www网站| 都市激情亚洲综合| 97国产精品免费视频| 日本一区精品| 全球中文成人在线| 国产精品com| 色是在线视频| 97在线视频一区| www在线观看黄色| 久久91亚洲人成电影网站| av在线麻豆| 久热国产精品视频| 老司机精品视频在线观看6| 这里只有精品丝袜| yes4444视频在线观看| 在线性视频日韩欧美| 国产最新视频在线观看| 国产视频在线一区二区| 西西人体44www大胆无码| 亚洲国产欧美一区| 五月天激情开心网| 日韩国产在线看| 日韩资源在线| 亚洲丝袜在线视频| 国产精品久久久久久久龚玥菲 | 日韩网站在线| 女人和拘做爰正片视频| 亚洲中字黄色| 午夜dv内射一区二区| 日韩精品福利网| 一区二区xxx| 国产一区二区在线观看免费| 亚洲精品国产一区二区三区| 黑人巨大精品欧美一区| 国产又粗又猛又爽又黄| 国产成人啪午夜精品网站男同| 久久久久久无码精品人妻一区二区| 国产91高潮流白浆在线麻豆| 中文字幕天堂av| 久久伊人蜜桃av一区二区| 一区二区三区伦理片| 中文字幕不卡一区| 亚洲精品卡一卡二| 亚洲一区中文在线| 国产午夜免费福利| 欧美日韩国产综合视频在线观看| 国产精品久久久久久在线| 日韩欧美久久久| 无套内谢的新婚少妇国语播放| 亚洲人永久免费| 欧美激情午夜| 久久久久久久久久久人体| 久久毛片亚洲| 国产在线视频2019最新视频| 一区二区三区视频播放| 欧美成熟毛茸茸复古| 日韩电影在线视频| 国产乱子伦精品无码专区| 午夜在线播放视频欧美| 中文字幕久久av| www.亚洲激情.com| 国产精品久久久久久成人| 亚洲尤物视频在线| 黄色污污网站在线观看| 欧美一区二区视频观看视频| 色综合久久久久久| 日韩中文字幕免费| 性感女国产在线| 91在线观看免费高清| 日韩a级大片| 四虎永久免费网站| 鲁大师影院一区二区三区| 手机av在线网站| 久久久精品tv| 久久精品国产亚洲av麻豆色欲| 欧美午夜片在线观看| 日本免费一区视频| 久久色免费在线视频| 欧美成人性网| 国产亚洲欧美一区二区| 91久久电影| 国产免费成人在线| 国产电影一区二区三区| 国产三级av在线播放| 亚洲综合久久av| 91亚洲精品国偷拍自产在线观看| 日韩精品极品视频免费观看| v天堂福利视频在线观看| 国产成+人+综合+亚洲欧美丁香花| 日韩欧美另类中文字幕| 一区二区精品国产| 久久aⅴ乱码一区二区三区| 女王人厕视频2ⅴk| 亚洲国产精品二十页| 97久久久久久久| 精品国产乱码久久| 成人无遮挡免费网站视频在线观看| 欧美壮男野外gaytube| 成人av综合网| 久久免费一级片| 国内精品伊人久久久久影院对白| 黄色片在线观看免费| 五月天久久比比资源色| 高潮一区二区三区乱码| 欧美理论电影在线观看| 久久久久毛片| 日韩色妇久久av| 久久精品网址| 特级西西人体wwwww| 亚洲成人av福利| 国产jzjzjz丝袜老师水多| 日韩在线观看网站| 日本久久二区| 中文字幕免费在线不卡| 秋霞影院一区二区| jizz18女人高潮| 欧美四级电影网| av女优在线| 成人h视频在线观看播放| 日韩在线综合| xxww在线观看| 国产精品国产三级国产普通话99 | 亚洲第一区在线| segui88久久综合| 精品国产二区在线| 久久av在线| 国产精品情侣呻吟对白视频| 欧美视频在线一区| 欧美激情二区| 99精品国产高清在线观看| 韩国欧美一区| 国产伦精品一区三区精东| 精品久久久久久中文字幕| 亚洲欧洲免费无码| 超碰成人免费| 2022亚洲天堂| 久久青草欧美一区二区三区| 无码人妻精品一区二区50| 亚洲香蕉成人av网站在线观看| 欧美日韩尤物久久| 久久av秘一区二区三区| 国产精品一区一区三区| 国产一级黄色av| 亚洲精品视频久久| 成人国产综合| 强开小嫩苞一区二区三区网站| 国产成人精品综合在线观看 | www.91在线| 91久久久久久久久| 好看的av在线不卡观看| 鲁大师私人影院在线观看| 色综合久久88色综合天天| 天堂аⅴ在线地址8| 91入口在线观看| 久久亚洲一区| 精品国产国产综合精品| 亚洲电影免费观看| 成人mm视频在线观看| 青青草综合视频| 2023国产一二三区日本精品2022| 成人黄色免费网| 久久久久久久久亚洲| 免费毛片在线不卡| 日本高清免费观看| 欧美视频在线免费看| 国产激情在线| 老牛影视免费一区二区| 国产乱理伦片在线观看夜一区| 伊人手机在线视频| 俺去啦;欧美日韩| 天堂综合网久久| 能看毛片的网站| 欧洲生活片亚洲生活在线观看| 亚洲淫性视频| 欧美综合激情| 成人免费毛片a| 91国内精品视频| 热久久美女精品天天吊色| 欧美1区3d|