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

SpringCloud Alibaba實戰之SpringCloud Gateway 請求響應日志

運維 數據庫運維
請求響應日志是日常開發調試定位問題的重要手段,在微服務中引入SpringCloud Gateway后我們希望在網關層統一進行日志的收集。

[[389666]]

本文轉載自微信公眾號「JAVA日知錄」,作者單一色調。轉載本文請聯系JAVA日知錄公眾號。 

請求響應日志是日常開發調試定位問題的重要手段,在微服務中引入SpringCloud Gateway后我們希望在網關層統一進行日志的收集。

本節內容將實現以下兩個功能:

獲取請求的輸入輸出參數,封裝成自定義日志

將日志發送到MongoDB進行存儲

獲取輸入輸出參數

首先我們先定義一個日志體

  1. @Data 
  2. public class GatewayLog { 
  3.     /**訪問實例*/ 
  4.     private String targetServer; 
  5.     /**請求路徑*/ 
  6.     private String requestPath; 
  7.     /**請求方法*/ 
  8.     private String requestMethod; 
  9.     /**協議 */ 
  10.     private String schema
  11.     /**請求體*/ 
  12.     private String requestBody; 
  13.     /**響應體*/ 
  14.     private String responseData; 
  15.     /**請求ip*/ 
  16.     private String ip; 
  17.  /**請求時間*/ 
  18.     private Date requestTime; 
  19.  /**響應時間*/ 
  20.     private Date responseTime; 
  21.     /**執行時間*/ 
  22.     private long executeTime; 

【關鍵】在網關定義日志過濾器,獲取輸入輸出參數

  1. /** 
  2.  * 日志過濾器,用于記錄日志 
  3.  * @author jianzh5 
  4.  * @date 2020/3/24 17:17 
  5.  */ 
  6. @Slf4j 
  7. @Component 
  8. public class AccessLogFilter implements GlobalFilter, Ordered { 
  9.     @Autowired 
  10.     private AccessLogService accessLogService; 
  11.  
  12.     private final List<HttpMessageReader<?>> messageReaders = HandlerStrategies.withDefaults().messageReaders(); 
  13.  
  14.     @Override 
  15.     public int getOrder() { 
  16.         return -100; 
  17.     } 
  18.  
  19.     @Override 
  20.     @SuppressWarnings("unchecked"
  21.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 
  22.  
  23.         ServerHttpRequest request = exchange.getRequest(); 
  24.  
  25.         // 請求路徑 
  26.         String requestPath = request.getPath().pathWithinApplication().value(); 
  27.  
  28.         Route route = getGatewayRoute(exchange); 
  29.  
  30.  
  31.         String ipAddress = WebUtils.getServerHttpRequestIpAddress(request); 
  32.  
  33.         GatewayLog gatewayLog = new GatewayLog(); 
  34.         gatewayLog.setSchema(request.getURI().getScheme()); 
  35.         gatewayLog.setRequestMethod(request.getMethodValue()); 
  36.         gatewayLog.setRequestPath(requestPath); 
  37.         gatewayLog.setTargetServer(route.getId()); 
  38.         gatewayLog.setRequestTime(new Date()); 
  39.         gatewayLog.setIp(ipAddress); 
  40.  
  41.         MediaType mediaType = request.getHeaders().getContentType(); 
  42.  
  43.         if(MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType) || MediaType.APPLICATION_JSON.isCompatibleWith(mediaType)){ 
  44.             return writeBodyLog(exchange, chain, gatewayLog); 
  45.         }else
  46.             return writeBasicLog(exchange, chain, gatewayLog); 
  47.         } 
  48.     } 
  49.  
  50.     private Mono<Void> writeBasicLog(ServerWebExchange exchange, GatewayFilterChain chain, GatewayLog accessLog) { 
  51.         StringBuilder builder = new StringBuilder(); 
  52.         MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams(); 
  53.         for (Map.Entry<String, List<String>> entry : queryParams.entrySet()) { 
  54.             builder.append(entry.getKey()).append("=").append(StringUtils.join(entry.getValue(), ",")); 
  55.         } 
  56.         accessLog.setRequestBody(builder.toString()); 
  57.  
  58.         //獲取響應體 
  59.         ServerHttpResponseDecorator decoratedResponse = recordResponseLog(exchange, accessLog); 
  60.  
  61.         return chain.filter(exchange.mutate().response(decoratedResponse).build()) 
  62.                 .then(Mono.fromRunnable(() -> { 
  63.                     // 打印日志 
  64.                     writeAccessLog(accessLog); 
  65.                 })); 
  66.     } 
  67.  
  68.  
  69.     /** 
  70.      * 解決 request body 只能讀取一次問題, 
  71.      * 參考: org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory 
  72.      * @param exchange 
  73.      * @param chain 
  74.      * @param gatewayLog 
  75.      * @return 
  76.      */ 
  77.     @SuppressWarnings("unchecked"
  78.     private Mono writeBodyLog(ServerWebExchange exchange, GatewayFilterChain chain, GatewayLog gatewayLog) { 
  79.         ServerRequest serverRequest = ServerRequest.create(exchange,messageReaders); 
  80.  
  81.         Mono<String> modifiedBody = serverRequest.bodyToMono(String.class) 
  82.                 .flatMap(body ->{ 
  83.                     gatewayLog.setRequestBody(body); 
  84.                     return Mono.just(body); 
  85.                 }); 
  86.  
  87.         // 通過 BodyInserter 插入 body(支持修改body), 避免 request body 只能獲取一次 
  88.         BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class); 
  89.         HttpHeaders headers = new HttpHeaders(); 
  90.         headers.putAll(exchange.getRequest().getHeaders()); 
  91.         // the new content type will be computed by bodyInserter 
  92.         // and then set in the request decorator 
  93.         headers.remove(HttpHeaders.CONTENT_LENGTH); 
  94.  
  95.         CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers); 
  96.  
  97.         return bodyInserter.insert(outputMessage,new BodyInserterContext()) 
  98.                 .then(Mono.defer(() -> { 
  99.                     // 重新封裝請求 
  100.                     ServerHttpRequest decoratedRequest = requestDecorate(exchange, headers, outputMessage); 
  101.  
  102.                     // 記錄響應日志 
  103.                     ServerHttpResponseDecorator decoratedResponse = recordResponseLog(exchange, gatewayLog); 
  104.  
  105.                     // 記錄普通的 
  106.                     return chain.filter(exchange.mutate().request(decoratedRequest).response(decoratedResponse).build()) 
  107.                             .then(Mono.fromRunnable(() -> { 
  108.                                 // 打印日志 
  109.                                 writeAccessLog(gatewayLog); 
  110.                             })); 
  111.                 })); 
  112.     } 
  113.  
  114.     /** 
  115.      * 打印日志 
  116.      * @author javadaily 
  117.      * @date 2021/3/24 14:53 
  118.      * @param gatewayLog 網關日志 
  119.      */ 
  120.     private void writeAccessLog(GatewayLog gatewayLog) { 
  121.         log.info(gatewayLog.toString());   
  122.     } 
  123.  
  124.  
  125.  
  126.     private Route getGatewayRoute(ServerWebExchange exchange) { 
  127.         return exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); 
  128.     } 
  129.  
  130.  
  131.     /** 
  132.      * 請求裝飾器,重新計算 headers 
  133.      * @param exchange 
  134.      * @param headers 
  135.      * @param outputMessage 
  136.      * @return 
  137.      */ 
  138.     private ServerHttpRequestDecorator requestDecorate(ServerWebExchange exchange, HttpHeaders headers, 
  139.                                                        CachedBodyOutputMessage outputMessage) { 
  140.         return new ServerHttpRequestDecorator(exchange.getRequest()) { 
  141.             @Override 
  142.             public HttpHeaders getHeaders() { 
  143.                 long contentLength = headers.getContentLength(); 
  144.                 HttpHeaders httpHeaders = new HttpHeaders(); 
  145.                 httpHeaders.putAll(super.getHeaders()); 
  146.                 if (contentLength > 0) { 
  147.                     httpHeaders.setContentLength(contentLength); 
  148.                 } else { 
  149.                     // TODO: this causes a 'HTTP/1.1 411 Length Required' // on 
  150.                     // httpbin.org 
  151.                     httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); 
  152.                 } 
  153.                 return httpHeaders; 
  154.             } 
  155.  
  156.             @Override 
  157.             public Flux<DataBuffer> getBody() { 
  158.                 return outputMessage.getBody(); 
  159.             } 
  160.         }; 
  161.     } 
  162.  
  163.  
  164.     /** 
  165.      * 記錄響應日志 
  166.      * 通過 DataBufferFactory 解決響應體分段傳輸問題。 
  167.      */ 
  168.     private ServerHttpResponseDecorator recordResponseLog(ServerWebExchange exchange, GatewayLog gatewayLog) { 
  169.         ServerHttpResponse response = exchange.getResponse(); 
  170.         DataBufferFactory bufferFactory = response.bufferFactory(); 
  171.  
  172.         return new ServerHttpResponseDecorator(response) { 
  173.             @Override 
  174.             public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { 
  175.                 if (body instanceof Flux) { 
  176.                     Date responseTime = new Date(); 
  177.                     gatewayLog.setResponseTime(responseTime); 
  178.                     // 計算執行時間 
  179.                     long executeTime = (responseTime.getTime() - gatewayLog.getRequestTime().getTime()); 
  180.  
  181.                     gatewayLog.setExecuteTime(executeTime); 
  182.  
  183.                     // 獲取響應類型,如果是 json 就打印 
  184.                     String originalResponseContentType = exchange.getAttribute(ServerWebExchangeUtils.ORIGINAL_RESPONSE_CONTENT_TYPE_ATTR); 
  185.  
  186.  
  187.                     if (ObjectUtil.equal(this.getStatusCode(), HttpStatus.OK) 
  188.                             && StringUtil.isNotBlank(originalResponseContentType) 
  189.                             && originalResponseContentType.contains("application/json")) { 
  190.  
  191.                         Flux<? extends DataBuffer> fluxBody = Flux.from(body); 
  192.                         return super.writeWith(fluxBody.buffer().map(dataBuffers -> { 
  193.  
  194.                             // 合并多個流集合,解決返回體分段傳輸 
  195.                             DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); 
  196.                             DataBuffer join = dataBufferFactory.join(dataBuffers); 
  197.                             byte[] content = new byte[join.readableByteCount()]; 
  198.                             join.read(content); 
  199.  
  200.                             // 釋放掉內存 
  201.                             DataBufferUtils.release(join); 
  202.                             String responseResult = new String(content, StandardCharsets.UTF_8); 
  203.  
  204.  
  205.  
  206.                             gatewayLog.setResponseData(responseResult); 
  207.  
  208.                             return bufferFactory.wrap(content); 
  209.                         })); 
  210.                     } 
  211.                 } 
  212.                 // if body is not a flux. never got there. 
  213.                 return super.writeWith(body); 
  214.             } 
  215.         }; 
  216.     } 

