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

Gateway 網(wǎng)關(guān)坑我!被這個(gè)404 問(wèn)題折騰了一年?

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
同事使用的是?SpringCloud Gateway 3.0.1?+?JDK8,整合了?Nacos?做動(dòng)態(tài)路由配置。問(wèn)題是:每次修改 Nacos 的路由配置后,網(wǎng)關(guān)的 API 請(qǐng)求就會(huì)出現(xiàn) 404 錯(cuò)誤,但重啟網(wǎng)關(guān)后又能恢復(fù)正常。

最近同事找我?guī)兔ε挪橐粋€(gè)"詭異"的 Bug,說(shuō)困擾了他們一年多一直沒(méi)解決。我接手后花了一些時(shí)間定位到了問(wèn)題根源,今天就來(lái)跟大家分享一下這個(gè)問(wèn)題的排查過(guò)程和解決方案。

問(wèn)題描述

同事使用的是 SpringCloud Gateway 3.0.1 + JDK8,整合了 Nacos 做動(dòng)態(tài)路由配置。問(wèn)題是:每次修改 Nacos 的路由配置后,網(wǎng)關(guān)的 API 請(qǐng)求就會(huì)出現(xiàn) 404 錯(cuò)誤,但重啟網(wǎng)關(guān)后又能恢復(fù)正常。

聽到這個(gè)問(wèn)題,我的第一反應(yīng)是:Nacos 配置更新后,網(wǎng)關(guān)的緩存數(shù)據(jù)可能沒(méi)有及時(shí)更新。帶著這個(gè)猜想,我開始深入排查。

環(huán)境準(zhǔn)備

首先準(zhǔn)備了 3 個(gè)后端服務(wù)實(shí)例,端口分別為 81031204012041,在 Nacos 中配置了對(duì)應(yīng)的網(wǎng)關(guān)路由:xiaofu-8103xiaofu-12040xiaofu-12041,并將它們放在同一個(gè)權(quán)重組 xiaofu-group 中,實(shí)現(xiàn)基于權(quán)重的負(fù)載均衡。

