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

微服務架構中,客戶端如何捕捉服務端的異常?

開發 架構
在Java、C#等高級語言中,程序遇到無法處理的情況,或者不滿足運行條件時,比如除數是0的情況,底層代碼通常會通過拋出異常(Exception)的方式向上層傳遞問題,上層代碼通過 try-catch 的方式捕捉異常并進行處理,不過這種方式一般只能在同一個進程中使用,如果跨進程就沒辦法直接使用了。

在微服務架構或者分布式系統中,客戶端如何捕捉服務端的異常?

這里說的客戶端指調用方、服務端指被調用方,它們通常運行在不同的進程之中,這些進程可能運行在同一臺服務器,也可能運行在不同的服務器,甚至不同的數據機房;其使用的技術棧可能相同,也可能存在很大的差異。

為什么

在Java、C#等高級語言中,程序遇到無法處理的情況,或者不滿足運行條件時,比如除數是0的情況,底層代碼通常會通過拋出異常(Exception)的方式向上層傳遞問題,上層代碼通過 try-catch 的方式捕捉異常并進行處理,不過這種方式一般只能在同一個進程中使用,如果跨進程就沒辦法直接使用了。

有的同學可能會問:為什么要跨進程傳遞異常呢?

大家調用遠程接口的時候可能有過這樣的體驗:

  • 首先遠程接口可能會返回一些提前定義好的錯誤碼,此時我們需要從返回數據中提取這些錯誤碼,然后再根據不同的值進行相應的業務處理;
  • 其次我們還需要處理一些未知的錯誤,它們可能來源于服務端未注意到的地方,比如空指針問題,也可能是底層框架、操作系統或者硬件等拋出的一些問題,比如請求或者返回格式不匹配、網絡中斷、磁盤故障、內存溢出、文件系統損壞等各種技術問題。

如此我們實際上需要面對兩種錯誤,而且需要采用不同的方式在不同的地方處理它們,這相當繁瑣,心智負擔比較大。從Java、C#等轉Go的同學可能對此也深有體會,隨處可見的error判斷,還要留心panic的問題,當然Go有自己的意圖和堅持,只是寫起來真的很糟心。

那我們有什么辦法來處理這個問題呢?我的選擇是全部統一為處理異常(Exception),異常中可以包含錯誤碼、錯誤描述,完全可以覆蓋錯誤碼的處理方式;而且異常不可避免,錯誤碼則都是上層應用自己定義的。

基本原理

異常信息也是一種數據,所以傳遞異常也是傳輸數據。我們想要把數據從一個進程傳遞給另一個進程有很多種方法,在微服務架構或者分布式系統中,服務之間就是各種遠程網絡調用,服務的具體實現可能是基于Http協議的Restful、gRPC,也可能是基于TCP的Dubbo等等,我們的異常信息傳遞也要基于這些框架的約定和底層通信協議。

以Restful為例,當服務端產生異常時,我們通過攔截器或者程序內部的中間件捕捉到這個異常,提取出其中的異常信息,并中斷這個異常的繼續拋出,然后把拿到的異常信息寫到HTTP Header中,返回到客戶端。客戶端的HTTP請求程序則從HTTP響應的Header中讀取到這些異常信息,然后再把他們包裝成異常(Exception),throw 出來。最后客戶端中的業務代碼就可以使用 try-catch 捕捉到這個異常,并根據錯誤碼進行相應的處理。

圖片圖片

使用WCF、gPRC和Dubbo等框架時也是類似的方法,只是傳遞異常時其寫入和讀取的位置不同。比如Dubbo可以在其數據包的消息頭中聲明這是一個錯誤相應,并在消息體中包含詳細的異常信息;gPRC則可以利用它提供的Status來傳遞錯誤碼、錯誤描述和一些額外的參考信息。

