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

我去,你竟然還不會用API網關!

原創
網絡 通信技術 開發工具
從應用程序架構的變遷過程可以發現,隨著業務多變性、靈活性的不斷提高,應用程序需要以更加靈活的組合來應對。

【51CTO.com原創稿件】從應用程序架構的變遷過程可以發現,隨著業務多變性、靈活性的不斷提高,應用程序需要以更加靈活的組合來應對。

[[326027]]

圖片來自 Pexels

同時為了應對業務的細分以及高并發的挑戰,微服務的架構被廣泛使用,由于微服務架構中應用會被拆分成多個服務。

為了方便客戶端對這些服務的調用于是引入了 API 的概念。今天我們就來看看API 網關的原理以及它是如何應用的。

API 網關的定義

網關一詞最早出現在網絡設備,比如兩個相互獨立的局域網之間通過路由器進行通信, 中間的路由被稱之為網關。

落實在開發層面來說,就是客戶端與微服務系統之間存在的網關。從業務層面來說,當客戶端完成某個業務的時候,需要同時調用多個微服務。

如圖 1 所示,當客戶端發起下單請求需要調用:商品查詢、庫存扣減以及訂單更新等服務。

 

圖1 :API 網關加入前后對比

如果這些服務需要客戶端分別調用才能完成,會增加請求的復雜度,同時也會帶來網絡調用性能的損耗。因此,針對微服務的應用場景就推出了 API 網關的調用。

在客戶端與微服務之間加入下單 API 網關,客戶端直接給這個 API 網關下達命令,由于后者完成對其他三個微服務的調用并且返回結果給客戶端。

從系統層面來說,任何一個應用系統如果需要被其他系統調用,就需要暴露 API,這些 API 代表著的功能點。

正如上面下單的例子中提到的,如果一個下單的功能點需要調用多個服務的時候,在這個下單的 API 網關中就需要聚合多個服務的調用。

這個聚合的方式有點像設計模式中的門面模式(Facade),它為外部的調用提供了一個統一的訪問入口。

不僅如此,如圖 2 所示,API 網關還可以協助兩個系統的通信,在系統之間加上一個中介者協助 API 的調用。

 

圖 2:對接兩個系統的 API 網關

從客戶端類型層面來說,為了屏蔽不同客戶端調用差異也可以加入 API 網關。

如圖 3 所示,在實際開發過程中 API 網關還可以根據不同的客戶端類型(iOS、Android、PC、小程序),提供不同的 API 網關與之對應。

 

圖 3:對接客戶端和服務端的 API 網關

由于 API 網關所處的位置是客戶端與微服務交界的地方,因此從功能上它還包括:路由,負載均衡,限流,緩存,日志,發布等等。

Spring Cloud Gateway 概念與定義

API 網關的定義中我們提到了為什么要使用 API 網關,是為了解決客戶端對多個微服務進行訪問的問題。

由于服務的切分導致一個操作需要同時調用多個服務,因此為這些服務的聚合提供一個統一的門面,這個門面就是 API 網關。

針對于 API 網關有很多的實現方式,例如:Zuul,Kong 等等。這里我們以及 Spring Cloud Gateway 為例展開給大家介紹其具體實現。

一般來說,API 網關對內將微服務進行集合,對外暴露的統一 URL 或者接口信息供客戶端調用。

那么客戶端是如何與微服務進行連接,并且進行溝通的,需要引入下面幾個重要概念 。

 

圖 4:路由、斷言和過濾器

如圖 4 所示,Spring Cloud Gateway 由三部分組成:

①路由(Route):任何一個來自于客戶端的請求都會經過路由,然后到對應的微服務中。

每個路由會有一個唯一的 ID 和對應的目的 URL。同時包含若干個斷言(Predicate)和過濾器(Filter)。

②斷言(Predicate):當客戶端通過 Http Request 請求進入 Spring Cloud Gateway 的時候,斷言會根據配置的路由規則,對 Http Request 請求進行斷言匹配。

說白了就是進行一次或者多次 if 判斷,如果匹配成功則進行下一步處理,否則斷言失敗直接返回錯誤信息。

③過濾器( Filter):簡單來說就是對流經的請求進行過濾,或者說對其進行獲取以及修改的操作。注意過濾器的功能是雙向的,也就是對請求和響應都會進行修改處理 。

一般來說 Spring Cloud Gateway 中的過濾器有兩種類型:

  • Gateway Filter
  • Global Filter

