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

淺談Nacos獲取配置兩次調優經歷

開發 項目管理
Nacos?(Dynamic Naming and Configuration Service)是一個開源的動態服務發現、配置管理和服務管理平臺,由阿里巴巴集團開發并維護。Nacos致力于幫助用戶發現、配置和管理微服務,通過它提供的簡單易用的特性集,能夠快速實現動態服務發現、服務配置、服務元數據及流量管理。?

1.Nacos簡介

Nacos(Dynamic Naming and Configuration Service)是一個開源的動態服務發現、配置管理和服務管理平臺,由阿里巴巴集團開發并維護。Nacos致力于幫助用戶發現、配置和管理微服務,通過它提供的簡單易用的特性集,能夠快速實現動態服務發現、服務配置、服務元數據及流量管理。例如Nacos支持配置的動態更新,服務無需重新部署上線即可獲取最新配置,提升了系統的靈活性和響應速度;在多環境配置方面,它提供的Namespace和Group機制,便于管理不同的生產環境(例如測試、預上線和生產環境,每一個環境可通過Namespace和Group機制對同一配置項進行不同的配置)的配置、簡化多環境配置管理;Nacos還支持多種配置格式(如Properties、YAML、JSON等)和流量控制,滿足不同的開發需求。Nacos憑借如上這些優勢,在配置管理領域是一種理想的選擇。

2.Nacos配置中心在實際項目中的應用

Nacos目前廣泛的應用在我們的項目中,并且多數是作為配置管理來應用的,例如管理黑白名單的變更、灰度上線、一些開關的設置等。例如,在2023年北顯機房下線、金山云替換北顯機房的過程中,Nacos在我們的服務中發揮了巨大的作用。因歷史和架構原因,我們的多個服務存在共用同一redis實例的情況,為最大程度避免redis數據不一致的情況,我們在共用redis的服務中引入同一配置項作為切換的開關(前提是北顯機房的redis數據已“實時地”向金山云機房同步),當開關關閉時,所有服務讀寫北顯機房的redis。當開關打開后,所有服務讀寫金山云機房的redis。這相當于做到了所有服務“同時”從讀寫北顯機房的redis切換到讀寫金山云機房的redis,觀察服務沒有問題后,移除開關,實現了機房平穩替換。

Nacos作為配置中心并且實際應用的過程中,我們共發現了兩次問題,這兩個問題都是在流量比較大的時候出現的,下面我們分別來講述兩個問題的表現以及我們是如何針對這兩個問題進行調優的。希望通過這兩次配置調優的經歷,為大家提供一些可選的配置調優方案,以期未來大家在遇到類似問題時,可以嘗試我們的解決方案。

NacosClient獲取Config的常規流程

優化前客戶端獲取配置的流程圖:

圖片圖片

3.兩次調優經歷

為了避免因服務器遷移導致的一些文件路徑問題,我們未配置Nacos本地文件路徑(即我們沒有指定user.home屬性),故而在起初,我們獲取某個dataId配置的時候,都是實時從Server端拉取,也就是在上圖中我們沒有本地緩存的文件。

圖片圖片

圖片圖片

3.1 第一次調優

從流程圖可以看到,我們服務獲取配置都是實時從Nacos Server端拉取,當服務的請求量較大(請求量大,但未被Nacos攔截器攔截住)時,雖然可以獲取到配置,但是服務報了很多超時,因為獲取配置這一步的耗時就已經接近或者超過程序里設定的超時時間(400毫秒)。相關代碼如下所示:

public static String getConfig(String dataId) {
   try {
     return configService.getConfig(dataId, NACOS_GROUP, 400);
   } catch (Throwable e) {
     LOGGER.error("getConfig happens error, dataId = {}, group = {} ", dataId, NACOS_GROUP, e);
   }
   return null;
 }

我們的一個數字氣泡計算服務灰度上線后,發現了很多關于"getConfig happens error, "的超時錯誤日志。經排查和討論,我們認為,每一個服務的配置項并不是很多,并且配置項多數不會頻繁的變更,即便配置項發生改變,延遲幾秒(Nacos配置變化生效時間幾乎都是毫秒級)對服務也無影響,綜上,我們用機器內存緩存配置來解決這一超時問題。針對還可能出現的超時情況,我們采用了兜底的方式(兜底的代碼幾乎不會執行到,但為了安全起見,我們還是為每一個配置項設置了一個兜底的“值”)。

