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

基于Redis實現Spring Cloud Gateway的動態管理

開發 架構 Redis
Spring Cloud Gateway是當前使用非常廣泛的一種API網關。它本身能力并不能完全滿足企業對網關的期望,人們希望它可以提供更多的服務治理能力。

引言:

Spring Cloud Gateway是當前使用非常廣泛的一種API網關。它本身能力并不能完全滿足企業對網關的期望,人們希望它可以提供更多的服務治理能力。但Spring Cloud Gateway并不提供數據的動態管理,甚至修改個路由都需要重啟。我們如何解決它這個短板,同時實現治理配置數據的高效動態管理呢?本文將帶來我們網關與Redis組合的實踐。

[[274496]]

目錄:

1.Spring Cloud Gateway 簡介

2.網關數據管理

3.實現細節

1.Spring Cloud Gateway 簡介

API 網關

API 網關出現的原因是微服務架構的出現,不同的微服務一般會有不同的網絡地址,而外部客戶端可能需要調用多個服務的接口才能完成一個業務需求,如果讓客戶端直接與各個微服務通信,會有以下的問題:

  • 客戶端會多次請求不同的微服務,增加了客戶端的復雜性。
  • 存在跨域請求,在一定場景下處理相對復雜。
  • 認證復雜,每個服務都需要獨立認證。
  • 難以重構,隨著項目的迭代,可能需要重新劃分微服務。例如,可能將多個服務合并成一個或者將一個服務拆分成多個。如果客戶端直接與微服務通信,那么重構將會很難實施。
  • 某些微服務可能使用了防火墻 / 瀏覽器不友好的協議,直接訪問會有一定的困難。

以上這些問題可以借助 API 網關解決。API 網關是介于客戶端和服務器端之間的中間層,所有的外部請求都會先經過 API 網關這一層。也就是說,API 的實現方面更多的考慮。 

 

使用 API 網關后的優點如下:

  • 易于監控??梢栽诰W關收集監控數據并將其推送到外部系統進行分析。
  • 易于認證??梢栽诰W關上進行認證,然后再將請求轉發到后端的微服務,而無須在每個微服務中進行認證。
  • 減少了客戶端與各個微服務之間的交互次數。

Spring Cloud Gateway

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技術開發的網關,Spring Cloud Gateway旨在為微服務架構提供一種簡單而有效的統一的API路由管理方式。

Spring Cloud Gateway作為Spring Cloud生態系中的網關,目標是替代Netflix ZUUL,其不僅提供統一的路由方式,并且基于Filter鏈的方式提供了網關基本的功能,例如:安全,監控/埋點,和限流等。 

如圖所示,SCG的架構看起來很簡單。

首先,它內部包含了一個高性能的Netty Server,用來接收各類網絡請求。請求進來之后,會根據配置的各個路由進行匹配并處理請求。每個路由都可以定義多個斷言(Predicate),用于路由匹配。

SCG默認提供了10多個內建的斷言,可以基于請求的各個方面(請求頭,路徑,路徑,時間,Cookie,http方法等)進行路由匹配。如果還不夠,用戶還可以自已擴展。

請求匹配到了合適的路由之后,就會按照路由中配置的各過濾器(filter),按順序對請求進行處理。Filter也基本上可以對請求的所有屬性做處理,修改,添加或者除請求頭,修改請求數據,修改返回的數據等,幾乎無所不能。當然,修改請求也只是一方面的用途,認證,鑒權,記錄日志等也都可以在網關中統一來做。

所有filter形成處理鏈,直到所有的filter處理完,才會交給最后面的 Netty Client,由它將處理過的請求發送至對應的微服務。

在請求發送至微服務之前,還可以定義它的負載均衡策略(LoadBalancerRule),以決定請求至底發往微服務的哪個實例。

Filter 與 LoadBalancerRule 都支持自行擴展。

2.網關數據管理

實現一個適合自已的網關,對數據管理需要考慮哪些方面的東西呢?

(1)首先,我們要考慮一下,我們需要管理些什么數據。