- id: xiaofu-8103
  uri: http://127.0.0.1:8103/
  predicates:
    - Weight=xiaofu-group, 2
    - Path=/test/version1/**
  filters:
    - RewritePath=/test/version1/(?<segment>.*),/$\{segment}
- id: xiaofu-12040
  uri: http://127.0.0.1:12040/
  predicates:
    - Weight=xiaofu-group, 1
    - Path=/test/version1/**
  filters:
    - RewritePath=/test/version1/(?<segment>.*),/$\{segment}
- id: xiaofu-12041
  uri: http://127.0.0.1:12041/
  predicates:
    - Weight=xiaofu-group, 2
    - Path=/test/version1/**
  filters:
    - RewritePath=/test/version1/(?<segment>.*),/$\{segment}

使用 JMeter 進(jìn)行持續(xù)請(qǐng)求測(cè)試,為了便于日志追蹤,給每個(gè)請(qǐng)求參數(shù)都添加了隨機(jī)數(shù)。

圖片圖片

準(zhǔn)備完成后啟動(dòng) JMeter 循環(huán)請(qǐng)求,觀察到三個(gè)實(shí)例都有日志輸出,說(shuō)明網(wǎng)關(guān)的負(fù)載均衡功能正常。

圖片圖片

問(wèn)題排查

為了獲取更詳細(xì)的日志信息,我將網(wǎng)關(guān)的日志級(jí)別調(diào)整為 TRACE

啟動(dòng) JMeter 后,隨機(jī)修改三個(gè)實(shí)例的路由屬性(uri、port、predicates、filters),請(qǐng)求沒(méi)有出現(xiàn)報(bào)錯(cuò),網(wǎng)關(guān)控制臺(tái)也顯示了更新后的路由屬性,說(shuō)明 Nacos 配置變更已成功同步到網(wǎng)關(guān)。

圖片圖片

接下來(lái)嘗試去掉一個(gè)實(shí)例 xiaofu-12041,這時(shí)發(fā)現(xiàn) JMeter 請(qǐng)求開始出現(xiàn) 404 錯(cuò)誤,成功復(fù)現(xiàn)問(wèn)題!

圖片圖片

查看網(wǎng)關(guān)控制臺(tái)日志時(shí),驚奇地發(fā)現(xiàn)已刪除的實(shí)例 xiaofu-12041 的路由配置仍然存在,甚至還被選中(chosen)處理請(qǐng)求。

問(wèn)題根源找到了:雖然 Nacos 中刪除了實(shí)例路由配置,但網(wǎng)關(guān)在實(shí)際負(fù)載均衡時(shí)仍然使用舊的路由數(shù)據(jù)。

圖片圖片

繼續(xù)深入排查,發(fā)現(xiàn)在路由的權(quán)重信息(Weights attr)中也存在舊的路由數(shù)據(jù)。

至此基本確定問(wèn)題:在計(jì)算實(shí)例權(quán)重和負(fù)載均衡時(shí),網(wǎng)關(guān)使用了陳舊的緩存數(shù)據(jù)。

圖片圖片

源碼分析

通過(guò)分析源碼,發(fā)現(xiàn)了一個(gè)專門計(jì)算權(quán)重的過(guò)濾器 WeightCalculatorWebFilter。它內(nèi)部維護(hù)了一個(gè) groupWeights 變量來(lái)存儲(chǔ)路由權(quán)重信息。

當(dāng)配置變更事件發(fā)生時(shí),會(huì)執(zhí)行 addWeightConfig(WeightConfig weightConfig) 方法來(lái)添加權(quán)重配置。

@Override
public void onApplicationEvent(ApplicationEvent event) {
    if (event instanceof PredicateArgsEvent) {
        handle((PredicateArgsEvent) event);
    }
    else if (event instanceof WeightDefinedEvent) {
        addWeightConfig(((WeightDefinedEvent) event).getWeightConfig());
    }
    else if (event instanceof RefreshRoutesEvent && routeLocator != null) {
        if (routeLocatorInitialized.compareAndSet(false, true)) {
            routeLocator.ifAvailable(locator -> locator.getRoutes().blockLast());
        }
        else {
            routeLocator.ifAvailable(locator -> locator.getRoutes().subscribe());
        }
    }

}

addWeightConfig 方法的注釋明確說(shuō)明:該方法僅創(chuàng)建新的 GroupWeightConfig,而不進(jìn)行修改。

這意味著它只能新建或覆蓋路由權(quán)重,無(wú)法清理已刪除的路由權(quán)重信息。

void addWeightConfig(WeightConfig weightConfig) {
        String group = weightConfig.getGroup();
        GroupWeightConfig config;
        // only create new GroupWeightConfig rather than modify
        // and put at end of calculations. This avoids concurency problems
        // later during filter execution.
        if (groupWeights.containsKey(group)) {
            config = new GroupWeightConfig(groupWeights.get(group));
        }
        else {
            config = new GroupWeightConfig(group);
        }


        final AtomicInteger index = new AtomicInteger(0);
  ....省略.....

        if (log.isTraceEnabled()) {
            log.trace("Recalculated group weight config " + config);
        }
        // only update after all calculations
        groupWeights.put(group, config);
    }

解決方案

找到問(wèn)題根源后,解決方案就清晰了。

開始我懷疑可能是springcloud gateway 版本問(wèn)題,將版本升級(jí)到了4.1.0,但結(jié)果還是存在這個(gè)問(wèn)題。

圖片圖片

看來(lái)只能手動(dòng)更新緩存解決了,需要監(jiān)聽 Nacos 路由配置變更事件,獲取最新路由配置,并更新 groupWeights 中的權(quán)重?cái)?shù)據(jù)。

以下是實(shí)現(xiàn)的解決方案代碼:

@Slf4j
@Configuration
public class WeightCacheRefresher {

    @Autowired
    private WeightCalculatorWebFilter weightCalculatorWebFilter;

    @Autowired
    private RouteDefinitionLocator routeDefinitionLocator;

    @Autowired
    private ApplicationEventPublisher publisher;

    /**
     * 監(jiān)聽路由刷新事件,同步更新權(quán)重緩存
     */
    @EventListener(RefreshRoutesEvent.class)
    public void onRefreshRoutes() {
        log.info("檢測(cè)到路由刷新事件,準(zhǔn)備同步更新權(quán)重緩存");
        syncWeightCache();
    }

    /**
     * 同步權(quán)重緩存與當(dāng)前路由配置
     */
    public void syncWeightCache() {
        try {
            // 獲取 groupWeights 字段
            Field groupWeightsField = WeightCalculatorWebFilter.class.getDeclaredField("groupWeights");
            groupWeightsField.setAccessible(true);

            // 獲取當(dāng)前的 groupWeights 值
            @SuppressWarnings("unchecked")
            Map<String, Object> groupWeights = (Map<String, Object>) groupWeightsField.get(weightCalculatorWebFilter);

            if (groupWeights == null) {
                log.warn("未找到 groupWeights 緩存");
                return;
            }

            log.info("當(dāng)前 groupWeights 緩存: {}", groupWeights.keySet());

            // 獲取當(dāng)前所有路由的權(quán)重組和路由ID
            final Set<String> currentRouteIds = new HashSet<>();
            final Map<String, Map<String, Integer>> currentGroupRouteWeights = new HashMap<>();

            routeDefinitionLocator.getRouteDefinitions()
                    .collectList()
                    .subscribe(definitions -> {
                        definitions.forEach(def -> {
                            currentRouteIds.add(def.getId());

                            def.getPredicates().stream()
                                    .filter(predicate -> predicate.getName().equals("Weight"))
                                    .forEach(predicate -> {
                                        Map<String, String> args = predicate.getArgs();
                                        String group = args.getOrDefault("_genkey_0", "unknown");
                                        int weight = Integer.parseInt(args.getOrDefault("_genkey_1", "0"));

                                        // 記錄每個(gè)組中當(dāng)前存在的路由及其權(quán)重
                                        currentGroupRouteWeights.computeIfAbsent(group, k -> new HashMap<>())
                                                .put(def.getId(), weight);
                                    });
                        });

                        log.info("當(dāng)前路由配置中的路由ID: {}", currentRouteIds);
                        log.info("當(dāng)前路由配置中的權(quán)重組: {}", currentGroupRouteWeights);

                        // 檢查每個(gè)權(quán)重組,移除不存在的路由,更新權(quán)重變化的路由
                        Set<String> groupsToRemove = new HashSet<>();
                        Set<String> groupsToUpdate = new HashSet<>();

                        for (String group : groupWeights.keySet()) {
                            if (!currentGroupRouteWeights.containsKey(group)) {
                                // 整個(gè)權(quán)重組不再存在
                                groupsToRemove.add(group);
                                log.info("權(quán)重組 [{}] 不再存在于路由配置中,將被移除", group);
                                continue;
                            }

                            // 獲取該組中當(dāng)前配置的路由ID和權(quán)重
                            Map<String, Integer> configuredRouteWeights = currentGroupRouteWeights.get(group);

                            // 獲取該組中緩存的權(quán)重配置
                            Object groupWeightConfig = groupWeights.get(group);

                            try {
                                // 獲取 weights 字段
                                Field weightsField = groupWeightConfig.getClass().getDeclaredField("weights");
                                weightsField.setAccessible(true);

                                @SuppressWarnings("unchecked")
                                LinkedHashMap<String, Integer> weights = (LinkedHashMap<String, Integer>) weightsField.get(groupWeightConfig);

                                // 找出需要移除的路由ID
                                Set<String> routesToRemove = weights.keySet().stream()
                                        .filter(routeId -> !configuredRouteWeights.containsKey(routeId))
                                        .collect(Collectors.toSet());

                                // 找出權(quán)重發(fā)生變化的路由ID
                                Set<String> routesWithWeightChange = new HashSet<>();
                                for (Map.Entry<String, Integer> entry : weights.entrySet()) {
                                    String routeId = entry.getKey();
                                    Integer cachedWeight = entry.getValue();

                                    if (configuredRouteWeights.containsKey(routeId)) {
                                        Integer configuredWeight = configuredRouteWeights.get(routeId);
                                        if (!cachedWeight.equals(configuredWeight)) {
                                            routesWithWeightChange.add(routeId);
                                            log.info("路由 [{}] 的權(quán)重從 {} 變?yōu)?{}", routeId, cachedWeight, configuredWeight);
                                        }
                                    }
                                }

                                // 找出新增的路由ID
                                Set<String> newRoutes = configuredRouteWeights.keySet().stream()
                                        .filter(routeId -> !weights.containsKey(routeId))
                                        .collect(Collectors.toSet());

                                if (!routesToRemove.isEmpty() || !routesWithWeightChange.isEmpty() || !newRoutes.isEmpty()) {
                                    log.info("權(quán)重組 [{}] 中有變化:刪除 {},權(quán)重變化 {},新增 {}",
                                            group, routesToRemove, routesWithWeightChange, newRoutes);

                                    // 如果有任何變化,我們將重新計(jì)算整個(gè)組的權(quán)重
                                    groupsToUpdate.add(group);
                                }

                                // 首先,移除需要?jiǎng)h除的路由
                                for (String routeId : routesToRemove) {
                                    weights.remove(routeId);
                                }

                                // 如果權(quán)重組中沒(méi)有剩余路由,則移除整個(gè)組
                                if (weights.isEmpty()) {
                                    groupsToRemove.add(group);
                                    log.info("權(quán)重組 [{}] 中沒(méi)有剩余路由,將移除整個(gè)組", group);
                                }
                            } catch (Exception e) {
                                log.error("處理權(quán)重組 [{}] 時(shí)出錯(cuò)", group, e);
                            }
                        }

                        // 移除不再需要的權(quán)重組
                        for (String group : groupsToRemove) {
                            groupWeights.remove(group);
                            log.info("已移除權(quán)重組: {}", group);
                        }

                        // 更新需要重新計(jì)算的權(quán)重組
                        for (String group : groupsToUpdate) {
                            try {
                                // 獲取該組中當(dāng)前配置的路由ID和權(quán)重
                                Map<String, Integer> configuredRouteWeights = currentGroupRouteWeights.get(group);

                                // 移除舊的權(quán)重組配置
                                groupWeights.remove(group);
                                log.info("已移除權(quán)重組 [{}] 以便重新計(jì)算", group);

                                // 為每個(gè)路由創(chuàng)建 WeightConfig 并調(diào)用 addWeightConfig 方法
                                Method addWeightConfigMethod = WeightCalculatorWebFilter.class.getDeclaredMethod("addWeightConfig", WeightConfig.class);
                                addWeightConfigMethod.setAccessible(true);

                                for (Map.Entry<String, Integer> entry : configuredRouteWeights.entrySet()) {
                                    String routeId = entry.getKey();
                                    Integer weight = entry.getValue();

                                    WeightConfig weightConfig = new WeightConfig(routeId);
                                    weightConfig.setGroup(group);
                                    weightConfig.setWeight(weight);

                                    addWeightConfigMethod.invoke(weightCalculatorWebFilter, weightConfig);
                                    log.info("為路由 [{}] 添加權(quán)重配置:組 [{}],權(quán)重 {}", routeId, group, weight);
                                }
                            } catch (Exception e) {
                                log.error("重新計(jì)算權(quán)重組 [{}] 時(shí)出錯(cuò)", group, e);
                            }
                        }

                        log.info("權(quán)重緩存同步完成,當(dāng)前緩存的權(quán)重組: {}", groupWeights.keySet());
                    });

        } catch (Exception e) {
            log.error("同步權(quán)重緩存失敗", e);
        }
    }
}

