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

基于SpringBoot實現讓日志像詩一樣有韻律

開發 架構
在傳統系統中,如果能夠提供日志輸出,基本上已經能夠滿足需求的。但一旦將系統拆分成兩套及以上的系統,再加上負載均衡等,調用鏈路就變得復雜起來。

 [[392965]]

前言

在傳統系統中,如果能夠提供日志輸出,基本上已經能夠滿足需求的。但一旦將系統拆分成兩套及以上的系統,再加上負載均衡等,調用鏈路就變得復雜起來。

特別是進一步向微服務方向演化,如果沒有日志的合理規劃、鏈路追蹤,那么排查日志將變得異常困難。

比如系統A、B、C,調用鏈路為A -> B -> C,如果每套服務都是雙活,則調用路徑有2的三次方種可能性。如果系統更多,服務更多,調用鏈路則會成指數增長。

因此,無論是幾個簡單的內部服務調用,還是復雜的微服務系統,都需要通過一個機制來實現日志的鏈路追蹤。讓你系統的日志輸出,像詩一樣有形式美,又有和諧的韻律。

日志追蹤其實已經有很多現成的框架了,比如Sleuth、Zipkin等組件。但這不是我們要講的重點,本文重點基于Spring Boot、LogBack來手寫實現一個簡單的日志調用鏈路追蹤功能。基于此實現模式,大家可以更細粒度的去實現。

Spring Boot中集成Logback

Spring Boot本身就內置了日志功能,這里使用logback日志框架,并對輸出結果進行格式化。先來看一下SpringBoot對Logback的內置集成,依賴關系如下。當項目中引入了:

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

spring-boot-starter-web中間接引入了:

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

spring-boot-starter又引入了logging的starter:

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

在logging中真正引入了所需的logback包:

  1. <dependency> 
  2.   <groupId>ch.qos.logback</groupId> 
  3.   <artifactId>logback-classic</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.   <groupId>org.apache.logging.log4j</groupId> 
  7.   <artifactId>log4j-to-slf4j</artifactId> 
  8. </dependency> 
  9. <dependency> 
  10.   <groupId>org.slf4j</groupId> 
  11.   <artifactId>jul-to-slf4j</artifactId> 
  12. </dependency> 

因此,我們使用時,只需將logback-spring.xml配置文件放在resources目錄下即可。理論上配置文件命名為logback.xml也是支持的,但Spring Boot官網推薦使用的名稱為:logback-spring.xml。

然后,在logback-spring.xml中進行日志輸出的配置即可。這里不貼全部代碼了,只貼出來相關日志輸出格式部分,以控制臺輸出為例:

在value屬性的表達式中,我們新增了自定義的變量值requestId,通過“[%X{requestId}]”的形式來展示。

這個requestId便是我們用來追蹤日志的唯一標識。如果一個請求,從頭到尾都使用了同一個requestId便可以把整個請求鏈路串聯起來。如果系統還基于EKL等日志搜集工具進行統一收集,就可以更方便的查看整個日志的調用鏈路了。

那么,這個requestId變量是如何來的,又存儲在何處呢?要了解這個,我們要先來了解一下日志框架提供的MDC功能。

什么是MDC?

MDC(Mapped Diagnostic Contexts) 是一個線程安全的存放診斷日志的容器。MDC是slf4j提供的適配其他具體日志實現包的工具類,目前只有logback和log4j支持此功能。

MDC是線程獨立、線程安全的,通常無論是HTTP還是RPC請求,都是在各自獨立的線程中完成的,這與MDC的機制可以很好地契合。

在使用MDC功能時,我們主要使用是put方法,該方法間接的調用了MDCAdapter接口的put方法。