SCG本身對數據管理的管理是很弱的。它沒有提供數據的持久化方案,它所有的數據都來自初始化,來自它的配置文件(application.yml)。它本身雖然也對外提供了一些管理接口(Actuator API)能力不夠,但能力不夠,且這些修改都是暫時的,網關一停,數據就消失了。這就要求我們要用一套更完善的方案,把網關的這些數據管理起來,不能讓它只能寫在配置文件中,而要支持持久化,支持動態變更。再有就是我們對各微服務的治理數據。網關只用來做路由轉發,那就太浪費了,統一認證,統一鑒權,訪問日志記錄,應用訪問統計,黑白名單過濾,API訂閱管理,流量限制,甚至數據格式轉換,網絡協議轉換,都可以在網關中來做。而所有的這些能力,無不需要數據的支持。因此,這些服務的治理配置,也是網關需要管理的數據。

(2)數據有了,我們還得考慮怎么把它保存起來,不能網關一重啟,所有數據就沒了。

(3)還得再考慮一下數據的讀取。網關對性能的要求是很高的,每次對過關的數據進行治理,都需要去讀取這些配置信息。如果配置信息讀取太消耗資源,無疑對網關是不利的。所以,我們還得考慮數據如何緩存,以提高數據的讀取性能。

(4)單個網關,可以處理的請求量是有上限的。為了應對大的流量,我們可能會需要對網關做水平擴容。當多個網關實例共存時,如何保障對網關的修改,能快速同步到每個網關實例呢?數據變更通知也得考慮。

(5)最多,我們還得考慮一下方案的擴展,數據存儲能不能改個地方,通知能不能換種方式?

綜合考慮了這些方面之后,我們的網關的架構如下: 

 

如圖,以上就是我們網關的整體設計。方案設計要點如下:

  • 網關對外提供治理數據管理接口, 微服務治理平臺可通過這些接口, 將治理配置推送到網關
  • 網關通過治理數據統一存儲接口, 將治理配置數據保持至治理數據持久存儲(這里我們默認為Redis)
  • Redis通過發布訂閱能力, 將數據的變更通知到各網關實例
  • 各網關實例收到通知后, 將數據從持久存儲同步至內部高速緩存
  • 內部緩存在網關啟動時, 會自動從持久存儲加載對應配置進入緩存. 同時它也支持清空, 以及按需加載
  • 外部業務請求經過網關時, 對數據執行鑒權,處理轉換, 以及灰度策略時,所需要治理配置,都從內部緩存中獲取, 以提升性能
  • 方案中, 外部持久存儲(默認用的Redis, 可以換成Mysql, 文件, Appolo等), 以及數據變更通知(默認使用的是Redis的發布訂閱, 可以換成Appolo通知, 消息隊列, 定時掃描等), 都是可以擴展的

3.實現細節

動態路由管理