使用Restful、gRPC等協議或者技術還有一個好處,那就是這些技術使用的協議是跨平臺的,你用Java開發,他用Go開發,你的程序跑在Windows上,他的程序跑在Linux上,這些都沒有問題,都可以按照一套規則正常通信,傳遞異常也完全沒有問題。

有的同學可能會擔心性能的問題,因為拋出異常時,程序通常要把整個調用堆棧回溯一遍,這個過程可能會消耗一些計算資源,特別是當異常頻繁發生或堆棧層次很深時。不過正常情況下,各種防護到位時,異常應該很少發生;而且現代編譯器和運行時環境也會對異常處理進行優化,以減少性能開銷。最后,異常處理機制的設計初衷是為了提高代碼的健壯性和可維護性,在大多數情況下,異常處理所帶來的性能開銷是可以接受的。

最佳實踐

接下來聊一些具體實現、遇到的問題和應對方法。

拋出業務異常

服務在改變數據狀態之前,通常需要對數據進行一些驗證,比如必填驗證、格式驗證、數據一致性驗證等等,如果驗證不通過,就要返回錯誤信息。

在傳統的方案中,我們可能會定義一個通用的消息格式,其中包含錯誤碼、錯誤描述,以及正常的業務字段,如下這樣:

public class Response{
  // 處理狀態:錯誤碼、錯誤描述
  public int ErrCode{get;set;}
  public string ErrMsg{get;set;}

  // 處理成功時返回的業務數據
  public string UserId{get;set;}
  public string UserName{get;set;}
  ...
}

需要返回錯誤時,我們就會創建一個Response的實例,然后返回它,就像下邊這樣:

if(stirng.IsNullOrEmpty(id)){
  return new Response(100,"Id為空");
}

為了實現更為統一的錯誤處理方式,我們這里可以把返回Response實例的方式改為拋出異常。

if(stirng.IsNullOrEmpty(id)){
  throw new FireflySoftException(100,"Id為空");
}

如此,我們只需要在攔截器或者中間件中捕捉異常,并進行相應的處理就可以了,不管它是一個業務上的驗證錯誤,還是底層框架中的某種未知異常。

比如在ASP.NET Core的異常攔截器中可以這樣統一處理:

/// <summary>
/// WebAPI異常過濾器
/// </summary>
internal class WebAPIAsyncExceptionFilter : IAsyncExceptionFilter
{
    /// <summary>
    /// 異步異常處理
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public async Task OnExceptionAsync(ExceptionContext context)
    {
          // 將自定義的異常或系統自帶異常都轉換為一種異常
          FireflySoftException ex;
          if(context.Exception is FireflySoftException){
            ex = (FireflySoftException)context.Exception;
          }else{
            ex = ConvertToFireflySoftException(context.Exception);
          }

          // 將異常信息寫到 Http Header 中
          context.HttpContext.Response.StatusCode = 500;
          context.HttpContext.Response.Headers.Add("errcode", ex.Code.ToString());
          context.HttpContext.Response.Headers.Add("errmsg", System.Web.HttpUtility.UrlEncode(ex.Message));
          // 異常描述也寫到 Http Body 中,方便人看
          var bodyContent = Encoding.UTF8.GetBytes(ex.Message);
          await context.HttpContext.Response.Body.WriteAsync(bodyContent, 0, bodyContent.Length).ConfigureAwait(false);
          
          context.ExceptionHandled = true;
    }
}

在底層處理異常

不應該讓業務程序開發者關心異常的傳遞實現,比如上邊編寫的攔截器應該內置到團隊的開發框架或者規范類庫中,業務程序開發者只需要拋出異常或者捕捉異常就夠了。

服務端的異常攔截器上邊已經給了個例子,對于客戶端,我們可以通過包裝網絡請求方法來達到相同的目的。這里還是用ASP.NET Core舉個例子:

// 包裝的Post請求方法
public async Task<HttpResponseMessage> PostAsync<TRequest>(string hostAndPort, string resourceUri, TRequest request)
{
    string requestJson = JsonConvert.SerializeObject(request);
    var content = new StringContent(requestJson, Encoding.UTF8, "application/json");

    // 在實際的網絡請求外邊包一層
    return await DoHttp(async client =>
    {
        var uri = new Uri(client.BaseAddress, resourceUri);
        var requestMessage = new HttpRequestMessage()
        {
            Method = HttpMethod.Post,
            RequestUri = uri,
            Content = content
        };

        return await client.SendAsync(requestMessage).ConfigureAwait(false);
    }, hostAndPort).ConfigureAwait(false);
}

// 攔截HTTP錯誤并包裝為自定義的異常
private async Task<HttpResponseMessage> DoHttp(Func<HttpClient, Task<HttpResponseMessage>> action, string hostAndPort)
{
    HttpResponseMessage response;
    try
    {
        var client = GetHttpClient();
        response = await action(client).ConfigureAwait(false);
        return response.EnsureSuccessStatusCode();
    }
    catch (Exception ex)
    {
        // 如果 HTTP StatusCode 是錯誤碼,會進入這里
        // 從 HTTP Header中提取錯誤碼和錯誤描述
        // 然后可以創建并拋出對應的異常
         if (response.Headers.TryGetValues("errcode", out IEnumerable<string> errcodes))
         {
             var code = errcodes.FirstOrDefault();
             throw new FireflySoftException(code,"xxxxx");
         }
         ...
    }
}

如此,開發者通過Post調用接口時就可以這樣寫:

// 根據實際情況,可能需要try-catch,也可能不需要
try
{
  PostAsync("localhost:8080","api/getweather",new Request{
    City="帝都"
  })
}
catch(FireflySoftException ex)
{
    // 這里處理可能的業務異常
}

統一記錄異常日志

有的同學為了方便跟蹤異常信息,喜歡在程序中catch異常,并記錄到日志中。

如果使用統一的異常方式來處理錯誤,則都可以在攔截器或者中間件中來做這件事,只需要在其中加入日志的記錄邏輯就可以了。

當然有些異常可能還是要 catch 一下的,比如“添加信息時重復提交”、“給用戶發消息時用戶已取消授權”等等,這些異常可能都是要被忽略的,catch 住它們之后,程序可以吞掉這些異常,因為服務調用方也不關心這些異常,就沒必要再向上拋出。

區分Warn和Error

這里是說要給異常分個等級,有些異常就是個警告級別的,比如用戶沒有填寫某個參數,只要告訴用戶就行了,運維或者開發者不太關心這些消息。有些異常則十分嚴重,比如空指針異常、除0異常等等,這往往說明程序存在BUG,需要反饋給開發者進行修復。

我們可以在自定義的異常構造函數中增加一個異常等級的參數,如下所示:

if(stirng.IsNullOrEmpty(id)){
  throw new FireflySoftException(100,"Id為空",ErrorLevel.Light);
}

注意也不是所有的警告都無需管理員過問,比如對于一個網絡請求庫,我們可能只是把請求超時作為一種警告,但是如果超時發生的非常頻繁,也需要通知管理員來進行關注。

根據異常級別,我們就可以記錄不同級別的日志,然后監控程序就可以根據日志級別和相應的頻率為管理員提供相應的處理建議。

返回200還是500

使用HTTP作為服務之間的通信協議時,發生異常時服務端一般會返回500錯誤,也就是 HTTP StatusCode = 500,這一般是底層通信框架的默認設計。但是這會導致一個監控問題,監控程序會跟蹤服務調用之間的HTTP狀態,如果遇到500錯誤,它就會認為程序發生了錯誤,而這個錯誤可能只是一個參數驗證不通過的情況,管理員不需要關心這個問題。

此時我們可以在攔截器中處理異常的地方稍微改造一下,將所有的HTTP狀態碼都改為200,或者當錯誤級別比較輕(ErrorLevel.Light)時設置為200,錯誤級別比較重(ErrorLevel.Heavy)時設置為500。

