精品欧美一区二区三区在线观看 _久久久久国色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)

国产精品日产欧美久久久久| 亚洲在线网站| 日韩久久免费av| 国产人妻777人伦精品hd| 国产乱淫a∨片免费观看| 精品日本12videosex| 精品视频资源站| 大地资源第二页在线观看高清版| 日韩 国产 在线| 精品在线手机视频| 欧美一区二区三区人| 久操网在线观看| 国产小视频在线观看| 日本不卡的三区四区五区| 久久伊人精品天天| 波多野结衣先锋影音| 成人免费一区| 亚洲一区二区三区四区在线| 欧美日韩国产精品一卡| 亚洲无码久久久久| 1024成人| 日韩中文在线中文网三级| 任你躁av一区二区三区| 免费成人美女女| 欧美国产日韩a欧美在线观看| 日韩美女写真福利在线观看| 成人涩涩小片视频日本| 欧美wwwsss9999| 在线播放欧美女士性生活| 亚欧无线一线二线三线区别| www.久久ai| 久久综合九色综合97_久久久| 国产成人精品电影| 精品97人妻无码中文永久在线| 欧美亚洲色图校园春色| 欧美一区二区三区在线| 国产三级三级三级看三级| 欧美野外wwwxxx| 欧美韩国日本不卡| 精品久久久久久一区二区里番| 亚洲一区中文字幕永久在线| 亚洲欧洲日本一区二区三区| 久久精品电影网| 实拍女处破www免费看| 国产精品对白| 欧美成人vr18sexvr| 五月天婷婷亚洲| 在线精品亚洲欧美日韩国产| 亚洲专区一二三| 影音欧美亚洲| 国产高清免费av在线| 99久久精品国产导航| 亚洲综合在线做性| 91久久精品无码一区二区| 久久在线精品| 91精品国产乱码久久久久久久久 | 免费亚洲电影| 精品成人国产在线观看男人呻吟| 在线成人av电影| 国产三区四区在线观看| 久久综合色一综合色88| 精品蜜桃一区二区三区| 黄色av免费观看| 国产精品一卡二卡在线观看| 国产在线播放不卡| 一区二区视频网| 青草av.久久免费一区| 国产精品久久久亚洲| 国产成人精品777777| 亚洲综合国产| 欧美在线视频导航| www.国产com| 天堂蜜桃91精品| 日韩美女中文字幕| 无码人妻丰满熟妇区五十路| 免播放器亚洲| 欧美一区深夜视频| 日批视频免费在线观看| 日产欧产美韩系列久久99| 日本午夜在线亚洲.国产| √资源天堂中文在线| 免费欧美日韩| 国产精品成熟老女人| 最近日韩免费视频| 久久国产剧场电影| 亚洲自拍偷拍第一页| 成人1区2区3区| 波多野结衣在线aⅴ中文字幕不卡| caoporn国产精品免费公开| 农村少妇久久久久久久| 99久久国产综合色|国产精品| 成人免费视频视频在| 国产乱码精品一区二区三区精东 | av在线不卡网| 欧美日韩在线观看一区| a√资源在线| 亚洲欧洲精品天堂一级| 欧美日韩福利在线| 日韩欧美看国产| 7777女厕盗摄久久久| 日本性生活一级片| 久久99视频| 久久久国产成人精品| 国产真实的和子乱拍在线观看| 在线观看不卡| 国产成人精品一区| 国产三级自拍视频| 91日韩在线专区| 亚洲三区在线| 91禁在线看| 欧洲国内综合视频| 9191在线视频| 精品一区二区三区中文字幕老牛| 亚洲男人的天堂在线播放| 影音先锋男人看片资源| 亚洲小说欧美另类社区| 91国产一区在线| 亚洲天堂手机在线| 粉嫩13p一区二区三区| 亚洲精品久久区二区三区蜜桃臀| 欧美尤物美女在线| 午夜a成v人精品| 色播五月激情五月| 天堂在线精品| 欧美理论电影在线观看| 亚洲色成人www永久网站| 蜜桃视频第一区免费观看| 96sao精品视频在线观看| 桃花色综合影院| 久久久国产一区二区三区四区小说 | 91产国在线观看动作片喷水| 伊人网综合在线| 91伊人久久大香线蕉| 综合国产精品久久久| 国产精品迅雷| 日韩欧美色电影| 国产白丝一区二区三区| 亚洲一区二区免费看| 成人免费在线看片| 成人在线免费看片| 欧美性一区二区| aaaaa一级片| 激情亚洲网站| 91在线观看免费网站| 在线a免费看| 色嗨嗨av一区二区三区| 四虎国产精品永久免费观看视频| 啪啪国产精品| 欧美另类交人妖| 国产九色91回来了| 国产亚洲欧洲一区高清在线观看| 日韩小视频网站| 欧美黄页免费| 国产亚洲视频在线| 黄色av网站免费| 91天堂素人约啪| 日韩中文字幕在线视频观看| 综合激情网...| 欧美成人合集magnet| 91麻豆成人精品国产| 日韩毛片视频在线看| 在线观看国产福利| 性欧美欧美巨大69| 成人欧美在线视频| 成人av黄色| 91精品国产aⅴ一区二区| 综合 欧美 亚洲日本| 美女尤物国产一区| 一级二级三级欧美| 24小时成人在线视频| 久久综合色影院| a天堂在线观看视频| 一区二区三区欧美视频| 成人性生交视频免费观看| 欧美在线视屏| 成人在线看片| 91九色美女在线视频| 日韩精品在线视频美女| 国产成人无码专区| 欧美国产激情二区三区| 日本888xxxx| 天天做天天爱天天爽综合网| 亚洲a在线观看| 欧美xxxx性xxxxx高清| 亚洲成人在线网| 国产一级免费视频| 中文字幕一区二区三| 黄页网站在线看| 亚洲在线免费| 日产精品高清视频免费| 国产亚洲观看| 久久久在线视频| 欧美少妇另类| 欧美巨大另类极品videosbest| www.97视频| 成人精品国产免费网站| 丁香啪啪综合成人亚洲| 99精品小视频| 国产自产在线视频一区| 黄色精品视频| 欧美日本国产在线| 免费福利在线观看| 欧美一区二区三区四区久久| 日韩精品成人一区| 国产精品毛片a∨一区二区三区 | 精品亚洲porn| 欧美精品久久久久久久自慰| 狠狠做六月爱婷婷综合aⅴ| 91九色视频在线| 亚洲一区站长工具| 免费91在线视频| 久久久久久女乱国产| 欧美丰满美乳xxx高潮www| 日韩成人免费在线视频| 国产精品五月天| 91精品小视频| 国产激情一区二区三区桃花岛亚洲| 亚洲色图都市激情| 免费一区二区| 91亚洲国产成人久久精品网站| 黄页网站在线| www.久久色.com| 日韩永久免费视频| 91精品国产综合久久蜜臀| 国产又粗又猛又黄视频| 亚洲女与黑人做爰| 黄色a一级视频| 国产精品99久久久| 日本人69视频| 三级成人在线视频| 三上悠亚久久精品| 一区二区电影| 亚洲欧美精品在线观看| 爽爽窝窝午夜精品一区二区| 亚洲在线观看视频| 久久久免费人体| 国产成人精品免高潮在线观看| 国模私拍视频在线播放| xxxxx成人.com| 国产九九在线| 精品中文字幕久久久久久| 精品女同一区二区三区| 欧美一区二区三区系列电影| 亚洲熟女乱色一区二区三区久久久| 好吊成人免视频| 国产精品二区一区二区aⅴ| 亚洲视频免费在线观看| 久久久久99精品成人| 久久精品日产第一区二区三区高清版| 爱豆国产剧免费观看大全剧苏畅| 亚洲综合国产| 国产成人在线免费看| 亚洲三级网站| 国产极品粉嫩福利姬萌白酱| 最新成人av网站| 成人黄色av片| 夜夜夜久久久| 国产又大又硬又粗| 翔田千里一区二区| aa在线观看视频| 久久久国产亚洲精品| 国产日韩一区二区在线观看| 亚洲免费中文| 成人精品视频一区二区| 日韩va欧美va亚洲va久久| 欧在线一二三四区| 视频一区欧美精品| www.夜夜爽| 九一久久久久久| 日本黄色一级网站| 成人美女在线观看| www.超碰97| 国产婷婷色一区二区三区在线| 日本japanese极品少妇| 2024国产精品| 五月天综合视频| 国产精品福利影院| 国产67194| 亚洲成av人片一区二区梦乃| 国产精品久久久久久久久久久久久久久久久 | 九热这里只有精品| 亚洲福利一区二区| 国产成人一区二区三区影院在线| 亚洲综合999| 久久艹免费视频| 在线免费亚洲电影| 国产免费高清av| 亚洲二区在线播放视频| 撸视在线观看免费视频| 中文字幕日韩视频| 日韩成人伦理| 人人澡人人澡人人看欧美| 久久精品超碰| 黄色91av| 999视频精品| 国产成人生活片| 亚洲日韩视频| 久久精品视频91| 国产不卡在线一区| 色婷婷在线影院| 日韩一区日韩二区| wwwxxx亚洲| 7777精品伊人久久久大香线蕉经典版下载 | 黄色日韩网站| 不卡视频一区| 久久91精品| 亚洲色婷婷久久精品av蜜桃| 男人的天堂亚洲| 中文字幕在线播放一区二区| 国产视频一区二区三区在线观看| 亚洲精品久久久久久国| 欧美性生活大片免费观看网址| 伊人精品在线视频| 亚洲国产精品小视频| 日本www在线| 欧美重口另类videos人妖| 国产精品一区二区三区av| 国内视频一区二区| 亚洲91中文字幕无线码三区| 日日橹狠狠爱欧美超碰| 国内久久精品视频| 90岁老太婆乱淫| 午夜久久久久久久久| 国产又粗又猛视频| 亚洲色图在线观看| 17videosex性欧美| 114国产精品久久免费观看| 妖精一区二区三区精品视频| 日韩精品在线视频免费观看| 精品一区二区三区av| 高潮毛片无遮挡| 五月天婷婷综合| 亚洲AV午夜精品| 久久久999精品| 台湾佬成人网| 亚洲一区精品电影| 成人免费看片39| 国产乱人伦精品一区二区三区| 视频一区免费在线观看| 日本xxx在线播放| 一区二区欧美视频| 国产欧美一级片| 久久婷婷国产麻豆91天堂| 外国电影一区二区| 欧美一区二区三区电影在线观看| 欧美区国产区| 伊人成人免费视频| 亚洲欧美日韩中文播放| 一级片视频免费| 色综合亚洲精品激情狠狠| 欧美黄色三级| 深夜福利成人| 轻轻草成人在线| 日本xxxxxxxxx18| 色狠狠桃花综合| 成年人免费在线视频| 日韩av成人在线| 精品一区在线| 天天操天天爽天天射| 国产免费观看久久| 欧美日韩 一区二区三区| 国产亚洲精品久久久久动| 亚洲精品粉嫩美女一区| 亚洲高清乱码| 精品在线亚洲视频| www欧美com| 日韩天堂在线观看| 麻豆最新免费在线视频| 亚洲精品免费一区二区三区| 成人免费电影网址| 久久精品久久99| 亚洲国产综合色| 亚洲av毛片成人精品| 欧美一区二区影院| 成人综合一区| 日本高清一区二区视频| 亚洲精品视频一区二区| 蜜臀av中文字幕| 青青a在线精品免费观看| 欧美日韩国产在线观看网站| 999这里有精品| 亚洲欧美激情在线| 黄色av免费观看| 国产精品成人av性教育| 五月天久久网站| 国产人成视频在线观看| 无吗不卡中文字幕| 高h视频在线| 成人在线国产精品| 影音先锋一区| 你懂得视频在线观看| 日韩视频一区在线观看| 伊人久久精品一区二区三区| 亚洲国产精品毛片| 国产成人免费视频网站高清观看视频| 中文字幕精品亚洲| 亚洲精品一区二区三区在线观看| 一个人www视频在线免费观看| 日本一区不卡| 国产又黄又大久久|