▲ 第一次優化:內存緩存+兜底配置

我們在服務中為各個配置項注冊監聽器,當配置項發生變更時,我們將已獲取到的新的配置configInfo放入內存Map中,如下圖所示:

圖片圖片

通過這種方式,服務在實際獲取配置的時候,優先從內存緩存中獲取,如果獲取不到再從服務器拉取:

public static String getConfig(String dataId) {
    try {
        // 優先從map中獲取
        String value = cacheMap.get(dataId);
        if (StringUtils.isBlank(cacheMap.get(dataId))) {
            // 如果map中沒有此配置項,則從服務端拉取,拉取后再放入map中
            value = configService.getConfig(dataId, NACOS_GROUP, 100);
            cacheMap.put(dataId, value);
        }

        return value;
    } catch (Throwable e) {
        LOGGER.error("getConfig happens error, dataId = {}, group = {} ", dataId, NACOS_GROUP, e);
    }
    return null;
}

如果內存緩存里沒有此配置項、并且請求服務端獲取此配置項時超時的話,就用兜底的配置值(這里需要注意的是,兜底的配置值可能需要不斷的調整以備不時之需),相關代碼如下所示:

public static boolean getSwitch() {
    try {
        // 優先從內存緩存里或者服務端拉取配置
        String config = getConfig(SWITCH_DATAID);
        if (StringUtils.isNotBlank(config)) {
            return"1".equalsIgnoreCase(config);
        }
    } catch (Exception e) {
        LOGGER.error("Error", e);
    }

    // 兜底值
    returnfalse;
}

這樣通過內存緩存和兜底的方式,解決了請求Nacos服務端獲取配置超時這一問題。

第一次優化后客戶端獲取配置的流程圖總結如下:

圖片圖片

3.2 第二次調優

經過第一次的調優,Nacos作為配置在我們服務中一直運行的很好。但有一次我們的一個服務在灰度上線重啟時報了一些關于Nacos的錯誤日志,等這臺灰度上線的機器“穩定”后,相關的Nacos報錯日志也就停止了。初步排查我們發現,這些報錯導致其對應請求在獲取Nacos配置時走了兜底,雖然并未造成請求錯誤,但依賴于兜底,在未來可預見的時間內可能“引發”一些未知的問題,所以我們決定繼續排查并解決此問題。

經過各種排查和分析,我們發現服務剛啟動后有并發的流量進來,導致部分請求流量在獲取配置的時候被Nacos攔截器攔截住(獲取配置的qps超過了server端的限流閾值),以至獲取不到最新的配置,報錯日志如下:

15:47:49.708 [nioEventLoopGroup-3-7] ERROR [traceId:0f9bb096-fb01-4251-85f0-e5eb9d747f55] (c.a.n.c.c.i.Limiter:79) - access_key_id:4396fea7a8e259f09e8022caf4105fbd limited

15:47:49.709 [nioEventLoopGroup-3-6] ERROR [traceId:d4d2e03d-0267-4a47-b9b0-7416aa1c0e5c] (c.a.n.c.c.i.Limiter:79) - access_key_id:4396fea7a8e259f09e8022caf4105fbd limited

15:47:49.710 [nioEventLoopGroup-3-7] ERROR [traceId:0f9bb096-fb01-4251-85f0-e5eb9d747f55] (c.a.n.c.c.i.ClientWorker:242) - [fixed-nacos01.recom.mrd.sohuno.com_8848-nacos02.recom.mrd.sohuno.com_8848-nacos03.recom.mrd.sohuno.com_8848-e9010bc6-8adc-41ee-a3ad-222d08892325] [sub-server-error] dataId=comment_aggregation_switch, group=online, tenant=e9010bc6-8adc-41ee-a3ad-222d08892325, code=-503

15:47:49.711 [nioEventLoopGroup-3-4] ERROR [traceId:085d14da-1b6e-4379-8297-3fb425795519] (c.a.n.c.c.i.Limiter:79) - access_key_id:4396fea7a8e259f09e8022caf4105fbd limited