context.HttpContext.Response.StatusCode = 200;

這樣做并不影響客戶端對錯誤的處理,因為不管HTTP的狀態碼如何,客戶端都可以從HTTP Header中提取處理錯誤所需的錯誤碼和錯誤描述。

自動重試

有時服務端的錯誤可能只是瞬時的,或者只是多個節點中的少數節點不可用,重新發起請求就能成功完成調用。

我們可以把這個重試機制包裝到網絡請求方法中,減少業務程序中處理重試的代碼量,此舉也能更好的規范代碼,避免BUG或者性能問題。

一種可行的方法是,我們根據異常的類型或者提前約定好的錯誤碼,在包裝的網絡請求方法中針對這些異常進行特殊處理。具體實現可以參考下邊的代碼:

private async Task<HttpResponseMessage> DoHttp(Func<HttpClient, Task<HttpResponseMessage>> action, string hostAndPort)
{
  int tryCount = 0;
  while (true)
  {
      HttpResponseMessage response;
      try
      {
          var client = GetHttpClient();
          response = await action(client).ConfigureAwait(false);
          return response.EnsureSuccessStatusCode();
      }
      catch (Exception ex)
      {
           // 遇到某種特定的異常時,我們就進行一次重試
           if (ex is TaskCanceledException)
           {
              if(tryCount<1){
                tryCount++;
                continue;
              }
              throw;
           }
           ...
      }
  }
}

以上就是本文的主要內容,文章雖然描述了微服務架構下異常傳遞的基本原理,也探討了一些具體的實踐方法,但要完完整整的實現并集成到自己的開發框架中,必然還有很多的工作要做,比如錯誤碼的定義,異常處理與限流、熔斷等的整合,等等。

責任編輯:武曉燕 來源: 螢火架構
相關推薦

2009-08-21 15:59:22

服務端與客戶端通信

2009-08-21 16:14:52

服務端與客戶端通信

2011-09-09 09:44:23

WCF

2023-03-06 08:01:56

MySQLCtrl + C

2010-03-18 17:47:07

Java 多客戶端通信

2010-11-19 14:22:04

oracle服務端

2009-08-21 15:54:40

服務端與客戶端

2009-08-21 15:36:41

服務端與客戶端

2023-04-03 08:13:05

MySQLCtrl + C

2021-10-19 08:58:48

Java 語言 Java 基礎

2015-01-13 10:32:23

RestfulWeb框架

2023-10-30 09:06:22

2011-06-09 10:51:26

Qt 服務器 客戶端

2021-06-11 06:54:34

Dubbo客戶端服務端

2022-09-05 14:36:26

服務端TCP連接

2010-05-28 14:11:37

SVN1.6

2018-12-19 10:31:32

客戶端IP服務器

2021-07-16 06:56:50

Nacos注冊源碼

2025-09-30 09:20:48

SpringAIMCP

2009-08-18 12:51:19

服務器+客戶端
點贊
收藏

51CTO技術棧公眾號

