精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一区二区在线免费看| 精品乱码一区二区三区| 九九这里只有精品视频| 成人在线tv视频| 欧美又粗又大又爽| 97av中文字幕| 国产三级在线| 国产高清精品在线| 国产成人午夜视频网址| 久久精品99国产精| 日本一二区不卡| 亚洲国产天堂网精品网站| 九九九在线观看视频| 久草在线视频资源| 国产精品视频麻豆| 噜噜噜噜噜久久久久久91| 国产精品一区二区人人爽| 性色av一区二区怡红| 欧美黑人视频一区| 神马午夜精品91| 精品日韩毛片| 亚洲第一页中文字幕| 午夜免费福利视频在线观看| 免费高潮视频95在线观看网站| 成人免费在线视频| 欧美一区二区三区精美影视| 亚洲成人77777| 九九国产精品视频| 国产精品成熟老女人| 色婷婷av国产精品| 欧美日韩mv| 精品激情国产视频| 一级黄色片网址| 久久91麻豆精品一区| 亚洲成人网在线| 中文字幕第10页| 四虎影视精品永久在线观看| 色av一区二区| 成年人视频在线免费| 新版的欧美在线视频| 亚洲狠狠爱一区二区三区| 欧美精品久久96人妻无码| 在线视频1区2区| 欧美激情在线一区二区三区| 欧美大香线蕉线伊人久久国产精品| 亚洲av无码片一区二区三区 | 国产孕妇孕交大片孕| 首页欧美精品中文字幕| 日本道色综合久久影院| xxxx.国产| 先锋影音久久久| 国产成人avxxxxx在线看| 国产剧情在线视频| 狂野欧美一区| 国产精品日日摸夜夜添夜夜av| 男人天堂视频在线| 日本女优在线视频一区二区| 国产精品9999| 糖心vlog精品一区二区| 蜜臀av一区二区在线观看| 国产免费一区二区三区在线能观看| 亚洲中文无码av在线| 久久精品99久久久| 91久久精品国产| www.五月婷婷| 99精品视频在线观看| 麻豆精品传媒视频| 丁香在线视频| 亚洲三级在线免费观看| 天天想你在线观看完整版电影免费| а√资源新版在线天堂| 亚洲一区在线视频| 国产精品后入内射日本在线观看| 色资源二区在线视频| 欧美熟乱第一页| 久国产精品视频| japanese色系久久精品| 日韩精品极品视频| 欧美a在线播放| 一区二区三区中文| 欧美一区二区.| 瑟瑟视频在线免费观看| 国产麻豆精品视频| 精品国产中文字幕| 日本中文字幕在线2020| 久久国产小视频| 日韩视频永久免费观看| 国产中文字幕免费| 视频一区在线视频| 国产福利精品av综合导导航| 国产美女精品视频国产| 成人午夜电影网站| 亚洲无玛一区| 僵尸再翻生在线观看免费国语| 欧洲亚洲国产日韩| 特黄特色免费视频| 色狮一区二区三区四区视频| 欧美激情亚洲自拍| 中文字幕在线网站| 99久久99久久精品免费观看| 中文字幕一区二区三区精彩视频| 91美女主播在线视频| 在线观看视频一区二区欧美日韩| 免费看91视频| 色综合天天爱| 51精品在线观看| 国产成人久久精品77777综合 | 丁香花高清在线观看完整版| 色妹子一区二区| 国产av一区二区三区传媒| 国产中文精品久高清在线不| 欧美多人乱p欧美4p久久| 国产日韩久久久| 99re在线精品| 日本男女交配视频| 四虎国产精品免费久久| 亚洲天堂开心观看| 尤物视频在线观看国产| 国产原创一区二区| 亚洲7777| 久久久一本精品| 亚洲精品在线电影| 青娱乐免费在线视频| 美女脱光内衣内裤视频久久网站| 黄色99视频| 午夜在线播放| 91久久精品午夜一区二区| 欧美日韩一区二区区| 欧美超碰在线| 国产精品一区二区三区久久久 | 91在线看国产| 极品粉嫩国产18尤物| 精品久久国产一区| 精品国产一区二区三区在线观看| 亚洲综合图片网| av一区二区久久| 成人在线国产视频| www.豆豆成人网.com| 久久成人亚洲精品| 国产麻豆免费视频| 18成人在线观看| 亚洲成人精品久久久| 无套内谢丰满少妇中文字幕| 日韩欧美网址| 国产在线视频不卡| 日本天堂在线观看| 欧美军同video69gay| 韩国一级黄色录像| 久久国产精品99精品国产| 亚洲午夜精品久久久中文影院av| 91成人抖音| 最近2019年手机中文字幕 | 少妇av在线| 精品国产一二三区| 国产乡下妇女做爰毛片| av在线免费不卡| 男人日女人下面视频| 日韩大胆成人| 日韩av免费在线| 高清在线观看av| 欧美日本国产一区| 免费在线视频观看| 不卡免费追剧大全电视剧网站| 五十路熟女丰满大屁股| 亚洲老女人视频免费| 国产成人一区二| 黄色在线免费网站| 精品日韩一区二区三区免费视频| 国产亚洲欧美精品久久久久久 | 欧美一区二区在线不卡| 欧美成人综合色| 99视频超级精品| 青青在线免费观看视频| 91麻豆国产自产在线观看亚洲| 成人在线一区二区| 大香伊人中文字幕精品| 精品无人区太爽高潮在线播放| 中文字幕在线观看视频免费| 亚洲欧洲精品一区二区三区不卡| 亚洲精品久久一区二区三区777| 午夜在线一区| 日本女人高潮视频| 日韩系列在线| 91久久久在线| 精品极品在线| 日韩中文字幕国产| 天堂在线资源8| 欧美熟乱第一页| 国产午夜视频在线| 中文字幕成人在线观看| av电影中文字幕| 日本亚洲最大的色成网站www| 精品国产一区二区三区在线| 欧洲亚洲视频| 91免费看片网站| 亚洲最新无码中文字幕久久| 久久精品2019中文字幕| 天堂中文字幕在线| 日韩一区二区三区电影| 亚洲性猛交富婆| 亚洲福利国产精品| 免费黄色国产视频| 91丨九色丨蝌蚪丨老版| 婷婷中文字幕在线观看| 日韩在线播放一区二区| 99在线观看视频免费| 四虎成人av| 免费在线国产精品| 亚洲精品黑牛一区二区三区| 国产精品自在线| www.com.cn成人| 国内精品久久久久| 岛国成人毛片| 色婷婷**av毛片一区| 欧美91精品久久久久国产性生爱| 日韩欧美国产电影| 一卡二卡在线视频| 91久久线看在观草草青青| 日韩毛片在线视频| 亚洲国产精品自拍| 欧美日韩精品亚洲精品| 国产精品乱码人人做人人爱 | 亚洲欧洲美洲综合色网| 精品无码在线观看| 26uuu亚洲综合色欧美 | 国产精品美日韩| 久久精品成人av| 91亚洲精品一区二区乱码| 国产人妖在线观看| 国产精选一区二区三区| www.成人黄色| 黄页视频在线91| 亚洲xxx在线观看| 久久精品国产网站| 激情视频免费网站| 日本女人一区二区三区| 日韩在线xxx| 久久一区激情| 日本成人在线免费视频| 亚洲女同在线| 欧美韩国日本在线| 丝袜美腿亚洲一区| 国产视频一区二区视频| 丝袜a∨在线一区二区三区不卡| 91专区在线观看| 国产视频一区免费看| 日本日本19xxxⅹhd乱影响| 国产亚洲福利| 狠狠操精品视频| 欧美aⅴ一区二区三区视频| 五月婷婷狠狠操| 理论电影国产精品| 青青草久久伊人| 极品美女销魂一区二区三区 | 福利视频一二区| 亚洲美女色禁图| 免费日韩中文字幕| 奇米影视在线99精品| 一级黄色录像在线观看| 国产一二三精品| 97人妻精品一区二区三区免费 | 无码黑人精品一区二区| 亚洲人成精品久久久久| 欧美成人精品激情在线视频| 亚洲一级二级三级在线免费观看| 国产精品99精品无码视| 欧美日韩亚洲一区二区三区| 国产性生活视频| 欧美日本精品一区二区三区| 亚洲国产精品suv| 日韩精品欧美国产精品忘忧草| 黄色在线网站| 久久国产天堂福利天堂| 99在线视频影院| 国产精品美女在线| 涩爱av色老久久精品偷偷鲁| 蜜桃传媒视频第一区入口在线看| 成人羞羞在线观看网站| 国产91在线亚洲| 男女精品网站| 天美一区二区三区| 91亚洲精华国产精华精华液| 18啪啪污污免费网站| 亚洲一区二区三区小说| 亚洲 日本 欧美 中文幕| 4438成人网| 日本a一级在线免费播放| 日韩中文字幕视频在线| 精精国产xxxx视频在线野外| 成人夜晚看av| 希岛爱理av免费一区二区| 一区二区三区在线视频111| 99精品热6080yy久久| 久久久精品视频国产| 久久伊人中文字幕| 美女福利视频在线观看| 91国偷自产一区二区三区观看 | 亚洲精品三区| 久久精品国产99精品国产亚洲性色| 日韩电影在线视频| av7777777| 国产福利一区二区三区视频 | 一区二区三区欧美亚洲| 无码人妻熟妇av又粗又大| 欧美成人伊人久久综合网| √天堂资源地址在线官网| 97国产精品免费视频| 麻豆国产一区| 亚洲自拍偷拍二区| 久久先锋影音| 国产又黄又粗又猛又爽的视频| 亚洲视频一区二区在线| 懂色av蜜臀av粉嫩av分享吧最新章节| 日韩欧美卡一卡二| 精品国产99久久久久久| 国产精品第一第二| 亚洲调教一区| 国产免费观看高清视频| 国产精品123| 色天下一区二区三区| 日韩经典中文字幕在线观看| 久操免费在线| 国产精品久久久久一区二区| 菁菁伊人国产精品| 潘金莲一级淫片aaaaaa播放1| 久久一本综合频道| 大地资源二中文在线影视观看| 亚洲一区二区视频在线观看| aaa级黄色片| 日韩中文在线中文网在线观看| 色婷婷综合久久久中字幕精品久久| 国产麻豆日韩| 伊人久久亚洲美女图片| 中文字幕1区2区| 亚洲免费电影在线| 国产农村妇女毛片精品| 日韩一区二区三区xxxx| 日韩色性视频| eeuss中文| 国产精品亚洲一区二区三区妖精| 天天看天天摸天天操| 制服丝袜激情欧洲亚洲| 黄色网在线免费观看| 亚洲在线观看视频| 欧美黄免费看| 国产亚洲精品成人a| 亚洲一二三四在线| 天堂在线观看免费视频| 国产91精品久久久久久| 美女视频亚洲色图| 91猫先生在线| 国产亚洲精品bt天堂精选| 日本欧美www| 日韩一中文字幕| 一区二区三区日本视频| 一本色道久久88亚洲精品综合| 国产老女人精品毛片久久| 久久综合色综合| 日韩不卡中文字幕| 欧美与亚洲与日本直播| 亚洲AV无码成人精品一区| 国产成人免费在线视频| 日本三级免费看| 亚洲欧洲av一区二区| 欧美黄页在线免费观看| www.18av.com| 91在线视频免费观看| 中文在线最新版天堂| 精品中文字幕在线2019| 精品深夜福利视频| 天堂av在线网站| 玉足女爽爽91| 日韩欧美亚洲系列| 91精品久久久久久久久不口人| 午夜精彩国产免费不卡不顿大片| 中国极品少妇videossexhd| 日本韩国精品一区二区在线观看| 在线视频三区| 国产精品视频入口| 三级欧美在线一区| 色在线观看视频| 亚洲视频在线看| 亚洲视频国产精品| 欧美成人黄色网址| 亚洲综合色自拍一区| 懂色一区二区三区| 国产精品久久久久久久久婷婷| 日本伊人色综合网| 久久久久久久伊人| www.日韩不卡电影av| 国产一区二区三区不卡av| 亚洲天堂av线| 亚洲国产视频一区二区| 992tv免费直播在线观看| 韩日午夜在线资源一区二区 | 网友自拍区视频精品| 手机av在线网| 色综合激情五月| 男女视频在线| a级黄色片网站|