如此一來(lái)每次更新nacos路由配置,就會(huì)監(jiān)聽到配置變更事件,進(jìn)而用最新的實(shí)例數(shù)據(jù)來(lái)更新本地的路由權(quán)重?cái)?shù)據(jù)。

網(wǎng)上找一圈并沒(méi)發(fā)現(xiàn)官方的修改意見,可能是咱們使用方式不對(duì)導(dǎo)致的,要不如此明顯的BUG早就有人改了吧!

責(zé)任編輯:武曉燕 來(lái)源: 程序員小富
相關(guān)推薦

2025-02-18 15:17:59

2020-06-09 16:22:26

戴爾

2016-05-24 10:40:32

NodeJS總結(jié)

2018-09-17 11:10:06

2022-05-09 17:12:32

元宇宙技術(shù)生活

2020-04-14 10:06:20

微服務(wù)Netflix語(yǔ)言

2018-09-13 10:42:00

工具代碼機(jī)器學(xué)習(xí)

2009-07-03 10:15:38

2025-03-24 08:00:00

數(shù)據(jù)庫(kù)開發(fā)代碼

2013-05-30 01:16:36

工作總結(jié)自由職業(yè)工作經(jīng)驗(yàn)

2023-07-11 08:39:16

React前端

2015-03-09 17:49:40