黄色一级视频播放| 日本亚洲欧洲色| 久久久久久久久久久久国产精品| gogo久久| 国产精品色呦呦| 91免费版黄色| 日本一区二区三区精品| 婷婷中文字幕一区| 亚洲精品天天看| 三年中文在线观看免费大全中国| 国产亚洲成av人片在线观看| 亚洲国产精品高清| 国产亚洲精品美女久久久m| 中文字幕在线视频第一页| 国产综合亚洲精品一区二| 日韩精品中文在线观看| 永久免费黄色片| 奇米777日韩| 一二三区精品视频| 少妇特黄a一区二区三区| 蜜臀av中文字幕| 老司机精品视频在线| 91a在线视频| 澳门黄色一级片| 精品久久久久久久| 亚洲国产一区二区三区在线观看 | av免费在线观看网址| 久久这里只有精品视频网| 亚洲qvod图片区电影| 国产精品久免费的黄网站| 欧美精品18| 日韩资源在线观看| 538精品视频| 亚州综合一区| 精品美女一区二区| 中文字幕乱妇无码av在线| 99久久久国产精品免费调教网站| 欧美日韩黄色大片| 黄色一级片在线看| 牛牛精品在线| 亚洲激情男女视频| 强伦女教师2:伦理在线观看| 成人精品一区二区三区校园激情| www精品美女久久久tv| 国产欧美日韩一区| 亚洲男人天堂久久| 成人久久18免费网站麻豆 | 99久久免费国产精精品| 久久精品99国产精品日本| 国产精品成熟老女人| 国产主播第一页| 日韩精品成人一区二区在线| 人九九综合九九宗合| av大片免费在线观看| 亚洲国产婷婷| 久久免费成人精品视频| 精品在线视频免费观看| 精品1区2区3区4区| 性色av一区二区三区| 精品一级少妇久久久久久久| 激情欧美日韩| 91福利视频网| 亚洲黄网在线观看| 奇米四色…亚洲| 国产区亚洲区欧美区| 亚洲无码精品国产| 精品一区二区日韩| 亚洲自拍另类欧美丝袜| 成人激情四射网| 成人午夜大片免费观看| 久久精品美女| caoporn国产精品免费视频| 欧美国产欧美综合| 艳母动漫在线观看| 超碰在线中文字幕| 欧美性极品xxxx娇小| 99草草国产熟女视频在线| 国产伊人久久| 欧美成人一区二区三区片免费 | 久久久久久久电影| 亚洲精品一区二区三区av| 免费日本一区二区三区视频| 一区二区三区四区五区视频在线观看| 欧美 亚洲 视频| 欧美大片免费| 91精品国产高清一区二区三区蜜臀 | av蜜臀在线| 色八戒一区二区三区| 国产一伦一伦一伦| 综合激情久久| 国产亚洲aⅴaaaaaa毛片| 国产精品99久久久久久成人| 亚洲欧洲日本mm| 国产精品成人在线| 韩国av在线免费观看| 久久久久久久电影| 永久免费看av| 欧美电影免费观看网站| 欧美一级在线视频| 女~淫辱の触手3d动漫| 亚洲第一天堂| 日韩高清中文字幕一区| 老色鬼精品视频在线观看播放| 国产va免费精品高清在线| 中文字幕日产av| 国产亚洲激情| 精品久久成人| 欧美人狂配大交3d怪物一区| 黑人巨大猛交丰满少妇| 亚洲精品国产动漫| 亚洲人成小说网站色在线| 麻豆av一区二区三区| 天堂地址在线www| 午夜精品福利一区二区三区av| 国产福利一区视频| 日韩一区二区三区精品视频第3页| 免费观看在线黄色网| 人妖欧美一区二区| 国产伦一区二区三区色一情| 国产免费av高清在线| 亚洲电影一级黄| 日韩av一卡二卡三卡| 久久精品—区二区三区舞蹈| 成人免费黄色| 日韩精品在线视频| 国产精品1000| 国产精品一二三四区| 亚洲ai欧洲av| 成人看片在线观看| 亚洲精品电影网| 国产精品999久久久| 欧美少妇另类| 蜜臀久久久久久999| 蜜桃视频在线一区| 精品国产一区二区三| 成人免费网址| 欧美精品 国产精品| 91国模少妇一区二区三区| 国内精品嫩模av私拍在线观看| 91久久久久久久久久久久久| 国产69精品久久app免费版| 欧美日韩在线一区| 三级男人添奶爽爽爽视频| 1024成人| 国产在线资源一区| 国产精品13p| 亚洲第一视频网| 亚洲欧美在线视频免费| 99久久夜色精品国产网站| 青青青在线视频播放| 97se亚洲国产一区二区三区| 久久91精品国产| 亚洲AV无码成人片在线观看| 亚洲午夜久久久久久久久电影网| 成年人性生活视频| 黑人一区二区三区四区五区| 国产99在线免费| 黄在线观看免费网站ktv| 精品处破学生在线二十三| 日本一本高清视频| 91蜜桃视频在线| 日本女优爱爱视频| 日韩精品一区二区久久| 成人国产精品一区二区| gogogogo高清视频在线| 欧美不卡在线视频| 日韩特黄一级片| 久久久久久97三级| 国产视频手机在线播放| 水蜜桃精品av一区二区| 91在线免费看网站| 91jq激情在线观看| 亚洲欧美制服第一页| 最新黄色网址在线观看| 日韩毛片高清在线播放| 欧美xxxxx少妇| 麻豆精品91| 国产高清精品软男同| 一区二区三区欧洲区| 欧美一级淫片丝袜脚交| avtt亚洲| 欧美成人精品1314www| 天堂а√在线中文在线新版| 国产欧美一区二区精品婷婷 | 国精产品久拍自产在线网站| 国产成人亚洲精品青草天美| 人妻熟妇乱又伦精品视频| 欧美亚洲国产激情| 97人人模人人爽人人少妇| 中文字幕人成乱码在线观看| 精品国产一区二区三区久久久狼| 亚洲精品18p| 欧洲亚洲国产日韩| 国产精品a成v人在线播放| 国产性天天综合网| 日批视频免费看| 毛片一区二区三区| 欧美 日本 亚洲| 国产韩日影视精品| 久久精品国产一区二区三区日韩 | 欧美一区二区三区在| 韩国av免费观看| 成人欧美一区二区三区在线播放| 国产精品久久久久久久无码| 麻豆精品一区二区综合av| 草b视频在线观看| 99久久精品费精品国产风间由美| 麻豆亚洲一区| 在线综合色站| 成人免费网站在线| 欧美××××黑人××性爽| 久久久久久久久久久久久久久久久久av| 国产精品天堂| 日韩精品www| 亚洲成人一级片| 欧美男人的天堂一二区| 国产一区二区99| 一区二区免费看| 天海翼在线视频| 亚洲国产激情av| 亚洲第一页av| www..com久久爱| 国产性猛交96| 国产精品一区二区三区网站| 在线观看亚洲色图| 青椒成人免费视频| 免费在线观看毛片网站| 99国产精品私拍| 国产freexxxx性播放麻豆| 91精品福利| a级黄色片网站| 国产精品久久久久久麻豆一区软件 | 91精品久久久久| 欧美日韩五区| 国产成人精品av| 黄色亚洲网站| 欧美一级视频在线观看| 免费v片在线观看| 国语自产精品视频在线看抢先版图片 | 国产乱码在线观看| 色视频欧美一区二区三区| 天堂在线免费观看视频| 天天综合天天做天天综合| 国语对白一区二区| 香蕉乱码成人久久天堂爱免费| 欧美精品久久久久性色| 亚洲精品国产第一综合99久久| 亚洲综合图片一区| 亚洲欧洲日韩一区二区三区| 成人午夜免费影院| 亚洲视频在线观看一区| 国产免费久久久久| 亚洲精品久久嫩草网站秘色| 欧美国产日韩在线观看成人| 一区二区三区高清| 久久婷婷一区二区| 婷婷综合另类小说色区| 国产成人亚洲精品自产在线| 欧美日韩亚洲一区二区| 日本视频免费观看| 欧美在线观看视频一区二区| 中文字幕在线观看免费| 91精品国产品国语在线不卡| 亚洲爱爱综合网| 日韩h在线观看| 不卡在线视频| 免费99精品国产自在在线| 日韩另类在线| 欧美亚洲视频在线观看| 成人在线爆射| 91精品视频专区| 久久视频在线观看| 日产精品久久久一区二区| 色喇叭免费久久综合网| 丁香色欲久久久久久综合网| 一区二区日本视频| 午夜宅男在线视频| 国产成人精品一区二区三区网站观看| 欧美做受高潮中文字幕| 国产喂奶挤奶一区二区三区| 精品国产国产综合精品| 亚洲丶国产丶欧美一区二区三区| 中文字幕黄色片| 91精品国产综合久久久蜜臀粉嫩 | 国产精品1区在线| 国产精品日韩一区二区| 国产剧情一区| 99久热在线精品视频| 亚洲在线观看| 青青草精品在线| 国产性做久久久久久| 欧美交换国产一区内射| 在线看一区二区| 亚洲av永久纯肉无码精品动漫| 亚洲图片制服诱惑| 国产在线xxx| 国产美女精品视频| 欧美黄色网视频| 午夜在线视频免费观看| 久久天天综合| 国产又黄又嫩又滑又白| 国产片一区二区| 日产精品久久久久久久| 欧美一区中文字幕| 国产一区二区影视| 久久久久久午夜| 999精品视频在线观看| 麻豆精品传媒视频| 狠狠入ady亚洲精品经典电影| 欧美日韩在线观看不卡| 成av人片一区二区| 极品魔鬼身材女神啪啪精品| 色中色一区二区| 欧美一区二区公司| 久久艳片www.17c.com | 欧美色男人天堂| 天堂中文字幕在线| 欧美国产日韩中文字幕在线| 国产精品久久久久久久久久齐齐| 国产一区免费视频| 欧美激情日韩| 午夜一级免费视频| 中文天堂在线一区| 波多野结衣mp4| 日韩成人在线电影网| 黄网av在线| 99热国产免费| 欧美成熟视频| 三年中文在线观看免费大全中国| 国产精品亲子伦对白| 日韩中文字幕高清| 亚洲男人天堂手机在线| 日韩精品av| 精品一区久久久久久| 亚洲精品少妇| 先锋资源av在线| 午夜一区二区三区视频| 人人妻人人澡人人爽人人欧美一区| www.国产精品一二区| 久久亚洲资源中文字| 亚洲一区二区三区四区中文| 蜜桃一区二区三区在线观看| 国产三级在线观看完整版| 欧美在线观看18| 四虎久久免费| 147欧美人体大胆444| 亚洲欧美综合| 性色av蜜臀av浪潮av老女人| 午夜一区二区三区在线观看| 天天干天天操av| 国产91对白在线播放| 一区二区美女| 三上悠亚在线一区二区| 国产精品高潮呻吟| 国产裸体永久免费无遮挡| 欧美精品一区在线播放| 日本免费一区二区三区视频| 欧美这里只有精品| 99久久免费精品高清特色大片| 波多野结衣国产| 亚洲视频第一页| 青娱乐极品盛宴一区二区| japanese在线视频| 国产成人在线观看| 可以在线观看av的网站| 伊人伊人伊人久久| 国产美女亚洲精品7777| 91免费黄视频| 国产亚洲欧美色| 国产精品自偷自拍| 欧美精品激情在线观看| 亚洲伊人春色| 国产福利精品一区二区三区| 亚洲综合免费观看高清在线观看| 日韩中文字幕免费在线观看| 欧美中文字幕在线播放| 久久在线电影| 在线观看免费视频国产| 91国产丝袜在线播放| 超鹏97在线| 欧美极品一区| 国产一区不卡在线| 久久久国产高清| 日韩一区二区三区在线播放| 91九色鹿精品国产综合久久香蕉| 欧美污视频网站| 亚洲靠逼com| 国产在线视频福利| 亚洲资源在线看| 久久亚洲视频| 国产精品老熟女一区二区| 亚洲免费一在线| 视频二区欧美毛片免费观看| 无码精品国产一区二区三区免费| 国产精品久久99| 日韩电影免费| 波多野结衣成人在线| 日韩精品一卡二卡三卡四卡无卡| 中文字幕av久久爽av| 亚洲丝袜av一区|