Gateway Filter 用在單個路由和分組路由上。Global Filter 可以作用于所有路由,是一個全局的 Filter。

Spring Cloud Gateway 工作原理

說完了 Spring Cloud Gateway 定義和要素,再來看看其工作原理。總的來說是對客戶端請求的處理過程。

 

圖 5:Spring Cloud Gateway 處理請求流程圖

如圖 5 所示,當客戶端向 Spring Cloud Gateway 發起請求,該請求會被 HttpWebHandlerAdapter 獲取,并且對請求進行提取,從而組裝成網關上下文。

將組成的上下文信息傳遞到 DispatcherHandler 組件。DispatcherHandler 作為請求分發處理器,主要負責將請求分發到對應的處理器進行處理。

這里請求的處理器包括 RoutePredicate HandlerMapping (路由斷言處理映射器) 。

路由斷言處理映射器用于路由的查找,以及找到 路由后返回對應的 FilteringWebHandler。

其負責組裝 Filter 鏈表并執行過濾處理,之后再將請求轉交給應用服務,應用服務處理完后,最后返回 Response 給客戶端 。

其中 FilteringWebHandler 處理請求的時候會交給 Filter 進行過濾的處理。

這里需要注意的是由于 Filter 是雙向的所以,當客戶端請求服務的時候,會通過 Pre Filter 中的 Filter 處理請求。

當服務處理完請求以后返回客戶端的時候,會通過 Post Filter 再進行一次處理。

Spring Cloud Gateway 最佳實踐

上面介紹了 Spring Cloud Gateway 的定義和實現原理,下面根據幾個常用的場景介紹一下 Spring Cloud Gateway 如何實現網關功能的。

我們會根據基本路由、權重路由、限流、動態路由幾個方面給大家展開介紹。

基本路由

基本路由,主要功能就是在客戶端請求的時候,根據定義好的路徑指向到對應的 URI。這個過程中需要用到 Predicates(斷言)中的 Path 路由斷言處理器。

首先在 POM 文件中加入對應的依賴,如下:

  1. <dependency> 
  2.     <groupId>org.springframework.cloud</groupId> 
  3.     <artifactId>spring-cloud-starter-gateway</artifactId> 
  4. </dependency> 