SDN

2025-09-16 08:17:28

CSSJavaScrip前端

2022-01-03 20:13:08

Gointerface 面試

2019-07-15 09:21:45

技術(shù)思維阿里

2015-11-03 11:13:01

技術(shù)轉(zhuǎn)型心得

2019-07-09 16:00:18

阿里數(shù)據(jù)庫(kù)技術(shù)思維

2020-07-20 09:40:49

MySQLBUG數(shù)據(jù)庫(kù)

2018-01-31 09:54:48

華為高青縣智慧城市

2020-04-02 14:33:42

MySQLBUG解決方案
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本在线观看视频一区| 亚洲一区三区| 免费精品一区二区| 偷偷www综合久久久久久久| 日韩一区二区视频在线观看| 少妇高潮毛片色欲ava片| 黄网站在线观看| 黄色小说综合网站| 91精品国产91久久| 中文字幕无码日韩专区免费| 精品伊人久久久| 欧洲色大大久久| 狠狠精品干练久久久无码中文字幕 | 国内精品视频在线观看| 欧美岛国在线观看| 九色91popny| 岛国av在线播放| 国产精品国产三级国产普通话99| 国产日韩在线一区二区三区| 在线免费看91| 久久一区视频| 久久全国免费视频| 国产一二三区精品| 欧美人与物videos另类xxxxx| 制服丝袜成人动漫| 久久久精品三级| 蜜乳av一区| 中文字幕在线不卡视频| 欧美一区二区福利| 人妻va精品va欧美va| 国产美女一区二区| 国产日本欧美一区二区三区在线| 国产欧美一区二区三区在线看蜜臂| 牛夜精品久久久久久久99黑人| 国产亚洲欧美日韩美女| av无码一区二区三区| 日韩欧美中文字幕一区二区三区| 欧美在线高清视频| 国产中文字幕免费观看| 麻豆蜜桃在线观看| 午夜久久福利影院| 美脚丝袜脚交一区二区| 26uuu亚洲电影在线观看| 国产精品九色蝌蚪自拍| 先锋影音网一区| 精品电影在线| 久久久久国产一区二区三区四区 | 成人av二区| 亚洲精品少妇网址| 国产在线观看无码免费视频| 国产精品美女在线观看直播| 欧美电影精品一区二区| 久久久久久久久久久久国产精品| 成人污污视频| 日韩一区二区视频| 中文字幕亚洲日本| 91成人福利| 精品国产1区二区| 免费看黄色片的网站| 9l亚洲国产成人精品一区二三| 欧美一区二区三区喷汁尤物| 一级全黄裸体片| 成人精品动漫一区二区三区| 欧美不卡一二三| 精品久久久久久无码人妻| 粉嫩av一区二区| 亚洲国产精品久久91精品| 波多野结衣视频播放| 牛牛影视久久网| 亚洲一级一级97网| 精品熟妇无码av免费久久| 日韩a一区二区| 久久精品中文字幕电影| 青青草手机视频在线观看| 好吊视频一区二区三区四区| 91精品国产91久久久久久久久| 国产99久久久| 久久99国产精品久久| 亚洲一区国产精品| 十八禁一区二区三区| 国产亚洲婷婷免费| 国产系列第一页| 草美女在线观看| 在线免费观看日韩欧美| 人人爽人人爽av| 好吊妞视频这里有精品 | 香蕉视频免费在线播放| 亚洲美女免费在线| 国内自拍在线观看| 一区在线不卡| 亚洲国产精品视频在线观看 | 一区二区久久久| 午夜精品久久久久久久无码| 99久久精品一区二区成人| 日韩一区二区三区在线视频| 最新中文字幕视频| 亚洲有吗中文字幕| 9.1国产丝袜在线观看| 中文在线观看av| 成人高清视频免费观看| 亚洲午夜精品久久| 麻豆蜜桃在线观看| 欧美一级生活片| 亚洲第一香蕉网| 综合视频在线| 国产精品夫妻激情| 国产 日韩 欧美 精品| 国产亚洲一区二区三区在线观看| 一级黄色片播放| 51一区二区三区| 亚洲大胆人体在线| 免费成人美女女在线观看| 在线免费高清一区二区三区| 成人黄色av网| 日本午夜在线| 亚洲一区自拍偷拍| 五月天丁香花婷婷| 精品久久视频| 欧美亚洲日本网站| 亚洲AV无码成人片在线观看| 国产精品夫妻自拍| 国产一区二区视频免费在线观看| 色播一区二区| xxxxx91麻豆| 黄色av一区二区| 97se亚洲国产综合自在线不卡| 日本老太婆做爰视频| h1515四虎成人| 亚洲欧美变态国产另类| 日韩久久久久久久久| 国产综合久久久久久久久久久久| 日韩高清三级| 中文字幕一区久| 日韩精品视频中文在线观看| 久久久精品人妻一区二区三区四| 国产乱子伦一区二区三区国色天香| 日韩动漫在线观看| 日韩网站中文字幕| 亚洲欧美激情一区| 国产一级一级国产| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 日本wwwxxxx| 一区二区三区 在线观看视频| 亚洲五月激情网| 在线成人直播| 91最新在线免费观看| 精品美女在线观看视频在线观看| 欧美日韩一区二区三区高清| 天天干天天操天天拍| 蜜臀av性久久久久蜜臀aⅴ| 午夜精品一区二区在线观看的| 精品欧美日韩精品| 在线亚洲午夜片av大片| 中文字幕在线观看第二页| 国产精品久久久久久久裸模| 色一情一区二区| 亚洲成人精品| 97自拍视频| 黑人极品ⅴideos精品欧美棵| 亚洲а∨天堂久久精品9966| 好吊操这里只有精品| 99国内精品久久| 国产无套内射久久久国产| 香蕉视频一区二区三区| 国产成人在线一区| 91福利在线视频| 欧美一区二区在线观看| 免费在线视频观看| 久久综合国产精品| 在线观看免费黄网站| 中文精品久久| 国产欧美一区二区视频| 欧美大电影免费观看| 在线观看日韩视频| 99久久精品无免国产免费| 一区二区三区毛片| 国产高清自拍视频| 另类小说视频一区二区| 久久久久亚洲av无码专区喷水| 亚洲小说春色综合另类电影| 2018国产精品视频| 在线日本中文字幕| 精品免费99久久| 中文字幕手机在线视频| 亚洲欧美视频一区| 国产精品无码在线| 免费成人美女在线观看| a级片一区二区| 视频一区中文| av日韩免费电影| 日韩欧美另类一区二区| 久久夜色撩人精品| 免费在线稳定资源站| 91精品麻豆日日躁夜夜躁| 五月天婷婷综合网| 亚洲欧洲综合另类在线| 亚洲第一成人网站| 国产精品乡下勾搭老头1| 欧在线一二三四区| 狠狠入ady亚洲精品经典电影| 亚洲成人a**址| 国产精品传媒| 成人福利在线观看| 成人性生活av| 国内精品久久久久影院优 | 国产巨乳在线观看| 日韩人在线观看| 久久久美女视频| 国产精品青草久久| 国产熟妇久久777777| 国产成人av网站| 怡红院亚洲色图| 欧美专区在线| 拔插拔插海外华人免费| 午夜激情久久| 色一情一乱一伦一区二区三区丨| 久久porn| 亚洲字幕在线观看| 黄色成人小视频| 国产精品jizz在线观看麻豆| av在线不卡免费| 九色成人免费视频| 精品国产白色丝袜高跟鞋| 国产亚洲一区精品| 欧美捆绑视频| 日韩精品高清在线| 人人妻人人澡人人爽人人欧美一区 | 亚洲怡红院av| 欧美在线制服丝袜| 三级视频在线观看| 精品国产乱码久久久久酒店 | 国产日韩综合一区二区性色av| 在线免费日韩片| 亚洲3p在线观看| 超碰在线资源| 久久久免费精品| 免费网站在线观看人| 欧美精品在线网站| 超碰在线caoporn| 超碰97人人做人人爱少妇| 嫩草在线视频| 菠萝蜜影院一区二区免费| 亚洲麻豆精品| 久久精品视频免费播放| 暖暖日本在线观看| 久久中文字幕在线| 中文字幕伦理免费在线视频 | 中日韩脚交footjobhd| 91高潮精品免费porn| 一个人www视频在线免费观看| 69精品小视频| 在线视频cao| 国产精品96久久久久久又黄又硬 | 色先锋aa成人| 国产精品自拍第一页| 在线影院国内精品| 亚洲天堂自拍偷拍| 51精品国自产在线| 精品人妻一区二区三区浪潮在线| 精品欧美乱码久久久久久| 午夜性色福利视频| 国产亚洲精品一区二555| 中文字幕日本在线| 久久精品中文字幕电影| 激情影院在线| 4444欧美成人kkkk| 亚洲精品粉嫩美女一区| 成人欧美一区二区三区在线湿哒哒 | 国产在线一在线二| 丝袜亚洲另类欧美重口| 国产区在线观看| 久久久久久国产| 性高爱久久久久久久久| 国产日韩欧美成人| 草草视频在线一区二区| 茄子视频成人在线观看 | 国产人成一区二区三区影院| 蜜桃av免费观看| 亚洲综合免费观看高清完整版在线 | 欧美日韩免费观看中文| 黄色一区二区视频| 日韩欧美国产麻豆| 国产综合视频一区二区三区免费| 久久天天躁狠狠躁老女人| 成人观看网址| 国产在线98福利播放视频| 成人另类视频| 先锋影音一区二区三区| 亚洲高清在线| 777视频在线| 成人avav影音| 91动漫免费网站| 亚洲大片在线观看| 国产一区二区在线视频观看| 亚洲精品在线观看视频| 91在线播放网站| 久久久亚洲天堂| 日韩专区视频| 国内一区二区三区在线视频| 91久久国产| 日本黄网站免费| 豆国产96在线|亚洲| 欧美成人短视频| 亚洲动漫第一页| 国产视频在线观看免费| 亚洲欧洲中文天堂| heyzo高清中文字幕在线| 国产日韩欧美中文| 免费av一区二区三区四区| 91免费国产精品| 久久成人久久爱| 极品粉嫩小仙女高潮喷水久久| 亚洲精选一二三| 一个人看的www日本高清视频| 亚洲精品一区二区在线| 人交獸av完整版在线观看| 国产美女直播视频一区| 亚洲自拍电影| 男女激情无遮挡| 国产电影精品久久禁18| 欧美a级片免费看| 在线视频中文字幕一区二区| 亚洲人在线观看视频| 欧美精品久久久久久久久| **国产精品| 亚洲欧美丝袜| 视频在线观看国产精品| 大地资源二中文在线影视观看| 亚洲午夜免费视频| www.色亚洲| 欧美日本啪啪无遮挡网站| 成人在线视频国产| 宅男av一区二区三区| 免费成人av资源网| 亚洲黄色网址大全| 欧美专区日韩专区| 国产高清在线| 国产精品18久久久久久麻辣| 日韩欧美影院| 播放灌醉水嫩大学生国内精品| 成人av网站在线观看| 久久久久国产精品夜夜夜夜夜| 日韩午夜精品电影| 羞羞网站在线免费观看| 3d动漫啪啪精品一区二区免费| 欧美在线视屏| 国产大尺度视频| 亚洲国产成人av好男人在线观看| 成人午夜免费在线观看| 久久久久久国产精品| 国产精品男女| av免费中文字幕| 国产偷v国产偷v亚洲高清| 国产精品露脸视频| 久久久国产精品免费| 中文字幕日韩在线| 少妇人妻大乳在线视频| 99久久精品免费看| 无码人妻精品一区二区50| 揄拍成人国产精品视频| 欧美97人人模人人爽人人喊视频| 伊人情人网综合| 国产成都精品91一区二区三 | 日本道在线观看一区二区| 国产尤物视频在线| 国产免费成人av| 欧美激情1区2区3区| 国产二级一片内射视频播放| 精品久久久香蕉免费精品视频| 黄色电影免费在线看| 国产精品美乳在线观看| 亚洲精品成人无限看| zjzjzjzjzj亚洲女人| 色综合久久88色综合天天免费| 成年人视频在线看| 99国产在线| 亚洲欧美视频| 影音先锋男人资源在线观看| 日韩欧美综合在线| 悠悠资源网亚洲青| 这里只有精品66| 99精品国产热久久91蜜凸| 最近中文字幕av| 欧美精品在线免费观看| 久久成人高清| 特黄特色免费视频| 色婷婷av一区二区三区之一色屋| 二区三区四区高清视频在线观看| 久久99精品久久久久子伦 | 成人激情黄色网| 亚洲区国产区| 少妇视频一区二区| 亚洲国产精品成人va在线观看| 日本国产亚洲| 黄色国产一级视频| 国产精品美女久久久久久久久| 亚洲女人18毛片水真多| 国产精品女人久久久久久| 999在线观看精品免费不卡网站| 国产精品麻豆一区|