15:47:49.711 [nioEventLoopGroup-3-4] ERROR [traceId:085d14da-1b6e-4379-8297-3fb425795519] (c.a.n.c.c.i.ClientWorker:242) - [fixed-nacos01.recom.mrd.sohuno.com_8848-nacos02.recom.mrd.sohuno.com_8848-nacos03.recom.mrd.sohuno.com_8848-e9010bc6-8adc-41ee-a3ad-222d08892325] [sub-server-error] dataId=comment_aggregation_switch, group=online, tenant=e9010bc6-8adc-41ee-a3ad-222d08892325, code=-503

15:47:49.711 [nioEventLoopGroup-3-6] ERROR [traceId:d4d2e03d-0267-4a47-b9b0-7416aa1c0e5c] (c.a.n.c.c.i.ClientWorker:242) - [fixed-nacos01.recom.mrd.sohuno.com_8848-nacos02.recom.mrd.sohuno.com_8848-nacos03.recom.mrd.sohuno.com_8848-e9010bc6-8adc-41ee-a3ad-222d08892325] [sub-server-error] dataId=comment_aggregation_switch, group=online, tenant=e9010bc6-8adc-41ee-a3ad-222d08892325, code=-503

原因分析:

根據報錯日志,初步判定是從遠端服務器拉取comment_aggregation_switch這個dataId配置的時候報錯,我們閱讀了Nacos獲取配置相關的源碼,從源碼一步一步地追蹤到了錯誤日志出現的地方,相關分析過程如下:

首先,我們通過getConfig方法獲取comment_aggregation_switch這個dataId的配置值:

public static boolean getCommentAggregationSwitch() {
    try {
        String config = getConfig(COMMENT_AGGREGATION_SWITCH);
        if (StringUtils.isNotBlank(config)) {
            return "1".equalsIgnoreCase(config);
        }
    } catch (Exception e) {
        LOGGER.error("getCommentAggregationSwitch error", e);
    }
    return false;
}

在獲取comment_aggregation_switch這個dataId配置時,因為機器內存中沒有此配置,所以通過configService對象的getConfig接口遠程拉取:

public static String getConfig(String dataId) {
    try {
        String value = cacheMap.get(dataId);
        if (StringUtils.isBlank(cacheMap.get(dataId))) {
            value = configService.getConfig(dataId, NACOS_GROUP, 100);
            cacheMap.put(dataId, value);
        }

        return value;
    } catch (Throwable e) {
        LOGGER.error("getConfig happens error, dataId = {}, group = {} ", dataId, NACOS_GROUP, e);
    }
    return null;
}

@Override
public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
    return getConfigInner(namespace, dataId, group, timeoutMs);
}

而configService對象的getConfig接口會調用getConfigInner方法,在getConfigInner方法種,我們找到了出錯的地方。因為我們沒有為Nacos配置LOCAL_SNAPSHOT_PATH(即我們沒有指定user.home屬性),所以跳過本地檢查那一步,也就是不會優先使用本地配置。那么不使用本地緩存配置,或緩存已過期,這些都會向Nacos服務端發起請求來獲取配置:

private String getConfigInner(String tenant, String dataId, String group, long timeoutMs) throws NacosException {
    group = blank2defaultGroup(group);
    ParamUtils.checkKeyParam(dataId, group);
    ConfigResponse cr = new ConfigResponse();
    
    cr.setDataId(dataId);
    cr.setTenant(tenant);
    cr.setGroup(group);
    
    // 優先使用本地配置
    String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
    if (content != null) {
        LOGGER.warn("[{}] [get-config] get failover ok, dataId={}, group={}, tenant={}, cnotallow={}", agent.getName(),
                dataId, group, tenant, ContentUtils.truncateContent(content));
        cr.setContent(content);
        String encryptedDataKey = LocalEncryptedDataKeyProcessor
                .getEncryptDataKeyFailover(agent.getName(), dataId, group, tenant);
        cr.setEncryptedDataKey(encryptedDataKey);
        configFilterChainManager.doFilter(null, cr);
        content = cr.getContent();
        return content;
    }
    
    try {
        ConfigResponse response = worker.getServerConfig(dataId, group, tenant, timeoutMs);
        cr.setContent(response.getContent());
        cr.setEncryptedDataKey(response.getEncryptedDataKey());
        
        configFilterChainManager.doFilter(null, cr);
        content = cr.getContent();
        
        return content;
    } catch (NacosException ioe) {
        if (NacosException.NO_RIGHT == ioe.getErrCode()) {
            throw ioe;
        }
        LOGGER.warn("[{}] [get-config] get from server error, dataId={}, group={}, tenant={}, msg={}",
                agent.getName(), dataId, group, tenant, ioe.toString());
    }
    
    LOGGER.warn("[{}] [get-config] get snapshot ok, dataId={}, group={}, tenant={}, cnotallow={}", agent.getName(),
            dataId, group, tenant, ContentUtils.truncateContent(content));
    content = LocalConfigInfoProcessor.getSnapshot(agent.getName(), dataId, group, tenant);
    cr.setContent(content);
    String encryptedDataKey = LocalEncryptedDataKeyProcessor
            .getEncryptDataKeyFailover(agent.getName(), dataId, group, tenant);
    cr.setEncryptedDataKey(encryptedDataKey);
    configFilterChainManager.doFilter(null, cr);
    content = cr.getContent();
    return content;
}

在ConfigResponse response = worker.getServerConfig(dataId, group, tenant, timeoutMs);這一步,執行getServerConfig方法、http請求Nacos服務端獲取具體的配置值,相關截圖如下:

圖片圖片

在getServerConfig方法中,會調用agent(ServerHttpAgent)的httpGet方法去獲取配置結果:

圖片圖片

在agent(ServerHttpAgent)的httpGet方法中,會繼續調用NACOS_RESTTEMPLATE的get方法:

圖片圖片

在NACOS_RESTTEMPLATE的get方法中,執行execute方法,這里即將和Nacos的攔截器打交道:

圖片圖片

執行this.requestClient()的execute方法、在經過Nacos服務端攔截器的時候,判斷是否被攔截器攔截住時返回了:

圖片圖片

在isIntercept方法中,Nacos攔截器里判斷qps是否超過了限流器閾值,即Limiter.isLimit方法返回true:

圖片圖片

我們看到,Nacos服務端設置某個accessKeyId默認訪問的qps最大不能超過5(limit=5):

圖片圖片

因為limit=5這個閾值限制,加上我們服務在啟動后就有大量的流量進來,存在qps>5的情況,所以在此處qps>5的并發訪問流量被限制住,isLimit方法返回true:

圖片圖片

圖片圖片

圖片圖片

因isLimit方法返回true,以及LimitResponse的statusCode是-503,所以agent(ServerHttpAgent)的httpGet在如下這一步返回(沒有走進isFail方法里):

圖片圖片

從而getServerConfig實現類里,在判斷請求結果時,因result的getCode()返回是-503,所以default處打印了錯誤日志(我們服務報錯的日志),并拋了異常:

圖片圖片

在經過如上的分析后,針對被Nacos攔截器攔截、超過server端限流器閾值這一問題,我們初步制定出了兩種解決方案,如下所示:

▲ 解決方案1:增大server端限流器閾值

我們第一時間能想到的解決方案就是增大limit的值,也就是要增加limitTime這一配置或者更改這一配置的值,然后Nacos在讀取該值的時候就會用新的限流閾值(Nacos獲取閾值是通過System.getProperty("limitTime", String.valueOf(limit))來獲取的)。但是我們想到了一些潛在的問題,首先問題一:限流閾值增加到多少合適;問題二:Nacos服務器是否可以抗住;問題三:增大這個閾值是否會帶來額外的問題?

我們初步想將limitTime的值設置為10,也就是翻一倍。但是如果并發流量要是大于10怎么辦,這個值需要再增加到多少合適?再增加后Nacos服務器是否可以抗的住,即便抗的住是否會有一些未知的其它問題。最后,經過組內的評測,我們覺得此種更改可能風險比較大,我們需要一種更適合的解決方案。