看一下接口MDCAdapter其中一個實現類BasicMDCAdapter中的代碼來:

  1. public class BasicMDCAdapter implements MDCAdapter { 
  2.  
  3.     private InheritableThreadLocal<Map<String, String>> inheritableThreadLocal = new InheritableThreadLocal<Map<String, String>>() { 
  4.         @Override 
  5.         protected Map<String, String> childValue(Map<String, String> parentValue) { 
  6.             if (parentValue == null) { 
  7.                 return null
  8.             } 
  9.             return new HashMap<String, String>(parentValue); 
  10.         } 
  11.     }; 
  12.  
  13.     public void put(String key, String val) { 
  14.         if (key == null) { 
  15.             throw new IllegalArgumentException("key cannot be null"); 
  16.         } 
  17.         Map<String, String> map = inheritableThreadLocal.get(); 
  18.         if (map == null) { 
  19.             map = new HashMap<String, String>(); 
  20.             inheritableThreadLocal.set(map); 
  21.         } 
  22.         map.put(key, val); 
  23.     } 
  24.     // ... 

通過源碼可以看出內部持有一個InheritableThreadLocal的實例,該實例中通過HashMap來保存context數據。

此外,MDC提供了put/get/clear等幾個核心接口,用于操作ThreadLocal中存儲的數據。而在logback.xml中,可在layout中通過聲明“%X{requestId}”這種形式來獲得MDC中存儲的數據,并進行打印此信息。

基于MDC的這些特性,因此它經常被用來做日志鏈路跟蹤、動態配置用戶自定義信息(比如requestId、sessionId等)等場景。

實戰使用

上面了解了一些基礎的原理知識,下面我們就來看看如何基于日志框架的MDC功能實現日志的追蹤。

工具類準備

首先定義一些工具類,這個強烈建議大家將一些操作通過工具類的形式進行實現,這是寫出優雅代碼的一部分,也避免后期修改時每個地方都需要改。

TraceID(我們定義參數名為requestId)的生成類,這里采用UUID進行生成,當然可根據你的場景和需要,通過其他方式進行生成。

  1. public class TraceIdUtils { 
  2.  
  3.     /** 
  4.      * 生成traceId 
  5.      * 
  6.      * @return TraceId 基于UUID 
  7.      */ 
  8.     public static String getTraceId() { 
  9.         return UUID.randomUUID().toString().replace("-"""); 
  10.     } 

對Context內容的操作工具類TraceIdContext:

  1. public class TraceIdContext { 
  2.  
  3.     public static final String TRACE_ID_KEY = "requestId"
  4.  
  5.     public static void setTraceId(String traceId) { 
  6.         if (StringLocalUtil.isNotEmpty(traceId)) { 
  7.             MDC.put(TRACE_ID_KEY, traceId); 
  8.         } 
  9.     } 
  10.  
  11.     public static String getTraceId() { 
  12.         String traceId = MDC.get(TRACE_ID_KEY); 
  13.         return traceId == null ? "" : traceId; 
  14.     } 
  15.  
  16.     public static void removeTraceId() { 
  17.         MDC.remove(TRACE_ID_KEY); 
  18.     } 
  19.  
  20.     public static void clearTraceId() { 
  21.         MDC.clear(); 
  22.     } 
  23.  

通過工具類,方便所有服務統一使用,比如requestId可以統一定義,避免每處都不一樣。這里不僅提供了set方法,還提供了移除和清理的方法。

需要注意的是,MDC.clear()方法的使用。如果所有的線程都是通過new Thread方法建立的,線程消亡之后,存儲的數據也隨之消亡,這倒沒什么。但如果采用的是線程池的情況時,線程是可以被重復利用的,如果之前線程的MDC內容沒有清除掉,再次從線程池中獲取這個線程,會取出之前的數據(臟數據),會導致一些不可預期的錯誤,所以當前線程結束后一定要清掉。

Filter攔截

既然我們要實現日志鏈路的追蹤,最直觀的思路就是在訪問的源頭生成一個請求ID,然后一路傳下去,直到這個請求完成。這里以Http為例,通過Filter來攔截請求,并將數據通過Http的Header來存儲和傳遞數據。涉及到系統之間調用時,調用方設置requestId到Header中,被調用方從Header中取即可。

Filter的定義:

  1. public class TraceIdRequestLoggingFilter extends AbstractRequestLoggingFilter { 
  2.  
  3.     @Override 
  4.     protected void beforeRequest(HttpServletRequest request, String message) { 
  5.         String requestId = request.getHeader(TraceIdContext.TRACE_ID_KEY); 
  6.         if (StringLocalUtil.isNotEmpty(requestId)) { 
  7.             TraceIdContext.setTraceId(requestId); 
  8.         } else { 
  9.             TraceIdContext.setTraceId(TraceIdUtils.getTraceId()); 
  10.         } 
  11.     } 
  12.  
  13.     @Override 
  14.     protected void afterRequest(HttpServletRequest request, String message) { 
  15.         TraceIdContext.removeTraceId(); 
  16.     } 

在beforeRequest方法中,從Header中獲取requestId,如果獲取不到則視為“源頭”,生成一個requestId,設置到MDC當中。當這個請求完成時,將設置的requestId移除,防止上面說到的線程池問題。系統中每個服務都可以通過上述方式實現,整個請求鏈路就串起來了。

當然,上面定義的Filter是需要進行初始化的,在Spring Boot中實例化方法如下:

  1. @Configuration 
  2. public class TraceIdConfig { 
  3.  
  4.     @Bean 
  5.     public TraceIdRequestLoggingFilter traceIdRequestLoggingFilter() { 
  6.         return new TraceIdRequestLoggingFilter(); 
  7.     } 

針對普通的系統調用,上述方式基本上已經能滿足了,實踐中可根據自己的需要在此基礎上進行擴展。這里使用的是Filter,也可以通過攔截器、Spring的AOP等方式進行實現。

微服務中的Feign

如果你的系統是基于Spring Cloud中的Feign組件進行調用,則可通過實現RequestInterceptor攔截器來達到添加requestId效果。具體實現如下:

  1. @Configuration 
  2. public class FeignConfig implements RequestInterceptor { 
  3.  
  4.     @Override 
  5.     public void apply(RequestTemplate requestTemplate) { 
  6.         requestTemplate.header(TraceIdContext.TRACE_ID_KEY, TraceIdContext.getTraceId()); 
  7.     } 
  8.  

結果驗證

當完成上述操作之后,對一個Controller進行請求,會打印如下的日志:

  1. 2021-04-13 10:58:31.092 cloud-sevice-consumer-demo [http-nio-7199-exec-1] INFO  [ef76526ca96242bc8e646cdef3ab31e6] c.b.demo.controller.CityController - getCity 
  2. 2021-04-13 10:58:31.185 cloud-sevice-consumer-demo [http-nio-7199-exec-1] WARN  [ef76526ca96242bc8e646cdef3ab31e6] o.s.c.o.l.FeignBlockingLoadBalancerClient - 

可以看到requestID已經被成功添加。當我們排查日志時,只需找到請求的關鍵信息,然后根據關鍵信息日志中的requestId值就可以把整個日志串聯起來。

小結

最后,我們來回顧一下日志追蹤的整個過程:當請求到達第一個服務器,服務檢查requestId是否存在,如果不存在,則創建一個,放入MDC當中;服務調用其他服務時,再通過Header將requestId進行傳遞;而每個服務的logback配置requestId的輸出。從而達到從頭到尾將日志串聯的效果。

在學習本文,如果你只學到了日志追蹤,那是一種損失,因為文中還涉及到了SpringBoot對logback的集成、MDC的底層實現及坑、過濾器的使用、Feign的請求攔截器等。如果感興趣,每個都可以發散一下,學習到更多的知識點。

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2017-05-22 10:33:14

PythonJuliaCython

2011-10-24 13:07:00

2025-05-19 08:24:29

圖片加載開發

2009-12-08 18:06:12

戴爾存儲動車組

2009-12-08 14:26:13

大型網絡運維

2023-04-05 14:19:07

FlinkRedisNoSQL

2021-10-02 10:36:00

YAML編程語言軟件開發

2012-10-26 12:33:58

視頻會議視頻通信華為

2022-07-28 14:46:01

人工智能機器人計算機科學

2023-05-23 13:59:41

RustPython程序

2013-12-17 09:02:03

Python調試

2022-12-21 15:56:23

代碼文檔工具

2013-12-31 09:19:23

Python調試

2015-11-06 16:20:36

107

2013-07-05 14:59:50

程序員GPU

2015-11-09 10:07:11

107

2022-12-30 10:48:27

2021-04-23 15:13:16

算法模型技術

2020-03-09 10:00:35

人工智能機器學習技術

2021-05-20 08:37:32

multiprocesPython線程
點贊
收藏

51CTO技術棧公眾號

欧美精品久久一区二区| 欧美mv日韩mv亚洲| 自拍亚洲欧美老师丝袜| 国产欧美日韩成人| 一本一本久久| xx视频.9999.com| 欧美在线一级片| 精品国产黄a∨片高清在线| 日韩一区欧美小说| 国产亚洲福利社区| 91精品中文字幕| 亚洲最黄网站| 欧美精品日韩三级| 性欧美精品男男| japanese色系久久精品| 欧美日韩一区三区四区| 91专区在线观看| 国产三级在线播放| 国产三级精品三级| 国产专区一区二区三区| 国产熟女一区二区丰满| 丝袜诱惑制服诱惑色一区在线观看| 久久中文字幕在线| www在线观看免费视频| 影音先锋欧美激情| 欧美精品成人一区二区三区四区| 国产91在线免费| 中文国产字幕在线观看| 欧美韩国日本不卡| 久久久亚洲综合网站| 老牛影视av牛牛影视av| 久久se精品一区精品二区| 国产精品成人国产乱一区| 日韩成人免费观看| 欧美日韩国产免费观看| 久久久999精品视频| 成年人视频软件| 激情婷婷综合| 亚洲美女在线看| 你懂的在线观看网站| 网站一区二区| 日韩欧美国产三级电影视频| www.桃色.com| 四虎精品一区二区免费| 欧美色综合天天久久综合精品| 欧美日韩第二页| 亚洲精品88| 岛国av在线不卡| av之家在线观看| 91超碰免费在线| 午夜一区二区三区视频| 18黄暴禁片在线观看| 美女网站视频在线| 亚洲午夜激情av| 2018日日夜夜| 午夜影院在线播放| 欧美性猛交丰臀xxxxx网站| 男人操女人逼免费视频| 亚洲性色av| 在线观看亚洲一区| 中日韩av在线播放| 精品国产一区二区三区2021| 日韩一区二区三区免费观看| 中文字幕亚洲日本| 成人在线视频你懂的| 亚洲国产精品yw在线观看| 亚洲精品乱码久久| 国产精品视频一区二区三区四蜜臂| 亚洲日韩中文字幕在线播放| 免费黄色片网站| 亚洲午夜精品一区 二区 三区| 欧美精品做受xxx性少妇| 国产精品美女久久久久av超清| 欧美人妻精品一区二区免费看| 欧美黄在线观看| 久久露脸国产精品| 久久国产视频一区| 美女高潮久久久| 97超碰人人看人人| 亚洲 欧美 精品| 国产欧美一区二区精品秋霞影院| 中文字幕一区二区中文字幕| 日本h片在线| 欧美日韩亚洲视频| 黄色一级片免费的| 成人福利免费在线观看| 亚洲天堂一区二区三区| 欧美成人777| 99精品视频免费观看视频| 国产精品高潮粉嫩av| aaa一区二区三区| 99精品欧美一区| 亚洲欧美影院| а√天堂中文在线资源8| 亚洲精品伦理在线| 无码专区aaaaaa免费视频| **在线精品| 日韩视频一区二区三区在线播放 | 竹内纱里奈兽皇系列在线观看| 色999日韩国产欧美一区二区| 岛国av免费在线| 欧美18xxxx| 日韩中文字幕免费视频| 日韩特级黄色片| 国产乱子轮精品视频| 欧美精品亚洲精品| 波多野结衣在线播放| 欧美日本不卡视频| 麻豆av免费观看| 国内精品福利| 成人久久久久爱| 大片免费播放在线视频| 久久福利网址导航| 老司机福利av| 欧美久久99| 国产精品久久久久久久久免费看| 亚洲av无码乱码国产麻豆| 国产目拍亚洲精品99久久精品| 日本手机在线视频| 国产aⅴ精品一区二区四区| 亚洲欧美国产视频| 日本中文字幕在线免费观看| 国产一区二区日韩精品| 色姑娘综合av| 欧美大胆成人| 亚洲精品一区av在线播放| 久久久精品91| 国产高清亚洲一区| 午夜在线视频免费观看| 国产精品伦一区二区| 亚洲视频在线免费观看| 好看的av在线| aaa欧美色吧激情视频| 日韩网站在线免费观看| 日韩有吗在线观看| 麻豆国产精品va在线观看不卡| 中文字幕日韩国产| 中文字幕免费不卡在线| 精品999在线| 欧美在线观看视频一区| 国产91在线播放精品91| 九一国产在线| 日本道在线观看一区二区| 素人fc2av清纯18岁| 亚洲少妇诱惑| 精品国产乱码久久久久| 国产在线88av| 亚洲激情在线观看| 日日夜夜综合网| 99免费精品在线观看| 国产二级片在线观看| 亚洲宅男网av| 国产成人综合亚洲| 秋霞a级毛片在线看| 欧美三电影在线| 中文字幕五月天| 国产高清久久久| 欧美午夜小视频| 婷婷激情久久| 国产精品白嫩初高中害羞小美女 | 日本精品入口免费视频| 久久精品视频一区二区| 国产精品入口免费软件| 第一sis亚洲原创| 日本免费久久高清视频| 91在线网址| 制服丝袜成人动漫| 国产一级片免费观看| 99精品久久99久久久久| 国内自拍视频一区| 91精品国产视频| 国产精品一区视频| 欧美暴力调教| 久久99久久99精品中文字幕| 天堂中文在线观看视频| 日韩欧美精品免费在线| 精品少妇一区二区三区密爱| 国产成人午夜电影网| 日本不卡在线观看视频| 色88久久久久高潮综合影院| 99久久精品无码一区二区毛片 | 国产精品美女www| 2024最新电影在线免费观看| 日韩av最新在线观看| 亚洲高清在线看| 一区二区三区波多野结衣在线观看| 喷水视频在线观看| 久久黄色级2电影| 国产精品无码人妻一区二区在线| 日本一区二区免费高清| 国产精品一区二区免费看| 岛国一区二区| 久久久在线视频| 色欧美激情视频在线| 亚洲国产精品va在线看黑人| 91麻豆一区二区| 色综合久久久久综合| 欧美黄色一区二区三区| 国产女主播视频一区二区| 日本成人在线免费| 秋霞电影一区二区| 免费 成 人 黄 色| 天天做综合网| 日本一区美女| 久久夜色电影| 91久久国产自产拍夜夜嗨| 少妇精品视频一区二区免费看| 久久久久一本一区二区青青蜜月| 一本一道波多野毛片中文在线| 日韩成人在线视频| 精品人妻一区二区三区浪潮在线 | 欧美激情亚洲精品| 91激情在线| 亚洲久久久久久久久久| 空姐吹箫视频大全| 51精品视频一区二区三区| 国产suv精品一区二区33| 亚洲综合免费观看高清完整版在线| 色噜噜噜噜噜噜| 久久久精品2019中文字幕之3| 动漫美女无遮挡免费| 黄色动漫在线免费看| 欧美日韩xx| 国产视频自拍一区| 乱精品一区字幕二区| 欧美视频中文字幕| 色av性av丰满av| 亚洲成av人片在线| 久久久久亚洲AV成人| 日韩在线你懂得| 欧美性三三影院| 日韩av在线播放观看| 亚洲欧洲中文日韩久久av乱码| 国产视频不卡在线| 国产黄色在线网站| 亚洲欧美精品一区二区| 欧美一区二区三区激情| 日韩一级免费一区| 天天做天天爱天天高潮| 婷婷色在线播放| 最近2019年中文视频免费在线观看 | 日韩一区二区三区不卡视频| 日欧美一区二区| 麻豆av免费在线| 久久久久国产一区二区| 亚洲成人av电影在线| 在线xxxxx| 国产成人午夜视频| 久久综合在线观看| 久久77777| 亚洲成人免费观看| 美国黄色小视频| 自拍av一区二区三区| 欧美88888| 亚洲私人影院在线观看| 国产免费美女视频| 亚洲精品国产第一综合99久久 | 欧美成人在线网站| 国产无套丰满白嫩对白| 五月天激情小说综合| 国产一级免费av| 亚洲一区二区免费视频| 久久久久成人网站| 五月天婷婷综合| 丁香六月婷婷综合| 欧美亚洲一区二区在线| 夜夜躁很很躁日日躁麻豆| 欧美裸体一区二区三区| 国产在线观看h| 国产精品18久久久久久久久| 手机看片国产精品| 成人av电影在线观看| 久久午夜夜伦鲁鲁片| 久久美女艺术照精彩视频福利播放| a级在线免费观看| 中文字幕一区二区视频| 国产97免费视频| 欧美日韩激情美女| 亚洲成人自拍网| 毛茸茸free性熟hd| 99re在线视频这里只有精品| 麻豆精品免费视频| 国产精品素人视频| 波多野结衣亚洲一区二区| 亚洲一区自拍偷拍| 一区二区三区欧美成人| 99久久99热这里只有精品 | 男人的天堂在线| www.国产一区| 美女日批视频在线观看| 国产精品第一区| 精品久久亚洲| 欧美日韩喷水| 欧美激情91| 天堂社区在线视频| 成人三级伦理片| 五月婷婷婷婷婷| 亚洲第一久久影院| 亚洲图片欧美在线| 日韩精品亚洲元码| 99视频免费在线观看| 日韩免费观看网站| 动漫av一区| 91免费网站视频| 日韩激情视频在线观看| 在线精品视频播放| 亚洲欧洲av在线| 亚洲黄网在线观看| 亚洲激情第一页| 在线网址91| 成人免费淫片视频软件| 国产成人精品三级高清久久91| 欧美视频在线第一页| 六月婷婷色综合| 国产全是老熟女太爽了| 亚洲一区二区三区三| 97超碰资源站| 最近中文字幕2019免费| 悠悠资源网亚洲青| 国产三区精品| 激情欧美亚洲| 日本wwww色| 亚洲欧美激情视频在线观看一区二区三区| www.欧美色| 日韩电视剧在线观看免费网站| 青春草免费在线视频| 91人成网站www| 999视频精品| 特黄视频免费观看| 国产精品久久久爽爽爽麻豆色哟哟| 中文字幕免费观看| 亚洲欧美另类国产| 中文不卡1区2区3区| 精品中文字幕人| 在线亚洲伦理| 亚洲天堂资源在线| 舔着乳尖日韩一区| 午夜av免费在线观看| 韩国日本不卡在线| 日韩高清电影免费| 人妻熟女一二三区夜夜爱| 99riav一区二区三区| 国产又大又黄又粗| 亚洲香蕉av在线一区二区三区| 成人影院入口| 欧美影视一区二区| 日本女人一区二区三区| 国产美女网站视频| 91精品国产综合久久小美女| 国产激情在线视频| 成人av免费看| 日韩香蕉视频| 老熟妇一区二区| 欧美精品一二三| 中文字幕在线播放网址| 国产精品一区二区三区观看| 国产亚洲精品bv在线观看| 熟妇高潮精品一区二区三区| 色视频欧美一区二区三区| av亚洲在线| 亚洲一区二区日本| 亚洲黄色天堂| 熟女高潮一区二区三区| 欧美日韩在线播放三区四区| 免费av在线网站| 国产成人看片| 久久99伊人| 波多野结衣欲乱| 欧美成人综合网站| 日本黄色免费在线| 亚洲砖区区免费| 成人午夜又粗又硬又大| 青青草av在线播放| 尤物99国产成人精品视频| 动漫一区二区三区| 97国产在线播放| 国产精品久久毛片a| 狠狠综合久久av一区二区| 欧美综合第一页| 国产精品久久久久蜜臀| 日本一级大毛片a一| 色偷偷久久一区二区三区| 黄网站app在线观看| 国产青春久久久国产毛片| 老牛嫩草一区二区三区日本| 国产成人自拍网站| 精品伊人久久97| 国产一区二区| 国产精品亚洲二区在线观看| 亚洲人被黑人高潮完整版| 五月婷婷深深爱| 亚洲影影院av| 日韩电影在线一区二区| 青青操国产视频| 在线观看日韩专区| 韩国精品福利一区二区三区| 午夜在线观看av| 懂色av中文一区二区三区天美| 韩国av网站在线| 日本一区不卡|