加入如下代碼,其中定義的 Path 的路徑“/baidu”就是請求時的路徑地址。對應的 URI,http://www.baidu.com/ 就是要跳轉到的目標地址。

  1. @Bean 
  2. public RouteLocator routeLocator(RouteLocatorBuilder builder) { 
  3.    return builder.routes() 
  4.          .route(r ->r.path("/baidu"
  5.                .uri("http://www.baidu.com/").id("baidu_route"
  6.          ).build(); 

同樣上面的功能也可以在 yml 文件中實現。配置文件如下,說白了就是對 Path 和 URI 參數的設置,實現的功能和上面代碼保持一致。

  1. spring: 
  2.   cloud: 
  3.     gateway: 
  4.       routes: 
  5.       - id: baidu_route 
  6.         uri: http://baidu.com:80/ 
  7.         predicates: 
  8.         - Path=/baidu 

此時啟動 API 網關,假設網關的訪問地址是“localhost:8080/baidu”,當用戶請求這個地址的時候就會自動請求“www.baidu.com”這個網站。這個配置起來很簡單,有 Nginx 基礎的朋友應該很快就能上手。

權重路由

這個使用場景相對于上面的簡單路由要多一些。由于每個微服務發布新版本的時候,通常會保持老版本與新版版同時存在。

然后通過網關將流量逐步從老版本的服務切換到新版本的服務。這個逐步切換的過程就是常說的灰度發布。

此時,API 網關就起到了流量分發的作用,通常來說最開始的老版本會承載多一些的流量,例如 90% 的請求會被路由到老版本的服務上,只有 10% 的請求會路由到新服務上去。

從而觀察新服務的穩定性,或者得到用戶的反饋。當新服務穩定以后,再將剩下的流量一起導入過去。

 

圖 6:灰度發布,路由到新/老服務

如下代碼所示,假設 API 網關還是采用 8080 端口,需要針對兩個不同的服務配置路由權重。因此在 routes 下面分別配置 service_old 和 service_new。

  1. server.port: 8080 
  2. spring: 
  3.   application: 
  4.     name: gateway-test 
  5.   cloud: 
  6.     gateway: 
  7.       routes: 
  8.       - id: service_old 
  9.         uri: http://localhost:8888/v1 
  10.         predicates: 
  11.         - Path=/gatewaytest 
  12.         - Weight=service, 90 
  13.       - id: service_new 
  14.         uri: http://localhost:8888/v2 
  15.         predicates: 
  16.         - Path=/gatewaytest 
  17.         - Weight=service, 10 

在兩個配置中對應的 URI 分別是新老兩個服務的訪問地址,通過“http://localhost:8888/v1”和“http://localhost:8888/v2”來區別。

在 Predicates(斷言)中定義了的 Path 是想通的都是“/gatewaytest”,也就是說對于客戶端來說訪問的路徑都是一樣的,從路徑上客戶不會感知他們訪問的是新服務或者是老服務。

主要參數是在 Weight,針對老/新服務分別配置的是 90 和 10。也就是有 90% 的流量會請求老服務,有 10% 的流量會請求新服務。

簡單點說,如果有 100 次請求,其中 90 次會請求 v1(老服務),另外的 10 次會請求 v2(新服務)。

限流

當服務在短時間內迎來高并發,并發量超過服務承受的范圍就需要使用限流。例如:秒殺、搶購、下單服務。

通過請求限速或者對一個時間窗口內的請求進行限速來保護服務。當達到限制速率則可以拒絕請求,返回錯誤代碼,或者定向到友好頁面。

一般的中間件都會有單機限流框架,支持兩種限流模式:

  • 控制速率
  • 控制并發

這里通過 Guava 中的 Bucket4j 來實現限流操作。按照慣例引入 Bucket4j 的依賴:

  1. <dependency> 
  2.     <groupId>com.github.vladimir-bukhtoyarov</groupId> 
  3.     <artifactId>bucket4j-core</artifactId> 
  4.     <version>4.0.0</version> 
  5. </dependency> 

由于需要對于用戶請求進行監控,因此通過實現 GatewayFilter 的方式自定義 Filter,然后再通過 Gateway API Application 應用這個自定義的 Filter。

這里我們使用的是令牌桶的方式進行限流,因此需要設置桶的容量(capacity),每次填充的令牌數量(refillTokens)以及填充令牌的間隔時間(refillDuration)。

初始化這三個參數以后,通過 createNewBucket 方法針對請求建立令牌桶(bucket),在 Filter 方法中實現限流的主要邏輯。

通過 ServerWebExchange 獲取請求的上下文中的 IP 信息,針對 IP 建立對應的令牌桶,這個 IP 與令牌桶的對應關系放到了 LOCAL_CACHE 中。

每次請求經過的時候通過 tryConsume(1) 方法消費一個令牌,直到沒有令牌的時候返回 HttpStatus.TOO_MANY_REQUESTS 的狀態碼(429),此時網關直接返回請求次數太多,即便是再有請求進來也不會路由到對應的服務了。

只有等待下一個時間間隔,一定數量的令牌放到桶里的時候,請求拿到桶中的令牌才能再次請求服務。

  1. public class GatewayRateLimitFilterByIp implements GatewayFilter, Ordered { 
  2.     private static final Map<String, Bucket> LOCAL_CACHE = new ConcurrentHashMap<>(); 
  3.     int capacity; 
  4.     int refillTokens; 
  5.     Duration refillDuration; 
  6.     public GatewayRateLimitFilterByIp() { 
  7.     } 
  8.  
  9.     public GatewayRateLimitFilterByIp(int capacity, int refillTokens, Duration refillDuration) { 
  10.         this.capacity = capacity; 
  11.         this.refillTokens = refillTokens; 
  12.         this.refillDuration = refillDuration; 
  13.     } 
  14.  
  15.     private Bucket createNewBucket() { 
  16.         Refill refill = Refill.of(refillTokens, refillDuration); 
  17.         Bandwidth limit = Bandwidth.classic(capacity, refill); 
  18.         return Bucket4j.builder().addLimit(limit).build(); 
  19.     } 
  20.  
  21.     @Override 
  22.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 
  23.         String ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress(); 
  24.         Bucket bucket = LOCAL_CACHE.computeIfAbsent(ip, k -> createNewBucket()); 
  25.         if (bucket.tryConsume(1)) { 
  26.             return chain.filter(exchange); 
  27.         } else { 
  28. exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS); 
  29.             return exchange.getResponse().setComplete(); 
  30.         } 
  31.     } 

上面的代碼定義了 Filter 其中針對訪問的 IP 生成令牌桶,并且定義了桶的大小、每次放入桶令牌的個數、放入令牌的間隔時間。

并且通過 Filter 方法重寫了過濾的邏輯,那么下面只需要將這個 Filter 應用到 Spring Cloud Gateway 的規則上去就可以了。通過下面代碼定義網關的路由斷言和過濾器。

在 Filters 中新建一個上面代碼定義的過濾器,指定容量是 20,每兩秒放入令牌,每次放入一個令牌。

那么當用戶訪問 rateLimit 路徑的時候就會根據客制化的 Filter 進行限流。

  1. @Bean 
  2. public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { 
  3.     return builder.routes() 
  4.             .route(r -> r.path("/rateLimit"
  5.                     .filters(f -> f.filter(new GatewayRateLimitFilterByIp(20,1,Duration.ofSeconds(2)))) 
  6.                     .uri("http://localhost:8888/rateLimit"
  7.                     .id("rateLimit_route"
  8.             ).build(); 

這里的限流只是給大家提供一種思路,通過實現 GatewayFilter,重寫其中的 Filter 方法,加入對流量的控制代碼,然后在 Spring Cloud Gateway 中進行應用就可以了。

動態路由

由于 Spring Cloud Gateway 本身也是一個服務,一旦啟動以后路由配置就無法修改了。

無論是上面提到的編碼注入的方式還是配置的方式,如果需要修改都需要重新啟動服務。

如果回到 Spring Cloud Gateway 最初的定義,我們會發現每個用戶的請求都是通過 Route 訪問對應的微服務,在 Route 中包括 Predicates 和 Filters 的定義。

只要實現 Route 以及其包含的 Predicates 和 Filters 的定義,然后再提供一個 API 接口去更新這個定義就可以動態地修改路由信息了。

按照這個思路需要做以下幾步來實現:

①定義 Route、Predicates 和 Filters

其中 Predicates 和 Filters 包含在 Route 中。實際上就是 Route 實體的定義,針對 Route 進行路由規則的配置。

  1. public class FilterDefinition { 
  2.     //Filter Name 
  3.     private String name
  4.     //對應的路由規則 
  5.     private Map<String, String> args = new LinkedHashMap<>(); 
  6. public class PredicateDefinition { 
  7.     //Predicate Name 
  8.     private String name
  9.     //對應的斷言規則 
  10.     private Map<String, String> args = new LinkedHashMap<>(); 
  11. public class RouteDefinition { 
  12.     //斷言集合 
  13. private List<PredicateDefinition> predicates = new ArrayList<>(); 
  14. //路由集合 
  15. private List< FilterDefinition > filters= new ArrayList<>(); 
  16. //uri 
  17. private String uri; 
  18. //執行次序 
  19. private int order = 0; 

②實現路由規則的操作,包括添加,更新,刪除

有了路由的定義(Route,Predicates,Filters),然后再編寫針對路由定義的操作。

例如:添加路由,刪除路由,更新路由之類的。編寫 RouteServiceImpl 實現 ApplicationEventPublisherAware。

主要需要 override 其中的 setApplicationEventPublisher 方法,這里會傳入 ApplicationEventPublisher 對象,通過這個對象發布路由定義的事件包括:add,update,delete。

貼出部分代碼如下:

  1. @Service 
  2. public class RouteServiceImpl implements ApplicationEventPublisherAware { 
  3.     @Autowired 
  4.     private RouteDefinitionWriter routeDefinitionWriter; 
  5.     private ApplicationEventPublisher publisher; 
  6.     //添加路由規則 
  7.     public String add(RouteDefinition definition) { 
  8.         routeDefinitionWriter.save(Mono.just(definition)).subscribe(); 
  9.         this.publisher.publishEvent(new RefreshRoutesEvent(this)); 
  10.         return "success"
  11.     } 
  12.     public String update(RouteDefinition definition) { 
  13.         try { 
  14.           this.routeDefinitionWriter.delete(Mono.just(definition.getId())); 
  15.         } catch (Exception e) { 
  16.  
  17.         } 
  18.         try { 
  19.             routeDefinitionWriter.save(Mono.just(definition)).subscribe(); 
  20.             this.publisher.publishEvent(new RefreshRoutesEvent(this)); 
  21.             return "success"
  22.         } catch (Exception e) { 
  23.  
  24.         } 
  25.     } 
  26.     public String delete(String id) { 
  27.         try { 
  28.             this.routeDefinitionWriter.delete(Mono.just(id)); 
  29.             return "delete success"
  30.         } catch (Exception e) { 
  31.  
  32.         } 
  33.  
  34.     } 
  35.  
  36.     @Override 
  37.     public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { 
  38.         this.publisher = applicationEventPublisher; 
  39.     } 

③對外部提供 API 接口能夠讓用戶或者程序動態修改路由規則

從代碼上來說就是一個 Controller。這個 Controller 中只需要調用 routeServiceImpl 就行了,主要也是用到客制化路由實現類中的 add,update,delete 方法。

說白了就是對其進行了一次包裝,讓外部系統可以調用,并且修改路由的配置。

經過簡化以后的代碼如下,這里只對 add 方法進行了包裝,關于 update 和 delete 方法在這里不展開說明,調用方式類似 add。

  1. public class RouteController { 
  2.  
  3.     @Autowired 
  4.     private routeServiceImpl routeService; 
  5.  
  6.     @PostMapping("/add"
  7.     public String add(@RequestBody RouteDefinition routeDefinition) { 
  8.         try { 
  9.             RouteDefinition definition = assembleRouteDefinition(routeDefinition); 
  10.             return this.dynamicRouteService.add(definition); 
  11.         } catch (Exception e) { 
  12.                    } 
  13.         return "succss"
  14.     } 

④啟動程序進行路由的添加和更新操作

假設更新 API 網關配置的服務在 8888 端口上。于是通過 http://localhost:8888/actuator/gateway/routes 訪問當前的路由信息,由于現在沒有配置路由這個信息是空。

那么通過 http://localhost:8888/route/add 方式添加一條路由規則,這里選擇 Post 請求,輸入類型為 Json 如下:

  1.     "filter":[], 
  2.     "id":"baidu_route"
  3.     "order":0, 
  4.     "predicates":[{ 
  5.         "args":{ 
  6.             "pattern":"/baidu" 
  7.         }, 
  8.         "name":"Path" 
  9.     }], 
  10.     "uri":"https://www.baidu.com" 

Json 中配置的內容和簡單路由配置的內容非常相似。設置了 Route,當 Predicates 為 baidu 的時候,將請求引導到 www.baidu.com 的網站進行響應。

此時再通過訪問 http://localhost:8888/baidu 的路徑訪問的時候,就會被路由到 www.baidu.com 的網站。

此時如果需要修改路由配置,可以通過訪問 http://localhost:8888/route/update 的 API 接口,通過 Post 方式傳入 Json 結構,例如:

  1.     "filter":[], 
  2.     "id":"CTO_route"
  3.     "order":0, 
  4.     "predicates":[{ 
  5.         "args":{ 
  6.             "pattern":"/CTO" 
  7.         }, 
  8.         "name":"Path" 
  9.     }], 
  10.     "uri":"http://www.jxzklqfsx.com" 

在更新完成以后,再訪問 http://localhost:8888/CTO 的時候就會把引導到 www.jxzklqfsx.com 的網站了。

通過上面四步操作,即使不重啟 Spring Cloud Gateway 服務也可以動態更改路由的配置信息。

總結

由于微服務的盛行,API 網關悄然興起。針對 API 網關本身講述了其存在的原因,它不僅提供了服務的門面,而且可以協調不同的系統之間的通訊以及服務不同的客戶端接口。

針對 API 網關的最佳時間 Spring Cloud Gateway 的定義和概念的解釋,其實現了路由、過濾器、斷言,針對不同的客戶端請求可以路由到不同的微服務,以及其中幾個組件是如何分工合作完成路由工作的。

在最佳實踐的介紹中分別從:基本路由、權重路由、限流和動態路由幾個方面進行了闡述。

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2021-03-16 15:12:57

CompletableFuture機制java

2022-02-22 08:25:51

typeScript泛型概念泛型使用

2024-09-09 08:36:36

Java操作遠程服務器

2024-08-12 12:25:25

SpringMVC開發

2020-09-01 14:17:03

WindowsDefender微軟

2020-10-21 10:02:16

架構運維技術

2020-09-27 06:50:56

Java互聯網注解

2019-09-03 09:30:46

ss 命令SocketLinux

2020-09-15 09:50:47

程序員技能開發者

2020-12-18 09:45:33

DockerLinux命令

2020-08-26 14:40:38

explainMySQL數據庫

2025-07-04 02:00:00

2022-08-01 08:17:46

mysqlwindows系統

2020-11-09 09:03:35

高并發多線程ThreadLocal

2012-05-02 15:38:49

金山快盤網盤

2025-08-18 02:15:00

2022-11-18 17:36:38

Spring架構

2020-12-07 09:15:00

JavaScript數組 reduce

2018-09-13 10:40:40

Linux命令find

2022-09-09 14:56:18

Linuxcpu
點贊
收藏

51CTO技術棧公眾號

在线观看免费视频综合| 本田岬高潮一区二区三区| 日韩中文理论片| 在线观看一区二区三区视频| 性xxxxfreexxxxx欧美丶| 国产欧美一区二区三区在线看蜜臀 | www.狠狠爱| 韩国一区二区三区视频| 大伊人狠狠躁夜夜躁av一区| 亚洲自拍的二区三区| www.五月激情| 久久精品国产**网站演员| 国语自产精品视频在免费| 毛片视频免费播放| 日本成人7777| 欧美不卡一二三| 久久久精品麻豆| 国产亚洲成av人片在线观看| 国产精品免费视频一区| 精品国产一区二区三| 国产美女自慰在线观看| 天堂久久久久va久久久久| 久久久久久久网站| fc2ppv在线播放| 国产一区日韩| 日韩精品免费在线观看| 一区二区三区人妻| 美女视频一区| 欧美色图12p| 免费无码av片在线观看| 狂野欧美性猛交xxxxx视频| 亚洲欧洲国产日本综合| 国产一区二区不卡在线| 欧美成人sm免费视频| 亚洲精品91在线| 亚洲成在人线免费观看| 精品av综合导航| 天堂网成人在线| 日韩免费在线电影| 欧美在线|欧美| 黄在线观看网站| 理论不卡电影大全神| 亚洲一级二级三级| 欧美乱做爰xxxⅹ久久久| 国产精品久久麻豆| 国产精品区一区二区三区| 欧美综合77777色婷婷| 偷拍精品一区二区三区| 成人动漫精品一区二区| 国产91一区二区三区| 国产后入清纯学生妹| 国产一区高清在线| 91pron在线| 国产黄色免费大片| 国产黄色精品视频| 国产精品视频免费一区二区三区 | 精品国产青草久久久久福利| 永久av免费在线观看| 国产一区二区视频在线看| 制服丝袜一区二区三区| 三日本三级少妇三级99| 综合中文字幕| 亚洲成人精品在线| 91精品小视频| 视频一区在线观看| 中文字幕精品在线视频| 成年人二级毛片| 午夜精品久久| 97视频在线免费观看| av图片在线观看| 免费人成网站在线观看欧美高清| 国产在线999| 亚洲第一页综合| 99精品一区二区| 一区二区三区中文字幕电影 | 色综合色综合色综合色综合| 日本免费在线一区| 欧美一区二区在线免费播放| 亚洲无人区码一码二码三码| 亚洲欧洲美洲国产香蕉| 中文字幕av日韩| 欧美交换国产一区内射| 国产日韩高清一区二区三区在线| 国产精品久久久久久av下载红粉| 国产美女免费视频| 不卡一区二区在线| 亚洲成人自拍视频| 欧美女同一区| 91成人看片片| 国产老头和老头xxxx×| 亚洲亚洲免费| 欧美精品日韩三级| 九九精品免费视频| 国内精品免费在线观看| 欧美xxxx黑人又粗又长精品| 欧美成人hd| 午夜精品一区二区三区三上悠亚 | 日韩欧美不卡视频| 日本vs亚洲vs韩国一区三区 | 男人添女人下面免费视频| 国产一区二区三区视频在线| 亚洲欧美成人网| 唐朝av高清盛宴| 日韩精品1区2区3区| 丁香五月网久久综合| a天堂在线资源| 五月天视频一区| 超碰91在线播放| 国产一区网站| 97超碰蝌蚪网人人做人人爽| av片免费播放| 国产精品蜜臀av| 久色视频在线播放| 天堂va欧美ⅴa亚洲va一国产| 国产香蕉一区二区三区在线视频| 日韩免费在线视频观看| 国产精品69毛片高清亚洲| 色一情一区二区三区四区| 国产盗摄精品一区二区酒店| 日韩精品社区| 日韩av在线一区二区| 亚洲天堂黄色片| 日韩av电影一区| 久久青青草原| 黄污视频在线观看| 欧美一区二区三区四区五区| 成人激情五月天| 天堂成人免费av电影一区| 久久99精品久久久久久久青青日本 | 亚洲天堂中文字幕| 亚洲免费一级视频| 国产精品中文字幕亚洲欧美| 91禁外国网站| 天堂av中文在线资源库| 亚洲成av人片在线| zjzjzjzjzj亚洲女人| 欧美精品二区| 高清不卡日本v二区在线| 黄色的网站在线观看| 欧美日韩黄色影视| 毛片久久久久久| 免费观看在线色综合| 日本一区二区三区精品视频| 美女扒开腿让男人桶爽久久软| 亚洲大胆美女视频| 国产在线观看你懂的| 成人av免费在线| 精品视频在线观看一区| 欧美一级一片| 欧洲中文字幕国产精品| 户外极限露出调教在线视频| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国精产品一区一区三区四川| 夜夜嗨av一区二区三区免费区| 欧美超碰在线观看| 欧美韩日一区二区三区四区| 免费激情视频在线观看| 亚洲高清视频网站| 9色porny自拍视频一区二区| 精品这里只有精品| 最新国产精品视频| 国产精品高清网站| 黄色网址视频在线观看| 欧美一区二区三区日韩| 久久久久久久九九九九| 成人av电影在线| 黑森林福利视频导航| 欧美日韩激情| 成人久久一区二区| 影音先锋在线播放| 亚洲精品乱码久久久久久按摩观| 国产精品第9页| 国产日韩欧美在线一区| 亚洲精品中文字幕乱码无线| 在线欧美日韩| 秋霞久久久久久一区二区| 亚洲电影二区| 韩国日本不卡在线| av在线免费观看网| 欧美一卡二卡三卡四卡| 日韩精品一区二区三| 国产精品天天看| 免费黄色在线播放| 久久亚洲视频| 亚洲精品天堂成人片av在线播放 | 激情小说中文字幕| 91在线国产福利| 亚洲成人福利在线| 怡红院精品视频在线观看极品| 久久久99爱| 精品国产一区二| 欧美重口另类videos人妖| 里番在线观看网站| 日韩黄在线观看| 国产乱码久久久久| 精品久久久在线观看| 日韩在线不卡av| 久久蜜桃av一区二区天堂| 成人免费黄色av| 日韩成人精品视频| 国产白丝袜美女久久久久| 欧美残忍xxxx极端| 久久伊人一区| 国产精品xxx在线观看| 97成人超碰视| 国产亚洲精品自在久久| 日韩毛片免费看| 热久久视久久精品18亚洲精品| 米奇精品一区二区三区| 亚洲欧洲国产伦综合| 不卡视频在线播放| 欧美精品日韩综合在线| 欧美日韩一级黄色片| 亚洲成人你懂的| 极品久久久久久| 欧美国产一区视频在线观看| 成人手机在线免费视频| 国产经典欧美精品| 毛片毛片毛片毛| 日韩av在线发布| 干日本少妇首页| 亚洲激情成人| 中文字幕人妻熟女人妻洋洋| 欧美顶级大胆免费视频| 日本在线免费观看一区| 西瓜成人精品人成网站| 国产一区二区自拍| 这里视频有精品| 亚洲资源在线看| 精品国产乱码一区二区三区| 亚洲www视频| 在线观看欧美| 成人欧美一区二区三区黑人孕妇| 全球最大av网站久久| 国产精品高潮呻吟久久av无限 | 国产一区在线播放| 成人亚洲免费| 国产日韩欧美一二三区| 国产伊人久久| 国产欧美一区二区白浆黑人| 韩国精品视频在线观看 | 国产又大又硬又粗| 国产日韩欧美一区在线| 播放灌醉水嫩大学生国内精品| 亚洲欧洲日本一区二区三区| 青草青青在线视频| 最新国产乱人伦偷精品免费网站| 日韩精品一区二区三区四| 黄色亚洲精品| 日韩精品 欧美| 噜噜噜在线观看免费视频日韩 | 久久丝袜美腿综合| 久久精品福利视频| 午夜一区二区三区四区| 欧美图片一区二区三区| 中文字幕在线观看国产| 欧美日韩的一区二区| 99精品人妻无码专区在线视频区| 欧美一级片免费看| 国精品人妻无码一区二区三区喝尿 | 欧美色女视频| 国产精品99久久久久久大便| 欧美体内she精视频在线观看| 久草视频国产在线| 久久久久国产精品午夜一区| 国产av人人夜夜澡人人爽| 日韩高清一区在线| 国产女同无遮挡互慰高潮91| 国产69精品一区二区亚洲孕妇| 亚洲欧美高清在线| 久久嫩草精品久久久久| 亚洲毛片亚洲毛片亚洲毛片| 亚洲女爱视频在线| 精品成人免费视频| 在线视频国内自拍亚洲视频| 国产精品爽爽久久| 亚洲精品一线二线三线无人区| 免费在线观看一级毛片| 精品国产一区二区三区在线观看 | 国产成人久久久精品一区| 日韩午夜视频在线| 国产精品一区二区三区在线| 精品国产日韩欧美| 轻点好疼好大好爽视频| 久久国产99| 亚洲欧洲国产视频| 国产亚洲一区二区三区在线观看| 日本黄色片免费观看| 精品色蜜蜜精品视频在线观看| 在线视频播放大全| 精品美女一区二区| av黄色在线观看| 国内精品久久久久影院优| 国产电影一区二区三区爱妃记| 99视频在线| 97精品在线| 老司机午夜av| 成人av在线网站| 爱爱视频免费在线观看| 色8久久人人97超碰香蕉987| 亚洲第一黄色片| 色偷偷噜噜噜亚洲男人的天堂| 国产剧情av在线播放| 91在线观看免费观看| 蜜臀91精品国产高清在线观看| 久久久久久久久国产精品| 男人天堂中文字幕| 亚洲444eee在线观看| 一级黄色片免费| 亚洲欧美精品在线| 美女日批视频在线观看| 成人午夜在线视频一区| 色综合综合色| 亚洲午夜精品久久久久久人妖| 国产成人精品网址| jizzjizzjizz国产| 欧美午夜精品伦理| 亚洲精品97久久中文字幕| 日韩亚洲第一页| 免费观看亚洲| 精品国产乱码久久久久久久软件| 91精品二区| 五月天亚洲视频| 26uuu国产一区二区三区| 久久草视频在线| 亚洲成人网久久久| 污污在线观看| 亚洲a区在线视频| 久久久久久美女精品| 亚洲成人福利在线| 国产精品卡一卡二卡三| 国产午夜无码视频在线观看| 亚洲伦理中文字幕| 亚洲欧洲美洲av| 蜜桃999成人看片在线观看| 亚洲三级毛片| 久久久午夜精品福利内容| 午夜精品一区二区三区电影天堂| 亚洲黄色在线观看视频| 欧美美最猛性xxxxxx| 欧美第一在线视频| 无颜之月在线看| 成人免费电影视频| 日本高清www免费视频| 亚洲精品国精品久久99热| www成人免费观看| 欧美激情专区| 日日摸夜夜添夜夜添精品视频| 男人的天堂av网| 欧美猛男超大videosgay| 米奇精品一区二区三区| 亚洲最大的av网站| 国产尤物精品| 特大黑人巨人吊xxxx| 在线观看亚洲精品视频| av在线中文| 91精品久久久久久蜜桃| 亚洲激情影院| 女~淫辱の触手3d动漫| 欧美日韩在线电影| 97caopron在线视频| 国精产品一区二区| 久久精品日韩欧美| 日韩一卡二卡在线观看| 欧美mv日韩mv国产网站| 美女100%一区| 久久99国产精品一区| 成人黄色在线视频| 亚洲天堂男人av| 久久久av网站| 国产视频一区二区三| 91国产福利在线| 日本免费中文字幕在线| 99久久99| 水野朝阳av一区二区三区| 蜜桃av.com| 亚洲成人网在线观看| 日本精品裸体写真集在线观看| 一级黄色录像免费看| 成人教育av在线| 五月婷婷丁香在线| 久久久久久久久久久人体 | 性欧美18一19内谢| 成人久久久精品乱码一区二区三区| 人妻丰满熟妇av无码区| 中文字幕欧美日韩va免费视频| 亚洲精品黑牛一区二区三区| 欧美国产激情视频| 自拍av一区二区三区| 天天摸天天碰天天爽天天弄| 国产精品日本精品| 一区在线免费| 美国精品一区二区| 亚洲第一精品久久忘忧草社区| 精品九九久久| 18岁网站在线观看| 亚洲女与黑人做爰| 国产片在线观看| 国产丝袜不卡| 国产麻豆日韩欧美久久|