▲ 解決方案2:服務啟動后、流量進來前先獲取配置到內存以及增加監聽器

在經過第一次調優后,我們的服務是在服務啟動后、流量進來前只監聽,并沒有先獲取配置,代碼如下:

public static void addListener(String dataId, String group) {
    // 監聽配置
    try {
        configService.addListener(dataId, group, new PropertiesListener() {
            @Override
            public void innerReceive(Properties properties) {
            }
            @Override
            public void receiveConfigInfo(String configInfo) {
            }
        });
    } catch (Throwable e) {
        LOGGER.error("addListener happens error, dataId = {}, group = {} ", dataId, group, e);
    }
}

我們發現Nacos在作為配置管理時,有自帶的getConfigAndSignListener方法,此方法是可以先獲取配置再去注冊監聽的,我們嘗試使用這一方法,修改后代碼如下:

String config = configService.getConfigAndSignListener(dataId, group, 1000,
   new PropertiesListener() {
     @Override
     public void innerReceive(Properties properties) {
     }

     @Override
     public void receiveConfigInfo(String configInfo) {
       cacheMap.put(dataId, configInfo);
     }
   });
if (StringUtils.isNotEmpty(config)) {
   cacheMap.put(dataId, config);
 }

這樣在服務啟動時首先會拉取一次配置并放到內存,之后如果有并發的流量進來,都可以從內存中獲取。為了驗證這一改動是否有效,我們在UAT環境上模擬報問題那臺機器上的請求,也就是使并發請求Nacos獲取配置的qps>5,經過了多次驗證,我們沒有再發現報錯。此種解法相較于第一種解決方案,對于我們來講算是近似最優解。變更代碼、測試驗證、灰度、上線后,再未發現此問題。

第二次優化后獲取配置相當于拆分為兩個“步驟”,步驟一是在應用程序初始化時:

圖片圖片

步驟二是在程序運行時需要獲取配置:

圖片圖片

4.總結

Nacos作為配置中心在我們項目中發揮了重要作用,在實際使用的過程中,我們共遇到了兩個問題,本篇文章介紹了兩個問題的表現并簡單從源碼層面分析了第二個問題出現的原因,之后給出了對應的解決方案。我們希望通過這兩次配置調優的經歷,為大家提供一些可選的配置調優方案,以期未來大家在遇到類似問題時,可以嘗試應用這兩種解決方法來解決實際的問題。

在SpringBoot的項目中,可以通過以下方式配置Nacos:

圖片圖片

也可以不通過配置方式直接在項目中初始化:

圖片圖片

綜上,目前我們認為引入Nacos組件最佳的實踐方式是:

1.服務啟動時首先獲取配置并且監聽配置的改變;

2.將獲取到的配置緩存到本地內存中;

3.可根據需要適當增大限流器閾值limitTime,但不建議更改此參數;

4.可根據需要適當增大從服務器拉取配置的超時時間,目前內網環境下我們設置的是100毫秒,可以重試;

5.做好相關錯誤日志的打印及報警工作;

6.為每一個配置項增加一個兜底值。

責任編輯:武曉燕 來源: 搜狐技術產品
相關推薦

2023-11-11 19:07:23

JVMJava

2020-11-30 11:40:35

NginxLinux性能調優

2021-04-28 06:20:59

JVMJavaJVM調優

2011-04-13 09:21:30

死鎖SQL Server

2011-05-16 10:10:51

2010-08-11 12:43:45

DB2數據庫調優

2009-07-09 09:47:26

Sun JVM

2012-01-10 14:35:08

JavaJVM

2013-12-18 09:36:33

Fedora 20

2012-01-10 14:18:40

JavaJVM

2017-07-21 08:55:13

TomcatJVM容器

2013-05-21 11:22:15

Google+UI設計

2024-10-16 08:38:37

TCP編號信息

2021-03-04 08:39:21

SparkRDD調優

2011-05-20 14:23:01

Oracle調優

2021-11-01 23:36:24

連續區間面試

2024-07-15 00:00:00

POST瀏覽器網絡

2021-10-08 11:05:00

Go 切片內存

2011-03-10 14:40:54

LAMPMysql

2023-02-08 15:32:16