代碼較長建議直接拷貝到編輯器,只要注意下面一個關鍵點:

getOrder()方法返回的值必須要<-1,「否則標準的NettyWriteResponseFilter將在您的過濾器被調用的機會之前發送響應,即不會執行獲取后端響應參數的方法」

通過上面的兩步我們已經可以獲取到請求的輸入輸出參數了,在 writeAccessLog()中將其輸出到了日志文件,大家可以在Postman發送請求觀察日志。

存儲日志

如果需要將日志持久化方便后期檢索的話可以考慮將日志存儲在MongoDB中,實現過程很簡單。(安裝MongoDB可以參考這篇文章:實戰|MongoDB的安裝配置)

  • 引入MongoDB
  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> 
  4. </dependency> 

 

由于gateway是基于webflux,所以我們需要選擇reactive版本。

  • 在GatewayLog上添加對應的注解
  1. @Data 
  2. @Document 
  3. public class GatewayLog { 
  4.     @Id 
  5.     private String id; 
  6.  ... 
  • 建立AccessLogRepository
  1. @Repository 
  2. public interface AccessLogRepository extends ReactiveMongoRepository<GatewayLog,String> { 
  3.    
  • 建立Service
  1. public interface AccessLogService { 
  2.  
  3.     /** 
  4.      * 保存AccessLog 
  5.      * @param gatewayLog 請求響應日志 
  6.      * @return 響應日志 
  7.      */ 
  8.     Mono<GatewayLog> saveAccessLog(GatewayLog gatewayLog); 
  9.  
  • 建立實現類
  1. @Service 
  2. public class AccessLogServiceImpl implements AccessLogService { 
  3.     @Autowired 
  4.     private AccessLogRepository accessLogRepository; 
  5.  
  6.     @Override 
  7.     public Mono<GatewayLog> saveAccessLog(GatewayLog gatewayLog) { 
  8.         return accessLogRepository.insert(gatewayLog); 
  9.     } 
  • 在Nacos配置中心添加MongoDB對應配置
  1. spring: 
  2.   data: 
  3.     mongodb: 
  4.       host: xxx.xx.x.xx 
  5.       port: 27017 
  6.       database: accesslog 
  7.       username: accesslog 
  8.       password: xxxxxx 

執行請求,打開MongoDB客戶端,查看日志結果

 

以上,希望對你有所幫助!

 

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2021-05-14 09:15:32

SpringCloud微服務日志

2022-04-09 14:45:02

微服務常見概念Spring

2024-06-04 10:05:48

微服務網關日志

2021-08-02 09:27:02

微服務接口場景

2022-05-29 21:38:11

限流熔斷流量

2021-03-09 09:33:42

網關授權微服務

2021-01-28 10:10:51

微服務后端SpringCloud

2023-11-08 07:45:47

Spring微服務

2022-04-27 08:23:34

微服務負載均衡

2021-04-22 09:31:58

服務器微服務配置

2021-02-04 09:18:20

服務器認證自定義

2022-08-29 06:27:15

Nacos微服務

2025-04-17 02:00:00

2021-06-09 09:42:50

SpringCloud微服務灰度發布

2021-07-07 06:38:33

SpringCloud路由配置定位原理分析

2021-08-26 11:52:32

FeignWeb服務

2017-04-13 11:06:28

SpringCloud隨機端口

2022-05-16 08:22:11

網關過濾器路由

2022-05-12 08:21:13

項目網關模塊

2022-06-12 07:27:39

微服務GateWay
點贊
收藏

51CTO技術棧公眾號

欧美日韩一本到| 日韩中文字幕区一区有砖一区| 日韩欧美国产网站| 蜜桃传媒视频第一区入口在线看| 日韩字幕在线观看| 亚洲小说图片视频| 欧美亚州韩日在线看免费版国语版| 欧美日韩免费精品| 亚洲在线视频播放| 久久超碰99| 欧美亚洲国产一区二区三区 | 成人午夜亚洲| 亚洲日穴在线视频| 国产乱子伦精品| 日韩免费av网站| 亚洲啊v在线观看| 精品国产乱码久久久久久图片| 免费在线a视频| 在线观看av黄网站永久| 国产精品资源在线看| 久久久久久av| 中文字幕第3页| 本网站久久精品| 伊人色综合久久天天人手人婷| 国外成人在线视频网站| 波多野结衣一二区| 国产精品av一区二区| 亚洲欧洲偷拍精品| 无套内谢丰满少妇中文字幕| 在线视频超级| 自拍偷自拍亚洲精品播放| 国产精品一级久久久| 中文字幕在线网址| 亚洲每日更新| 久久亚洲精品成人| 97人妻精品一区二区免费| 国产激情精品一区二区三区| 精品久久香蕉国产线看观看gif| 亚洲开发第一视频在线播放| 天堂在线资源网| 久久国产精品一区二区| 97香蕉久久超级碰碰高清版 | 真人抽搐一进一出视频| aaa在线观看| proumb性欧美在线观看| 成人国产在线激情| 精品久久久久久久久久久国产字幕| 在线一区免费| 在线视频一区二区| 免费在线观看成年人视频| 国产精品777777在线播放| 一本一本久久a久久精品综合麻豆| 国产欧美综合一区| 中国日本在线视频中文字幕| 国产丝袜欧美中文另类| 精品一区久久久久久| 亚洲老妇色熟女老太| 精品一区二区综合| 国产精品免费视频xxxx| 在线精品免费视| 国产日韩欧美| 97国产成人精品视频| 麻豆chinese极品少妇| 99久久99视频只有精品| 中文字幕亚洲欧美一区二区三区 | 91在线成人| 色综合久久综合网欧美综合网| 日本香蕉视频在线观看| 久草资源在线| 国产精品国产三级国产aⅴ入口| 欧美另类高清视频在线| 日本一区二区三区在线观看视频| 不卡的av电影| 国产一区高清视频| 国产成人三级在线观看视频| 国产91色综合久久免费分享| 91超碰在线电影| 亚洲视频在线免费播放| 日韩不卡免费视频| 国产精品高潮粉嫩av| 91视频久久久| 日韩精品亚洲一区二区三区免费| 国产999在线观看| 日本熟妇色xxxxx日本免费看| 欧美xxxx中国| 日韩视频在线一区| 国产十六处破外女视频| 国语自产精品视频在线看8查询8| 欧美高清在线观看| 国产香蕉在线视频| 国产欧美日韩一区二区三区在线| 人体精品一二三区| 波多野结衣在线电影| 奇米888四色在线精品| 国产日韩精品视频| 国产成人三级在线播放 | 国产原创中文av| 国产激情偷乱视频一区二区三区| 成人3d动漫一区二区三区91| 天堂中文在线官网| 国产拍揄自揄精品视频麻豆| 天堂√在线观看一区二区| 国产色在线观看| 亚洲国产精品欧美一二99| 中国丰满人妻videoshd | 国产玖玖精品视频| 性猛交xxxx乱大交孕妇印度| fc2成人免费人成在线观看播放| 久久精品成人一区二区三区蜜臀| 触手亚洲一区二区三区| 亚洲欧美色图小说| 国产av天堂无码一区二区三区| 中文在线а√天堂| 制服丝袜在线91| 亚洲精品一区二区18漫画| aiai久久| 亚洲午夜av电影| 成人免费精品动漫网站| 欧美日韩蜜桃| 日韩美女免费线视频| 国产精品国产三级国产aⅴ| 99久久久精品免费观看国产蜜| 日本不卡一区二区三区视频| 超碰电影在线播放| 一本久久a久久精品亚洲| 亚洲综合123| 久久av导航| 欧美成人亚洲成人| 国内精品福利视频| 韩国v欧美v日本v亚洲v| 久久综合久久久| www免费视频观看在线| 欧美性猛交xxxx富婆弯腰| 日本一二三四区视频| 国产探花在线精品| 久久久免费高清电视剧观看| 中文字幕精品一区二| www.亚洲免费av| 一级黄色录像免费看| 久久精品女人天堂av免费观看| 884aa四虎影成人精品一区| 人人妻人人澡人人爽人人精品| 日韩精品dvd| 欧美专区在线播放| 午夜精品一区二区三| 国产精品传媒视频| 黄色三级视频在线| 亚洲精品无吗| 性视频1819p久久| 国产手机精品视频| 国产精品毛片久久久久久久| 国产日产欧美视频| 激情av综合| 日韩在线播放av| 天天插天天操天天干| 丁香一区二区三区| 日本精品免费视频| 91成人精品观看| 色妞色视频一区二区三区四区| 东京热一区二区三区四区| 成人美女在线观看| 中文字幕の友人北条麻妃| 亚洲高清影院| 色阁综合伊人av| 波多野结衣一区二区三区在线| 91热门视频在线观看| 国产 日韩 亚洲 欧美| 999久久精品| 欧美久久精品午夜青青大伊人| 一本久道久久综合无码中文| 中文字幕高清一区| 中文字幕第88页| 国产韩日影视精品| 91久久久久久久一区二区| 浮生影视网在线观看免费| 欧美性少妇18aaaa视频| 精品夜夜澡人妻无码av | 国产美女在线一区| 久久九九热re6这里有精品| 91国产视频在线| 在线观看xxx| 亚洲成人激情自拍| 国产精品探花一区二区在线观看| 久久不射网站| 一级特黄录像免费播放全99| 99精品视频在线免费播放| 欧美wwwxxxx| 日本精品999| 欧美性猛交xxxx富婆| 中文字幕第24页| 国产最新精品免费| 日本人妻伦在线中文字幕| 国产精品调教视频| 日韩免费在线看| 国产色a在线| 欧美日韩国产一级片| www.av视频| 99久久精品一区| 国产97色在线 | 日韩| 天天操综合网| 国产区一区二区三区| 欧美www.| 欧美裸体xxxx极品少妇| 午夜激情小视频| 狠狠综合久久av一区二区小说| 搡老熟女老女人一区二区| 老司机一区二区| 男人的天堂成人| 青青久久av| 国产视频福利一区| 国产蜜臀一区二区打屁股调教| 亚洲美女中文字幕| 国产又粗又大又黄| 欧美日韩国内自拍| 中文字幕资源站| 精品无人码麻豆乱码1区2区| 九九热只有这里有精品| 精品freesex老太交| 亚洲综合日韩在线| gay欧美网站| 亚洲一区二区黄| 亚洲第一色视频| 欧美亚洲禁片免费| 亚洲日本韩国在线| 亚洲日本成人在线观看| 在线免费观看黄色小视频| 国产最新精品免费| 欧美日韩黄色一级片| 99精品在线| 日本高清久久一区二区三区| 日本免费一区二区视频| 国产精品欧美亚洲777777| 激情在线小视频| 亚洲天天在线日亚洲洲精| 动漫av一区二区三区| 欧美三级电影精品| 影音先锋在线国产| 亚洲一区二区三区四区在线| 91麻豆制片厂| 2024国产精品| 欧美图片自拍偷拍| 精品一区二区三区在线播放视频 | 天堂中文在线资源| 日韩一级片网站| 伊人久久亚洲综合| 91成人免费在线视频| 五月天婷婷丁香| 一区二区三区四区中文字幕| 5566中文字幕| 国产精品午夜免费| 永久免费看mv网站入口78| 成人精品高清在线| gogo亚洲国模私拍人体| 久久99久久99精品免视看婷婷 | 呦呦在线视频| 久久精品影视伊人网| 日本在线免费播放| 日韩av在线免费播放| 全部免费毛片在线播放一个| 欧美一级久久久久久久大片| 国产精品久久久久久久免费看| 精品国产乱码久久久久久天美| 久久国产精品波多野结衣av| 亚洲精品国产第一综合99久久| av成人免费网站| 亚洲色大成网站www久久九九| 无码人妻精品一区二区中文| xnxx国产精品| 国产成人精品无码免费看夜聊软件| 久久综合色综合88| 国产精品无码一区二区三| 成人动漫精品一区二区| 中国特级黄色大片| av电影天堂一区二区在线观看| 精品国产一区在线| gogo大胆日本视频一区| 欧美大片免费播放器| 91丨九色丨国产丨porny| 亚洲做受高潮无遮挡| 26uuu精品一区二区三区四区在线| 极品白嫩丰满美女无套| 国产丝袜欧美中文另类| 日韩精品久久久久久久的张开腿让| 国产精品乱码久久久久久| 黄色录像免费观看| 一区二区三区自拍| 亚洲日本韩国在线| 欧美在线观看一区| 一级特黄aaaaaa大片| 日韩午夜在线观看视频| 视频一区 中文字幕| 亚洲人成自拍网站| 蜜芽在线免费观看| 久久成人综合视频| 国产高清视频色在线www| 日韩美女激情视频| 亚洲久草在线| 国产高清自拍一区| 免费短视频成人日韩| 亚洲综合首页| 国模吧视频一区| 无码人妻精品一区二区蜜桃网站| 中文字幕不卡在线观看| 欧洲s码亚洲m码精品一区| 18aaaa精品欧美大片h| 国产精品2018| 免费观看性欧美大片无片| 久久久综合香蕉尹人综合网| 日本一区二区三区视频| r级无码视频在线观看| 麻豆精品蜜桃视频网站| 老司机免费视频| 中文字幕中文乱码欧美一区二区| 亚洲国产成人精品激情在线| 欧美丰满少妇xxxxx高潮对白| 性xxxx搡xxxxx搡欧美| 欧美精品生活片| 午夜av成人| 精品一区二区三区免费毛片| 欧美91大片| 91亚洲免费视频| 久久久另类综合| 久久久久久久极品内射| 欧美精品黑人性xxxx| 国产高清视频在线播放| 欧美一区二区三区……| 国产成人一二| 日本精品福利视频| 久久国产欧美日韩精品| 国产黄色大片免费看| 偷拍与自拍一区| 亚洲精品一区二区三区蜜桃| 久久夜精品va视频免费观看| 久久久久黄色| 五月天亚洲综合| 一区二区日韩免费看| jjzz黄色片| 亚洲乱码国产乱码精品精可以看| 中文字幕日韩经典| 亚洲日韩中文字幕在线播放| videos性欧美另类高清| 精品一区二区三区视频日产| aa亚洲婷婷| 五月开心播播网| 天天综合色天天综合色h| 日韩性xxxx| 91精品国产91久久久久| 激情小说亚洲色图| 波多野结衣家庭教师在线| 9色porny自拍视频一区二区| 国产精品第108页| 亚洲第一中文字幕| 国产精品电影| 精品欧美日韩| 久久精品动漫| 欧美 日韩 成人| 欧美三区免费完整视频在线观看| 日韩在线观看www| 91久久综合亚洲鲁鲁五月天| 女人香蕉久久**毛片精品| 两女双腿交缠激烈磨豆腐| 一区二区三区四区蜜桃| 六月丁香综合网| 91禁外国网站| 日本道不卡免费一区| 九九精品久久久| 一区二区三区在线视频播放| 理论片中文字幕| 欧美专区福利在线| 欧美一区电影| 在线观看av免费观看| 亚洲综合激情另类小说区| 婷婷丁香花五月天| 国产成人综合av| 欧美激情1区| 国产网站无遮挡| 精品视频在线免费看| av免费在线免费| 国产一区二区精品在线| 久久久久久婷| 婷婷伊人五月天| 亚洲第一中文字幕| 成人精品国产亚洲| 69精品丰满人妻无码视频a片| av高清不卡在线| 一级aaaa毛片| 国内外成人免费激情在线视频网站| 亚洲美女15p| 欧美激情第四页| 欧美性xxxxxxxxx| 欧美日本一道| 久久99久久精品国产| 美女视频第一区二区三区免费观看网站| 国产67194| 亚洲欧美精品在线| 国产亚洲久久| 激情综合网俺也去| 亚洲综合视频在线观看| 91大神xh98hx在线播放| 国产日韩欧美精品|