Spring Cloud Gateway作為所有請求流量的入口,在實際生產環境中為了保證高可靠和高可用,盡量避免重啟, 需要實現Spring Cloud Gateway動態路由配置。實現動態路由其實很簡單, 重點在于 RouteDefinitionRepository 這個接口. 這個接口繼承自兩個接口, 其中 RouteDefinitionLocator 是用來加載路由的. 它有很多實現類,其中的 PropertiesRouteDefinitionLocator 就用來實現從yml中加載路由。另一個 RouteDefinitionWriter 用來實現路由的添加與刪除。通過查看spring cloud gateway的源碼可以發現, 在 org.springframework.cloud.gateway.config.GatewayAutoConfiguration中這么一段: 

  1. @Bean 
  2. @ConditionalOnMissingBean(RouteDefinitionRepository.class) 
  3. public InMemoryRouteDefinitionRepository inMemoryRouteDefinitionRepository() { 
  4.     return new InMemoryRouteDefinitionRepository(); 

可以看出, 網關中如果沒有RouteDefinitionRepository的Bean, 就會采用InMemoryRouteDefinitionRepository做為實現。這個 InMemoryRouteDefinitionRepository有一個問題, 就是數據沒有持久化, 網關重啟之后,原來通過接口設置的路由就會丟失了。

這當然是不可接受的, 所以我們需要實現自已的 RouteDefinitionRepository, 來提供路由配置信息。如使用redis做為存儲, 來實現路由的存儲。實現請參考文章:https://dwz.cn/tsHfKwMe

除此以外, 每當路由更改之后, 還需要通知網關刷新路由。這需要發送 RefreshRoutesEvent 來通知網關。如下列示例: 

  1. @Component 
  2. public class RouteDynamicService implements ApplicationEventPublisherAware { 
  3.     private ApplicationEventPublisher publisher; 
  4.  
  5.     @Override 
  6.     public void setApplicationEventPublisher(ApplicationEventPublisher publisher) { 
  7.       this.publisher = publisher; 
  8.     } 
  9.  
  10.     /** 
  11.     * 刷新路由表 
  12.     */ 
  13.     public void refreshRoutes() { 
  14.       publisher.publishEvent(new RefreshRoutesEvent(this)); 
  15.     } 

刷新可以通過消息通知機制來觸發, 當然, 也可以對外接供rest接口, 手動觸發。

數據存儲 

 

如上述類圖所示, IGovernDataRepository為治理數據統一存儲接口。RedisGovernDataRepository為實現的它的抽像類, 它需要依賴兩個, 一個是StringRedisTemplate,用來實現redis數據的存儲。另一個為 RedisKeyGenerator, 用來為各治理對象生成對應的key。RedisGovernDataRepository下面則為各個治理數據存儲的實現類。使用Redis做為持久存儲時, 需要注意以下幾點:

  • 為對象生成key時, 建議為key添加一個命名空間(就是加一段有意義的前綴)
  • 在redis中進行模糊搜索時, 提供給Redis的pattern, 不能是一個正則的通配, 它支持三種通配 *(多個), ?(單個)
  • 如果數據量比較大, 不建議使用keys進行模糊查詢, 應該使用scan方式

數據緩存

我們提供了內部緩存,它處于使用者與持久存儲之間,緩存數據以提升性能。緩存的實現主要有如下幾點:

  1. 實現了 InitializingBean 以實現在網關啟動時, 自動加載數據
  2. 內部使用了ConcurrentHashMap, 保證寫時的線程同步, 又保證了get時的高效(get整個過程不需要加鎖)
  3. 從緩存中取數據時, 如果需要懶加載, 當從持久存儲中加載不到數據時, 建議使用空數據, 或空集合占位, 避免每次都去持久存儲中查詢

代碼示例如下: 

  1. /** 
  2.   * 根據 appCode 獲取流量策略 
  3.   *  
  4.   * @param appCode 
  5.   * @return 
  6.   */ 
  7. public Set<ApplicationTrafficPolicy> getAppTrafficPolicies(String appCode) { 
  8.   // 從緩存加載 
  9.   Map<String, ApplicationTrafficPolicy> map = policyMap.get(appCode); 
  10.   // 緩存中沒有 
  11.   if (map == null) { 
  12.     // 嘗試從持久存儲中加載所有此網關的流量策略 
  13.     Set<ApplicationTrafficPolicy> policies = trafficPolicyRepository.fuzzyQuery(); 
  14.     // 持久存儲中沒有任何流量策略,占個位置,防止緩存重復去加載 
  15.     if (policies == null || policies.size() == 0) { 
  16.       map = new ConcurrentHashMap<>(); 
  17.       policyMap.put(appCode, map); 
  18.     } else { 
  19.       // 持久存儲中有流量策略,放入緩存 
  20.       for (ApplicationTrafficPolicy policy : policies) { 
  21.         setTrafficPolicy(policy); 
  22.       } 
  23.       // 重新從緩存中加載一次 
  24.       map = policyMap.get(appCode); 
  25.       // 如果還是沒有,使用空 map 占位子 
  26.       if (map == null) { 
  27.         map = new ConcurrentHashMap<>(); 
  28.         policyMap.put(appCode, map); 
  29.       } 
  30.     } 
  31.   } 
  32.   return map.values().stream().collect(Collectors.toSet()); 

事件通知

事件通知,這里我們使用的是redis的發布與訂閱能力。Redis默認是不發送事件的,要讓它發布事件,需要先修改它的配置文件redis.conf,添加一個配置: 

  1. notify-keyspace-events "K$g" 

上面的配置將使得Redis中發生數據的添加,修改或刪除時,發送set或del事件。

然后,我們需要配置一個RedisMessageListenerContainer,用來訂閱我們感興趣的事件。 

  1. @Bean 
  2. RedisMessageListenerContainer container(MessageListenerAdapter listenerAdapter) { 
  3.   String gtwReidsPattern = "__keyspace@*__:" + GTW + keyGenerator.getGatewayCode() + "]*"
  4.   String cofRedisPattern = "__keyspace@*__:" + COF + cacheKey.getKeyNameSpace() + USER_NAME + "*"
  5.   log.info("Add gateway redis message listener, patternTopic is {}", gtwReidsPattern); 
  6.   log.info("Add coframe redis message listener, patternTopic is {}", cofRedisPattern); 
  7.   RedisMessageListenerContainer container = new RedisMessageListenerContainer(); 
  8.   container.setConnectionFactory(redisTemplate.getConnectionFactory()); 
  9.   // PatternTopic 參考:http://redisdoc.com/topic/notification.html 
  10.   container.addMessageListener(listenerAdapter, Arrays.asList(new PatternTopic(PatternUtil.fmt(gtwReidsPattern)), new PatternTopic(PatternUtil.fmt(cofRedisPattern)))); 
  11.   return container; 
  12. 當redis事件訂閱好了之后, 每次其中我們關心的數據有變更, 都會發送set或del事件. 
  13. 我們需要定義一個 MessageListener, 來接收事件: 
  14. @Service(value = RedisMessageListener.REDIS_LISTENER_NAME) 
  15. public class RedisMessageListener implements MessageListener { 
  16.   @Override 
  17.   public void onMessage(Message message, byte[] pattern) { 
  18.     String ops = new String(message.getBody()); 
  19.     String channel = new String(message.getChannel()); 
  20.     String key = channel.split(":")[1]; 
  21.  
  22.     if ("set".equals(ops)) { 
  23.       String value = redisTemplate.opsForValue().get(key); 
  24.       handleSet(key, value); 
  25.     } else if ("del".equals(ops)) { 
  26.       handleDel(key); 
  27.     } 
  28.   } 
  29.   ... 

接收到事件后,會調用相應的內部緩存,更新內部緩存中的數據,以實現治理數據變更的及時生效。

作者:

將曉漁,現任普元云計算架構師。曾在PDM,云計算,數據備份,移動互聯相關領域公司工作,十年以上IT工作經驗。曾為科企桌面虛擬化產品的核心工程師,愛數容災備份云柜系統設計師,萬達信息的食安管理與追溯平臺開發經理。國內IAAS云計算的早期實踐者,容器技術專家。

 

責任編輯:華軒 來源: EAWorld
相關推薦

2024-05-13 18:35:06

負載均衡主機端口

2023-02-20 10:13:00

灰度發布實現

2022-01-07 07:29:08

Rbac權限模型

2024-01-29 08:00:00

架構微服務開發

2023-02-28 08:57:06

Spring上下線緩存

2023-03-08 09:03:55

2022-08-15 09:22:12

JWT認證系統

2025-03-04 08:59:16

2023-02-13 08:10:40

Gateway網關Spring

2023-09-15 08:18:49

cookie網關代理

2021-01-14 07:54:19

Spring Clou應用路由

2023-01-26 01:41:27

核心全局過濾器

2023-07-24 08:00:56

客戶端訪問指定

2022-08-02 08:32:21

Spring項目網關

2018-06-01 23:08:01

Spring Clou微服務服務器

2021-11-04 10:11:02

Sentinel網關限流

2025-02-10 00:23:11

Spring微服務架構

2022-04-11 07:34:46

OAuth2UAA節點

2023-02-15 08:12:19

http超時過濾器

2022-10-17 12:12:07

點贊
收藏

51CTO技術棧公眾號

超碰免费在线| www五月天com| 91久久精品无嫩草影院 | 99影视tv| 国产成人综合欧美精品久久| 欧美熟乱15p| 精品少妇一区二区三区在线播放 | 丁香花视频在线观看| 99re视频精品| 成人网中文字幕| 91看片在线播放| 视频在线不卡免费观看| 精品捆绑美女sm三区 | 另类中文字幕国产精品| 亚洲欧美激情小说另类| 久久精品二区| 国产肥老妇视频| 久久亚洲色图| 久久久久久久久久久免费 | 亚洲精品福利视频网站| 欧洲成人一区二区| 黄片毛片在线看| 久久精品国产免费看久久精品| 欧美精品videossex性护士| 日韩一区二区a片免费观看| 亚洲精选av| 欧美日韩视频一区二区| 亚洲熟妇国产熟妇肥婆| 成人国产免费电影| 国产欧美日韩卡一| 欧美高清视频一区| 欧美 日韩 国产 精品| 狠狠色狠狠色综合系列| 国产成人精品999| 黄色一级片免费看| 中文字幕午夜精品一区二区三区 | av中文字幕在线播放| 91麻豆123| 国产精品大全| 国产福利视频导航| 精品一区二区三区欧美| 日韩av免费在线看| 韩国av中文字幕| 激情欧美日韩| 欧美肥臀大乳一区二区免费视频| 人人艹在线视频| 欧美日韩国产高清电影| 亚洲欧洲一区二区三区在线观看| 在线视频 日韩| 成人av综合网| 亚洲精品一区二区在线观看| 美女又黄又免费的视频| 欧美国产亚洲精品| 欧美一区二区三区日韩| 91香蕉视频免费看| 日韩欧美久久| 日韩欧美国产小视频| 亚洲男人天堂2021| 精品视频一区二区三区| 欧美一卡2卡三卡4卡5免费| 中文字幕在线观看日| 男人天堂久久| 91麻豆精品国产91久久久久久 | 成人的网站免费观看| 成人一区二区三区四区| 六月婷婷中文字幕| 91麻豆6部合集magnet| 麻豆久久久9性大片| 国模吧精品人体gogo| 久久久久国产一区二区三区四区| 欧美一区国产一区| 中文日本在线观看| 亚洲欧美日韩系列| 男的插女的下面视频| 美女高潮在线观看| 日本道精品一区二区三区| www.欧美日本| 91精品亚洲一区在线观看| 91麻豆精品国产91久久久 | 亚洲国产精品嫩草影院久久av| 亚洲国语精品自产拍在线观看| 国产麻豆天美果冻无码视频 | 最近2019年手机中文字幕| 免费看一级黄色| 欧美日本一区二区高清播放视频| 欧美激情一区二区三区成人| 国产精品久免费的黄网站| 喷水一区二区三区| 99国产高清| 蜜桃免费在线| 亚洲黄网站在线观看| 青娱乐自拍偷拍| 农村妇女一区二区| 亚洲国产成人精品一区二区| 全黄一级裸体片| 欧美在线免费| 国产91色在线免费| 午夜精品久久久久久久99| 久久夜色精品一区| 女同性恋一区二区| 日韩欧美一区二区三区在线观看| 欧美一区午夜精品| 中文字字幕码一二三区| 亚洲第一偷拍| 日韩美女在线观看一区| www.久久精品.com| 国产人久久人人人人爽| 国产真人做爰毛片视频直播| 日韩毛片免费看| 亚洲精品电影网| 极品久久久久久| 三级欧美在线一区| 高清国产在线一区| eeuss影院www在线播放| 黄网站色欧美视频| 樱花草www在线| 亚洲人成无码网站久久99热国产 | 蜜乳av另类精品一区二区| 成人网页在线免费观看| 日韩电影免费| 一区二区三区蜜桃网| 久久国产这里只有精品| 亚洲精品白浆高清| 欧美极品少妇全裸体| 91欧美日韩麻豆精品| 久久久不卡网国产精品二区| 日韩精品一区在线视频| 国产成人免费av一区二区午夜| 亚洲视频专区在线| 久久夜色精品亚洲| 成熟亚洲日本毛茸茸凸凹| 只有这里有精品| 成人自拍视频网| 亚洲欧美综合另类中字| 久久精品视频9| 国产成人午夜99999| 亚洲精品免费在线看| 欧美天堂视频| 亚洲欧美www| 欧美日韩精品区| 成人精品视频一区二区三区| 欧美日韩午夜爽爽| 日韩成人18| 九九精品在线播放| 精品人妻一区二区三区麻豆91| 中文字幕免费一区| 邪恶网站在线观看| 四虎成人精品永久免费av九九| 国产福利成人在线| 国产区在线视频| 欧洲亚洲国产日韩| 国产sm调教视频| 日韩成人免费电影| 亚洲精品国产精品国自产| 草民电影神马电影一区二区| 国产亚洲精品美女| www.亚洲激情| 国产精品久久久久永久免费观看 | 国产一区二区三区在线免费观看 | 久久99国产精品| 日韩理论视频| 亚洲天堂免费观看| 中文在线字幕免费观| 草莓视频成人appios| 亚洲午夜久久久久久久久久久 | 五月天激情四射| 国产欧美日韩三级| 五月天中文字幕在线| 亚洲男女av一区二区| 亚洲在线视频观看| 青春草视频在线| 日韩av在线网站| 中文字幕精品视频在线观看| 国产日韩v精品一区二区| 九九九在线观看视频| 日韩精品首页| 亚洲综合在线做性| 国产拍在线视频| 一区国产精品视频| 99热这里只有精品在线| 五月天亚洲婷婷| 黄色片网站免费| 国产精品77777竹菊影视小说| 国产精品久久久久7777| 伊人精品一区| 亚洲精品欧美日韩| 亚洲涩涩在线| 久久综合色影院| 日本人妻熟妇久久久久久| 在线视频欧美精品| 久草视频在线免费看| 国产午夜亚洲精品羞羞网站| 亚洲图色中文字幕| 一区二区三区导航| 亚洲在线色站| 欧美sss在线视频| 成人精品福利视频| 久久r热视频| 久久99精品国产99久久6尤物| 久青草国产在线| 精品美女在线观看| 一卡二卡三卡在线观看| 无码av免费一区二区三区试看| 亚洲一区 欧美| 成人a区在线观看| 亚洲综合婷婷久久| 99国产精品99久久久久久粉嫩| 亚洲日本无吗高清不卡| 欧美三级午夜理伦三级小说| 成人精品一区二区三区电影免费 | 亚洲最大的黄色网| 国产主播一区二区| 北条麻妃av高潮尖叫在线观看| 国产精品毛片久久| 日本一区视频在线观看| 红杏视频成人| 97国产超碰| 黄色成人小视频| 亚洲国产美女搞黄色| 久久久久国产精品视频| 日本高清久久| 国产男人精品视频| 日本国产欧美| 欧美一区视频在线| 91福利区在线观看| 久久99久久99精品免观看粉嫩| av片在线看| 亚洲视频在线免费看| 天堂а在线中文在线无限看推荐| 精品三级在线观看| 国产v在线观看| 3d动漫精品啪啪一区二区竹菊| 久久久精品毛片| 欧美午夜精品伦理| 日韩欧美三级在线观看| 亚洲国产精品一区二区久久恐怖片| 成人黄色短视频| 中文字幕免费一区| 欧美aaa级片| 中文字幕欧美日韩一区| 国产精品美女高潮无套| 国产欧美一区二区精品性色超碰 | 国产精品三级| 久久日韩精品| 另类在线视频| 久久精品aaaaaa毛片| 久久久久久久久久久久久久久久久久久久| www.久久草| 日本精品视频| 国产精品久久久久久久久久久久午夜片 | 国产成人精品一区二区| 欧美黑人疯狂性受xxxxx野外| 91a在线视频| 久九九久频精品短视频| 国产成人精品999| 日本h片久久| 91精品国产自产在线老师啪| 日韩av黄色| 97久久人人超碰caoprom欧美| 天堂va欧美ⅴa亚洲va一国产| 91网站在线免费观看| 一区二区三区四区精品视频| av激情久久| 西野翔中文久久精品国产| 欧美日韩一区在线播放| 日韩电影免费网站| 成年人视频大全| 国产日韩亚洲| 国产高清视频网站| 国产精品影视天天线| 亚洲视频在线播放免费| 久久久久久麻豆| 国产三级aaa| 亚洲精品久久久久久国产精华液| 久久国产精品波多野结衣| 超碰这里只有精品| 日韩精品黄色网| 国产一区二区三区不卡在线| 日韩视频―中文字幕| 亚洲丝袜一区| 欧美整片在线观看| 欧美特黄色片| 国产日韩二区| 日韩精品诱惑一区?区三区| 奇米777四色影视在线看| 国产午夜久久| 国产精品v日韩精品v在线观看| 国产乱子伦视频一区二区三区 | 91在线观看一区二区| 国产黄色大片免费看| 国产欧美精品一区| 欧美交换国产一区内射| 色综合 综合色| 国产男男gay体育生网站| 亚洲精品国产suv| 麻豆视频在线免费观看| 国内精久久久久久久久久人| 桃子视频成人app| 北条麻妃高清一区| 狠狠色狠狠色综合婷婷tag| 欧美日韩一区二区三区电影| 午夜一区二区三区不卡视频| 欧美一级视频在线| 91麻豆视频网站| 538任你躁在线精品视频网站| 五月天国产精品| 国产手机视频在线| 这里只有精品久久| 女海盗2成人h版中文字幕| 91精品久久久久久久久久入口 | 中文字幕精品—区二区日日骚| 一本色道久久综合| 亚洲熟女乱综合一区二区| 国产欧美日韩精品在线| 日韩男人的天堂| 制服丝袜亚洲播放| 国产区在线视频| 欧美亚洲国产日本| 国产精品一站二站| 一区二区视频在线免费| 天堂va蜜桃一区二区三区漫画版| 最新版天堂资源在线| 亚洲欧美色图小说| 一本色道久久综合精品婷婷| 亚洲人成网站777色婷婷| 大桥未久在线视频| 99在线视频免费观看| 在线看片不卡| 亚洲一区二区三区四区精品| 国产精品每日更新在线播放网址| 亚洲 欧美 中文字幕| 亚洲精品国精品久久99热 | 香蕉久久一区二区不卡无毒影院| 国产精品久久久久精| 综合网日日天干夜夜久久| 欧美特大特白屁股xxxx| 久久青青草原| 99在线精品免费视频九九视| 伊人久久久久久久久| 亚洲女与黑人做爰| 国产精品无码在线播放| 久久精品电影一区二区| 亚洲a成人v| 中文字幕一区二区三区在线乱码| 久久99最新地址| 一区二区三区四区五区| 91精品国产入口| 中国av在线播放| av一本久道久久波多野结衣| 亚洲一区欧美| 亚洲欧洲国产视频| 亚洲综合免费观看高清完整版| 国产黄色小视频在线观看| 欧美日本高清一区| 成人av影音| 无码人妻丰满熟妇区96| 久久一夜天堂av一区二区三区| 日本免费在线观看视频| 亚洲片国产一区一级在线观看| 日韩欧美另类一区二区| 神马一区二区影院| 极品尤物av久久免费看| 国产极品国产极品| 欧美精品一区二区三区久久久| 国产在线美女| 少妇精品久久久久久久久久| 九九**精品视频免费播放| 青青草手机视频在线观看| 亚洲第一网站免费视频| 天堂中文av在线资源库| 日韩精品电影网站| 国内精品写真在线观看| 豆国产97在线 | 亚洲| 亚洲精品久久7777777| 成人在线视频播放| 最新视频 - x88av| 91丨porny丨户外露出| 在线免费看毛片| 欧美激情aaaa| 欧美日韩国产传媒| 男人的天堂免费| 欧美性极品xxxx做受| 麻豆传媒视频在线| 国产欧美综合精品一区二区| 日韩一区欧美二区| 欧美日韩精品在线观看视频 | 黄色软件视频在线观看| 欧美在线视频一区二区三区| 久久国产麻豆精品| 久久免费视频6| 在线a欧美视频| aaa国产精品| 精品久久久久久久无码| 一区二区三区色| 国产永久av在线| 国产精品一 二 三| 精品综合久久久久久8888| 91午夜视频在线观看| 久久人体大胆视频| 丝袜连裤袜欧美激情日韩|