云服務中斷微軟
點贊
收藏

51CTO技術棧公眾號

日韩精品欧美激情| 亚洲黄色尤物视频| 91久久精品美女高潮| 免费在线黄色片| 中文字幕中文字幕精品| 欧美精品乱人伦久久久久久| 精品成在人线av无码免费看| 国产女人在线观看| 国产99久久久精品| 国产精品欧美日韩| 久久久久久激情| jlzzjlzz亚洲女人| 亚洲成年网站在线观看| 天天干天天干天天干天天干天天干| 中文在线字幕免费观看| 久久精品一区二区| 成人国产一区二区| 中文字幕在线播放av| 在线电影一区| 欧美成人中文字幕| 午夜黄色福利视频| 亚洲性视频大全| 欧美变态口味重另类| 少妇一级淫免费播放| cao在线视频| 亚洲品质自拍视频| 亚洲巨乳在线观看| 男女污污视频在线观看| 岛国av在线一区| 亚洲一区久久久| 亚洲性在线观看| 欧美亚洲一区| 欧美亚洲日本网站| 伊人国产在线观看| 亚洲欧美亚洲| 久久成人在线视频| 午夜三级在线观看| 日韩在线观看一区 | 黄色av免费观看| 国产一区二区按摩在线观看| 国产在线一区二区三区| 中文字幕+乱码+中文| 久久午夜精品| 欧美在线视频网| 免费在线不卡视频| 亚洲一区二区动漫| 91高潮精品免费porn| 国产成年人免费视频| 亚洲欧美综合| 久久久久久久久久久国产| 午夜爱爱毛片xxxx视频免费看| 色中色综合网| 久久成人精品电影| 久草视频免费在线播放| 欧美日韩一区自拍| 欧美极品美女电影一区| 久久久久久福利| 亚洲精品123区| 性视频1819p久久| 中文字幕一区二区三区手机版| 伊人天天综合| 4438全国成人免费| 懂色av蜜臀av粉嫩av喷吹| 日韩电影免费在线| 国产精品福利网| 这里只有精品6| 国产综合色视频| av蓝导航精品导航| 视频一区二区免费| 久久综合av免费| 先锋在线资源一区二区三区| 欧洲日本在线| 亚洲一区电影777| 国产原创popny丨九色| 欧洲精品一区二区三区| 欧美日韩一区二区三区不卡| √天堂资源在线| 国产乱人伦精品一区| 亚洲深夜福利网站| 91精品少妇一区二区三区蜜桃臀| 欧美成熟视频| 欧美亚洲在线视频| 91国内精品久久久| 成熟亚洲日本毛茸茸凸凹| 麻豆av一区二区| 麻豆影视国产在线观看| 亚洲电影中文字幕在线观看| 免费黄色一级网站| 欧美影院视频| 亚洲午夜未删减在线观看 | 午夜视频在线免费看| 日韩电影在线观看完整免费观看| 在线成人免费网站| 久久免费视频99| 三级久久三级久久久| 91精品婷婷国产综合久久蝌蚪| 色欲av伊人久久大香线蕉影院| 国产欧美日韩不卡| 黄色a级片免费看| 成人涩涩视频| 日韩成人中文电影| 爱爱视频免费在线观看| 香蕉久久国产| 99在线看视频| 91精彩视频在线播放| 亚洲国产精品综合小说图片区| 九九九在线观看视频| 国内露脸中年夫妇交换精品| 日韩视频免费看| 天天爽夜夜爽夜夜爽精品| 精品综合久久久久久8888| 久久久久久草| heyzo一区| 欧美一区二区三区视频在线观看 | 2019中文字幕在线观看| 国产麻豆91视频| 久久久国际精品| 久久综合久久久久| 国产精品毛片无码| 中文字幕日韩精品在线| 九九精品免费视频| 9人人澡人人爽人人精品| 青春草在线视频免费观看| 桃花岛成人影院| 日韩av网址在线观看| 久久久久久久久精| 国产曰批免费观看久久久| 午夜精品福利一区二区| 永久免费毛片在线播放| 亚洲精品xxxx| 在线观看 中文字幕| 国产91丝袜在线18| a级黄色片免费| 看亚洲a级一级毛片| 色哟哟网站入口亚洲精品| 国产suv精品一区二区33| 久久综合999| 国产麻花豆剧传媒精品mv在线| 久久精品国产亚洲5555| 97精品一区二区三区| 精品久久久久中文慕人妻| 亚洲日本青草视频在线怡红院| 久热精品在线播放| 91精品蜜臀一区二区三区在线| 国产美女精彩久久| 二区在线播放| 91精品国产入口在线| 小泽玛利亚一区| 国产一区二区剧情av在线| 亚洲激情免费视频| 天堂va在线高清一区| 欧美激情女人20p| 国 产 黄 色 大 片| 亚洲一区二区三区视频在线播放 | 欧美精品密入口播放| 97视频在线观看亚洲| 午夜视频1000| 色婷婷亚洲一区二区三区| 大又大又粗又硬又爽少妇毛片 | 国产一二在线观看| 欧美图区在线视频| 午夜精品一区二区三级视频| 国产一区二区三区免费| 人妻激情另类乱人伦人妻| 国产劲爆久久| 日本国产一区二区三区| chinese偷拍一区二区三区| 欧美视频三区在线播放| 永久免费看片直接| www.在线欧美| 国产精品igao| 欧美一区国产在线| 鲁丝一区鲁丝二区鲁丝三区| 快播电影网址老女人久久| 中文字幕无线精品亚洲乱码一区 | 精品一区精品二区| 亚洲视屏在线观看| 亚洲综合成人在线视频| 国产精品伦子伦| 免费观看一级特黄欧美大片| 日韩视频一二三| 丝袜av一区| 成人www视频在线观看| 国产www视频在线观看| 亚洲美女久久久| 国产精品色综合| 精品久久久国产精品999| 美女av免费看| 成人一区二区视频| 99视频在线视频| 国产精品mv在线观看| 国产视频一区免费看| 2020欧美日韩在线视频| 2019中文字幕在线视频| 精品日韩在线观看| 日韩国产亚洲欧美| 亚洲网友自拍偷拍| www.涩涩爱| 99热这里都是精品| www.久久av.com| 免费精品视频| 久久免费一级片| 精品国产91| 精品国产一区二区三区日日嗨| 成人日韩av| 97久久国产精品| a在线免费观看| 国产亚洲一区二区精品| 韩国av免费在线| 在线不卡中文字幕播放| 波多野结衣高清视频| 亚洲电影在线播放| 精品人妻伦九区久久aaa片| 久久久美女艺术照精彩视频福利播放| 韩国三级在线播放| 麻豆精品国产传媒mv男同 | 日韩中文字幕一区二区三区| 日韩中文字幕亚洲精品欧美| 日本高清免费电影一区| 蜜桃狠狠色伊人亚洲综合网站| 88久久精品| 91国产在线播放| 2019中文亚洲字幕| 成人av番号网| 日本国产亚洲| 国产精品久久久久久久久久东京| 神马久久午夜| 国内免费久久久久久久久久久| 91麻豆免费在线视频| 中文字幕亚洲国产| www.成人.com| 中文精品99久久国产香蕉| 精品亚洲成a人片在线观看| 日韩成人激情在线| 亚洲av片一区二区三区| 欧美精品一区男女天堂| 亚洲国产综合网| 精品久久久久久久久久久院品网 | 99久久综合国产精品二区| 欧洲亚洲在线视频| xxx欧美xxx| 国产91免费看片| 欧美一区国产| 国产精品91久久| 色猫猫成人app| 国产精品一二区| 日韩综合久久| 97人人模人人爽人人少妇| 玖玖玖电影综合影院| 懂色一区二区三区av片| 国产美女撒尿一区二区| 精品国产乱码久久久久久久软件| 久久资源综合| 欧美日韩亚洲免费| 成人精品视频| 欧美 另类 交| 伊人久久成人| 欧美日韩国产精品激情在线播放| 日欧美一区二区| 日本黄大片一区二区三区| 国内精品写真在线观看| 亚洲成年人av| 久久免费的精品国产v∧| 精品亚洲aⅴ无码一区二区三区| 国产精品久久久久一区| 欧美另类videoxo高潮| 一区二区高清视频在线观看| 国产午夜久久久| 色狠狠一区二区| 国产裸体无遮挡| 亚洲精品wwwww| 中文字幕日本在线| 欧美激情综合亚洲一二区| 亚洲女同志freevdieo| 国产精品日韩一区| 视频一区中文字幕精品| 免费久久99精品国产自| 久久久国产精品| 鲁一鲁一鲁一鲁一色| 蜜桃视频在线观看一区| 人妻换人妻a片爽麻豆| 久久久国际精品| 久久国产露脸精品国产| 欧美日韩国产一区二区| 国产免费黄色大片| 亚洲精品v天堂中文字幕| 男人在线资源站| 欧美国产日本高清在线| 黑人巨大亚洲一区二区久| 亚洲a一级视频| 九九热爱视频精品视频| 国风产精品一区二区| 日韩高清在线观看| 国产a√精品区二区三区四区| 国产午夜精品美女毛片视频| 看片网站在线观看| 欧美丝袜丝交足nylons| 日韩一卡二卡在线| 久久久成人精品| 芒果视频成人app| 99影视tv| 91精品啪在线观看国产18| 麻豆av免费在线| 成人免费的视频| 亚洲精品卡一卡二| 色综合天天综合在线视频| 亚洲免费不卡视频| 久久这里有精品| 久久国产三级| 欧美久久久久久一卡四| 精品9999| 能看毛片的网站| 国产精品久久久久久福利一牛影视| 亚洲日本韩国在线| 欧美sm美女调教| 成年视频在线观看| 国产日韩专区在线| 国产亚洲电影| 无遮挡又爽又刺激的视频| a在线欧美一区| 欧美又粗又大又长| 6080国产精品一区二区| 国产美女性感在线观看懂色av| 97热精品视频官网| 国产毛片久久久| 成人免费在线网| 风流少妇一区二区| 久久高清无码视频| 精品国产区一区| 超碰在线网站| 国产精品视频入口| 尤物在线精品| 国产黑丝一区二区| 亚洲国产视频a| 国产成人自拍一区| 久久久亚洲福利精品午夜| 91九色鹿精品国产综合久久香蕉| 青青视频免费在线| 国产电影一区在线| 久久久精品一区二区涩爱| 日韩精品中午字幕| 狂野欧美激情性xxxx欧美| 国产高清在线一区二区| 亚洲性色视频| 日本japanese极品少妇| 欧美日韩中文在线| 亚洲av成人无码久久精品老人 | 欧美激情一区二区三区全黄| 69亚洲精品久久久蜜桃小说 | 欧美一级免费大片| av黄在线观看| 国产精品成人观看视频免费| 日韩午夜精品| 亚洲精品视频久久久| 欧亚洲嫩模精品一区三区| 岛国最新视频免费在线观看| 国产伦精品免费视频| 中文不卡在线| 久久人妻一区二区| 91久久精品一区二区三| a中文在线播放| 亚洲字幕在线观看| 国产亚洲激情| 国产精成人品免费观看| 欧美高清hd18日本| 国产一线二线在线观看| 免费看污久久久| 久久99精品久久久久久动态图 | 亚洲精品白浆| 国产一区免费| 日本sm残虐另类| 欧美又粗又大又长| 亚洲美女久久久| 96sao精品免费视频观看| 看全色黄大色大片| 99re视频精品| 亚洲无码精品在线观看| 久久久久久久久91| jvid福利在线一区二区| 国产成人av免费观看| 欧美日韩免费在线观看| 日本高清中文字幕在线| 国产厕所精品在线观看| 日韩不卡一区二区| 久久久久亚洲av无码专区 | 国产精品亚洲欧美| 一级免费黄色录像| 日韩精品在线观看一区| 小说区图片区亚洲| 日本精品免费在线观看| 综合久久一区二区三区| 亚洲av电影一区| 亚洲中国色老太| 免费看欧美美女黄的网站| 久久久久亚洲av成人片| 中文字幕精品在线视频| 久久99精品国产自在现线| 免费黄频在线观看| 色中色一区二区| 97人人在线视频|