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

微服務與RPC

開發 開發工具
在支付系統的微服務架構中,基礎服務的構建是重中之重, 本文重點分析如何使用Apache Thrift + Google Protocol Buffer來構建基礎服務。

在支付系統的微服務架構中,基礎服務的構建是重中之重, 本文重點分析如何使用Apache Thrift + Google Protocol Buffer來構建基礎服務。

一、RPC vs Restful

在微服務中,使用什么協議來構建服務體系,一直是個熱門話題。 爭論的焦點集中在兩個候選技術: (binary) RPC or Restful。

以Apache Thrift為代表的二進制RPC,支持多種語言(但不是所有語言),四層通訊協議,性能高,節省帶寬。相對Restful協議,使用Thrifpt RPC,在同等硬件條件下,帶寬使用率僅為前者的20%,性能卻提升一個數量級。但是這種協議***的問題在于,無法穿透防火墻。

以Spring Cloud為代表所支持的Restful 協議,優勢在于能夠穿透防火墻,使用方便,語言無關,基本上可以使用各種開發語言實現的系統,都可以接受Restful 的請求。 但性能和帶寬占用上有劣勢。

所以,業內對微服務的實現,基本是確定一個組織邊界,在該邊界內,使用RPC; 邊界外,使用Restful。這個邊界,可以是業務、部門,甚至是全公司。

二、 RPC技術選型

RPC技術選型上,原則也是選擇自己熟悉的,或者公司內部內定的框架。 如果是新業務,則現在可選的框架其實也不多,卻也足夠讓人糾結。

Apache Thrift

國外用的多,源于facebook,后捐獻給Apache基金。是Apache的***項目 Apache Thrift。使用者包括facebook, Evernote, Uber, Pinterest等大型互聯網公司。 而在開源界,Apache hadoop/hbase也在使用Thrift作為內部通訊協議。 這是目前最為成熟的框架,優點在于穩定、高性能。缺點在于它僅提供RPC服務,其他的功能,包括限流、熔斷、服務治理等,都需要自己實現,或者使用第三方軟件。

Dubbo

國內用的多,源于阿里公司。 性能上略遜于Apache Thrift,但自身集成了大量的微服務治理功能,使用起來相當方便。 Dubbo的問題在于,該系統目前已經很長時間沒有維護更新了。 官網顯示最近一次的更新也是8個月前。

Google Protobuf

和Apache Thrift類似,Google Protobuf也包括數據定義和服務定義兩部分。問題是,Google Protobuf一直只有數據模型的實現,沒有官方的RPC服務的實現。 直到2015年才推出gRPC,作為RPC服務的官方實現。但缺乏重量級的用戶。

以上僅做定性比較。定量的對比,網上有不少資料,可自行查閱。 此外,還有一些不錯的RPC框架,比如Zeroc ICE等,不在本文的比較范圍。

Thrift 提供多種高性能的傳輸協議,但在數據定義上,不如Protobuf強大。

  1. 同等格式數據, Protobuf壓縮率和序列化/反序列化性能都略高。
  2. Protobuf支持對數據進行自定義標注,并可以通過API來訪問這些標注,這使得Protobuf在數據操控上非常靈活。比如可以通過option來定義protobuf定義的屬性和數據庫列的映射關系,實現數據存取。
  3. 數據結構升級是常見的需求,Protobuf在支持數據向下兼容上做的非常不錯。只要實現上處理得當,接口在升級時,老版本的用戶不會受到影響。

而Protobuf的劣勢在于其RPC服務的實現性能不佳(gRPC)。為此,Apache Thrift + Protobuf的RPC實現,成為不少公司的選擇。

三、Apache Thrift + Protobuf

如上所述,利用Protobuf在靈活數據定義、高性能的序列化/反序列化、兼容性上的優勢,以及Thrift在傳輸上的成熟實現,將兩者結合起來使用,是不少互聯網公司的選擇。

服務定義:

  1.  service HelloService{ 
  2.     binary hello(1: binary hello_request); 
  3.  } 
  4. 協議定義: 
  5.  
  6. message HelloRequest{ 
  7.   optional string user_name = 1; //訪問這個接口的用戶 
  8.   optional string password = 2; //訪問這個接口的密碼 
  9.   optional string hello_word = 3; //其他參數; 
  10.  
  11.  
  12. message HelloResponse{ 
  13.   optional string hello_word = 1; //訪問這個接口的用戶 

想對于純的thrift實現,這種方式雖然看起來繁瑣,但其在可擴展性、可維護性和服務治理上,可以帶來不少便利。

四、服務注冊與發現

Spring cloud提供了服務注冊和發現功能,如果需要自己實現,可以考慮使用Apache Zookeeper作為注冊表,使用Apache Curator 來管理Zookeeper的鏈接,它實現如下功能:

  • 偵聽注冊表項的變化,一旦有更新,可以重新加載注冊表。
  • 管理到zookeeper的鏈接,如果出現問題,則進行重試。

Curator的重試策略是可配置的,提供如下策略:

  • BoundedExponentialBackoffRetry
  • ExponentialBackoffRetry
  • RetryForever
  • RetryNTimes
  • RetryOneTime
  • RetryUntilElapsed

一般使用指數延遲策略,比如重試時間間隔為1s,2s, 4s, 8s……指數增加,避免把服務器打死。

對服務注冊來說,注冊表結構需要詳細設計,一般注冊表結構會按照如下方式組織:

機房區域-部門-服務類型-服務名稱-服務器地址

由于在zookeeper上的注冊和發現有一定的延遲,所以在實現上也得注意,當服務啟動成功后,才能注冊到zookeeper上;當服務要下線或者重啟前,需要先斷開同zookeeper的連接,再停止服務。

五、連接池

RPC服務訪問和數據庫類似,建立鏈接是一個耗時的過程,連接池是服務調用的標配。目前還沒有成熟的開源Apache Thrift鏈接池,一般互聯網公司都會開發內部自用的鏈接池。自己實現可以基于JDBC鏈接池做改進,比如參考Apache commons DBCP鏈接池,使用Apache Pools來管理鏈接。 在接口設計上,連接池需要管理的是RPC 的Transport:

  1. public interface TransportPool { 
  2.   /** 
  3.   * 獲取一個transport 
  4.   * @return 
  5.   * @throws TException 
  6.   */ 
  7.   public TTransport getTransport() throws TException;} 

連接池實現的主要難點在于如何從多個服務器中選舉出來為當前調用提供服務的連接。比如目前有10臺機器在提供服務,上一次分配的是第4臺服務器,本次應該分配哪一臺?在實現上,需要收集每臺機器的QOS以及當前的負擔,分配一個***的連接。

六、API網關

隨著公司業務的增長,RPC服務越來越多,這也為服務調用帶來挑戰。如果有一個應用需要調用多個服務,對這個應用來說,就需要維護和多個服務器之間的鏈接。服務的重啟,都會對連接池以及客戶端的訪問帶來影響。為此,在微服務中,廣泛會使用到API網關。API網關可以認為是一系列服務集合的訪問入口。從面向對象設計的角度看,它與外觀模式類似,實現對所提供服務的封裝。

網關作用

API網關本身不提供服務的具體實現,它根據請求,將服務分發到具體的實現上。 其主要作用:

  • API路由: 接受到請求時,將請求轉發到具體實現的worker機器上。避免使用方建立大量的連接。
  • 協議轉換: 原API可能使用http或者其他的協議來實現的,統一封裝為rpc協議。注意,這里的轉換,是批量轉換。也就是說,原來這一組的API是使用http實現的,現在要轉換為RPC,于是引入網關來統一處理。對于單個服務的轉換,還是單獨開發一個Adapter服務來執行。
  • 封裝公共功能: 將微服務治理相關功能封裝到網關上,簡化微服務的開發,這包括熔斷、限流、身份驗證、監控、負載均衡、緩存等。
  • 分流:通過控制API網關的分發策略,可以很容易實現訪問的分流,這在灰度測試和AB測試時特別有用。

解耦合

RPC API網關在實現上,難點在于如何做到服務無關。我們知道使用Nginx實現HTTP的路由網關,可以實現和服務無關。而RPC網關由于實現上的不規范,很難實現和服務無關。統一使用thrift + protobuf 來開發RPC服務可以簡化API網關的開發,避免為每個服務上線而帶來的網關的調整,使得網關和具體的服務解耦合:

  • 每個服務實現的worker機器將服務注冊到zookeeper上;
  • API網關接收到zookeeper的變更,更新本地的路由表,記錄服務和worker(連接池)的映射關系。
  • 當請求被提交到網關上時,網關可以從rpc請求中提取出服務名稱,之后根據這個名稱,找到對應的worker機(連接池),調用該worker上的服務,接受到結果后,將結果返回給調用方。

權限和其他

Protobuf的一個重要特性是,數據的序列化和名稱無關,只和屬性類型、編號有關。 這種方式,間接實現了類的繼承關系。如下所示,我們可以通過Person類來解析Girl和Boy的反序列化流:

  1. message Person { 
  2.   optional string user_name = 1;  
  3.   optional string password = 2; }message Girl { 
  4.   optional string user_name = 1;  
  5.   optional string password = 2;  
  6.   optional string favorite_toys = 3; }message Boy { 
  7.   optional string user_name = 1;  
  8.   optional string password = 2;  
  9.   optional int32  favorite_club_count = 3;  
  10.   optional string favorite_sports = 4; } 

我們只要對服務的輸入參數做合理的編排,將常用的屬性使用固定的編號來表示,既可以使用通用的基礎類來解析輸入參數。比如我們要求所有輸入的***個和第二個元素必須是user_name和password,則我們就可以使用Person來解析這個輸入,從而可以實現對服務的統一身份驗證,并基于驗證結果來實施QPS控制等工作。

七、熔斷與限流

Netflix Hystrix提供不錯的熔斷和限流的實現,參考其在GitHub上的項目介紹。這里簡單說下熔斷和限流實現原理。

熔斷一般采用電路熔斷器模式(Circuit Breaker Patten)。當某個服務發生錯誤,每秒錯誤次數達到閾值時,不再響應請求,直接返回服務器忙的錯誤給調用方。 延遲一段時間后,嘗試開放50%的訪問,如果錯誤還是高,則繼續熔斷;否則恢復到正常情況。

限流指按照訪問方、IP地址或者域名等方式對服務訪問進行限制,一旦超過給定額度,則禁止其訪問。 除了使用Hystrix,如果要自己實現,可以考慮使用使用Guava RateLimiter

八、服務演化

隨著服務訪問量的增加,服務的實現也會不斷演化以提升性能。主要的方法有讀寫分離、緩存等。

讀寫分離

針對實體服務,讀寫分離是提升性能的***步。 實現讀寫分離一般有兩種方式:

在同構數據庫上使用主從復制的方式: 一般數據庫,比如MySQL、HBase、Mongodb等,都提供主從復制功能。數據寫入主庫,讀取、檢索等操作都從從庫上執行,實現讀寫分離。這種方式實現簡單,無需額外開發數據同步程序。一般來說,對寫入有事務要求的數據庫,在讀取上的性能會比較差。雖然可以通過增加從庫的方式來sharding請求,但這也會導致成本增加。

 

在異構數據庫上進行讀寫分離。發揮不同數據庫的優勢,通過消息機制或者其他方式,將數據從主庫同步到從庫。 比如使用MySQL作為主庫來寫入,數據寫入時投遞消息到消息服務器,同步程序接收到消息后,將數據更新到讀庫中。可以使用Redis,Mongodb等內存數據庫作為讀庫,用來支持根據ID來讀取;使用Elastic作為從庫,支持搜索。

 

緩存使用

如果數據量大,使用從庫也會導致從庫成本非常高。對大部分數據來說,比如訂單庫,一般需要的只是一段時間,比如三個月內的數據。更長時間的數據訪問量就非常低了。 這種情況下,沒有必要將所有數據加載到成本高昂的讀庫中,即這時候,讀庫是緩存模式。 在緩存模式下,數據更新策略是一個大問題。

  • 對于實時性要求不高的數據,可以考慮采用被動更新的策略。即數據加載到緩存的時候,設置過期時間。一般內存數據庫,包括Redis,couchbase等,都支持這個特性。到過期時間后,數據將失效,再次被訪問時,系統將觸發從主庫讀寫數據的流程。
  • 對實時性要求高的數據,需要采用主動更新的策略,也就是接受Message后,立即更新緩存數據。

當然,在服務演化后,對原有服務的實現也會產生影響。 考慮到微服務的一個實現原則,即一個服務僅管一個存儲庫,原有的服務就被分裂成多個服務了。 為了保持使用方的穩定,原有服務被重新實現為服務網關,作為各個子服務的代理來提供服務。

以上是RPC與微服務的全部內容,以下是thrift + protobuf的實現規范的介紹。

附一、基礎服務設計規范

基礎服務是微服務的服務棧中***層的模塊, 基礎服務直接和數據存儲打交道,提供數據增刪改查的基本操作。

附1.1 設計規范

文件規范

rpc接口文件名以 xxx_rpc_service.thrift 來命名; protobuf參數文件名以 xxx_service.proto 來命名。

這兩種文件全部使用UTF-8編碼。

命名規范

服務名稱以 “XXXXService” 的格式命名, XXXX是實體,必須是名詞。以下是合理的接口名稱。

  • OrderService
  • AccountService

附1.2 方法設計

由于基礎服務主要是解決數據讀寫問題,所以從使用的角度,對外提供的接口,可以參考數據庫操作,標準化為增、刪、改、查、統計等基本接口。接口采用 操作+實體來命名,如createOrder。 接口的輸入輸出參數采用 接口名+Request 和 接口名Response 的規范來命名。 這種方式使得接口易于使用和管理。

  1. file: xxx_rpc_service.thrift 
  2.  
  3. /** 
  4.  * 這里是版權申明 
  5.  **/ 
  6.  
  7. namespace java com.phoenix.service 
  8. /** 
  9.  * 提供關于XXX實體的增刪改查基本操作。 
  10. **/ 
  11. service XXXRpcService { 
  12.  
  13. /** 
  14. * 創建實體 
  15. * 輸入參數: 
  16. * 1. createXXXRequest: 創建請求,支持創建多個實體; 
  17. * 輸出參數 
  18. * createXXXResponse: 創建成功,返回創建實體的ID列表; 
  19. * 異常 
  20. * 1. userException:輸入的參數有誤; 
  21. * 2. systemExeption:服務器端出錯導致無法創建; 
  22. * 3. notFoundException: 必填的參數沒有提供。 
  23. **/ 
  24. binary createXXX(1: binary create_xxx_request) throws (1: Errors.UserException userException, 2: Errors.systemException, 3: Errors.notFoundException) 
  25.  
  26. /** 
  27. * 更新實體 
  28. * 輸入參數: 
  29. * 1. updateXXXRequest: 更新請求,支持同時更新多個實體; 
  30. * 輸出參數 
  31. * updateXXXResponse: 更新成功,返回被更行的實體的ID列表; 
  32. * 異常 
  33. * 1. userException:輸入的參數有誤; 
  34. * 2. systemExeption:服務器端出錯導致無法創建; 
  35. * 3. notFoundException: 該實體在服務器端沒有找到。 
  36. **/ 
  37. binary updateXXX(1: binary update_xxx_request) throws (1: Errors.UserException userException, 2: Errors.systemException, 3: Errors.notFoundException) 
  38.  
  39. /** 
  40. * 刪除實體 
  41. * 輸入參數: 
  42. * 1. removeXXXRequest: 刪除請求,按照id來刪除,支持一次刪除多個實體; 
  43. * 輸出參數 
  44. * removeXXXResponse: 刪除成功,返回被刪除的實體的ID列表; 
  45. * 異常 
  46. * 1. userException:輸入的參數有誤; 
  47. * 2. systemExeption:服務器端出錯導致無法創建; 
  48. * 3. notFoundException: 該實體在服務器端沒有找到。 
  49. **/ 
  50. binary removeXXX(1: binary remove_xxx_request) throws (1: Errors.UserException userException, 2: Errors.systemException, 3: Errors.notFoundException) 
  51.  
  52. /** 
  53. * 根據ID獲取實體 
  54. * 輸入參數: 
  55. * 1. getXXXRequest: 獲取請求,按照id來獲取,支持一次獲取多個實體; 
  56. * 輸出參數 
  57. * getXXXResponse: 返回對應的實體列表; 
  58. * 異常 
  59. * 1. userException:輸入的參數有誤; 
  60. * 2. systemExeption:服務器端出錯導致無法創建; 
  61. * 3. notFoundException: 該實體在服務器端沒有找到。 
  62. **/ 
  63. binary getXXX(1: binary get_xxx_request) throws (1: Errors.UserException userException, 2: Errors.systemException, 3: Errors.notFoundException) 
  64.  
  65. /** 
  66. * 查詢實體 
  67. * 輸入參數: 
  68. * 1. queryXXXRequest: 查詢條件; 
  69. * 輸出參數 
  70. * queryXXXResponse: 返回對應的實體列表; 
  71. * 異常 
  72. * 1. userException:輸入的參數有誤; 
  73. * 2. systemExeption:服務器端出錯導致無法創建; 
  74. * 3. notFoundException: 該實體在服務器端沒有找到。 
  75. **/ 
  76. binary queryXXX(1: binary query_xxx_request) throws (1: Errors.UserException userException, 2: Errors.systemException, 3: Errors.notFoundException) 
  77.  
  78. /** 
  79. * 統計符合條件的實體的數量 
  80. * 輸入參數: 
  81. * 1. countXXXRequest: 查詢條件; 
  82. * 輸出參數 
  83. * countXXXResponse: 返回對應的實體數量; 
  84. * 異常 
  85. * 1. userException:輸入的參數有誤; 
  86. * 2. systemExeption:服務器端出錯導致無法創建; 
  87. * 3. notFoundException: 該實體在服務器端沒有找到。 
  88. **/ 
  89. binary countXXX(1: binary count_xxx_request) throws (1: Errors.UserException userException, 2: Errors.systemException, 3: Errors.notFoundException) 
  90.  

附1.3 參數設計

每個方法的輸入輸出參數,采用protobuf來表示。

  1. file: xxx_service.protobuf 
  2.  
  3. /** 
  4.  * 
  5.  * 這里是版權申明 
  6. **/ 
  7.  
  8. option java_package = "com.phoenix.service"
  9. import "entity.proto"
  10. import "taglib.proto"
  11.  
  12. /** 
  13.  * 創建實體的請求 
  14.  * 
  15. **/ 
  16. message CreateXXXRequest { 
  17.  
  18.   optional string user_name = 1; //訪問這個接口的用戶 
  19.   optional string password = 2; //訪問這個接口的密碼 
  20.   repeated XXXX xxx = 21; // 實體內容; 
  21.  
  22. /** 
  23.  * 創建實體的結果響應 
  24.  * 
  25.  **/ 
  26. message CreateXXXResponse { 
  27.  
  28. repeated int64 id = 11;//成功創建的實體的ID列表 
  29. 附1.4 異常設計 
  30. RPC接口也不需要太復雜的異常,一般是定義三類異常。 
  31.  
  32. file errors.thrift 
  33.  
  34. /** 
  35.  * 由于調用方的原因引起的錯誤, 比如參數不符合規范、缺乏必要的參數,沒有權限等。 
  36.  * 這種異常一般是可以重試的。 
  37.  * 
  38. **/ 
  39.  
  40. exception UserException { 
  41. 1: required ErrorCode error_code; 
  42. 2: optional string message; 
  43.  
  44. /** 
  45.  * 由于服務器端發生錯誤導致的,比如數據庫無法連接。這也包括QPS超過限額的情況,這時候rateLimit返回分配給的QPS上限; 
  46.  * 
  47. **/ 
  48.  
  49. exception systemException { 
  50. 1: required ErrorCode error_code; 
  51. 2: optional string message; 
  52. 3: i32 rateLimit; 
  53.  
  54. /** 
  55.  * 根據給定的ID或者其他條件無法找到對象。 
  56.  * 
  57. **/ 
  58.  
  59. exception systemException { 
  60. 1: optional string identifier; 

附二、服務SDK

當然,RPC服務不應該直接提供給業務方使用,需要提供封裝好的客戶端。 一般來說,客戶端除了提供訪問服務端的代理外,還需要對常有功能進行封裝,這包括服務發現、RPC連接池、重試機制、QPS控制。這里首先介紹服務SDK的設計。 直接使用Protobuf作為輸入參數和輸出參數,開發出來的代碼很繁瑣:

  1. GetXXXRequest.Builder request = GetXXXRequest.newBuilder(); 
  2. request.setUsername("username"); 
  3. request.setPassword("password"); 
  4. request.addId("123"); 
  5.  
  6. GetXXXResponse response = xxxService.getXXX(request.build()); 
  7. if(response.xxx.size()==1) 
  8. XXX xxx = response.xxx.get(0); 

如上,有大量的重復性代碼,使用起來不直觀也不方便。 因而需要使用客戶端SDK來做一層封裝,供業務方調用:

  1. class XXXService { 
  2. //根據ID獲取對象 
  3. public XXX getXXX(String id){ 
  4. GetXXXRequest.Builder request = GetXXXRequest.newBuilder(); 
  5. request.setUsername("username"); 
  6. request.setPassword("password"); 
  7. request.addId("123"); 
  8.  
  9. GetXXXResponse response = xxxService.getXXX(request.build()); 
  10. if(response.xxx.size()==1) 
  11. return response.xxx.get(0); 
  12. return null
  13.  

對所有服務器端接口提供對應的客戶端SDK,也是微服務架構***實踐之一。以此封裝完成后,調用方即可以像使用普通接口一樣,無需了解實現細節。

【本文為51CTO專欄作者“鳳凰牌老熊”的原創稿件,轉載請通過微信公眾號“鳳凰牌老熊”聯系作者本人】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2024-07-02 10:58:53

2021-03-04 15:48:05

微服務語言開源

2019-08-21 08:44:52

RPC框架Java

2020-04-10 13:04:19

微服務架構RPC

2022-11-11 17:09:55

微服務RPC

2016-09-22 16:40:48

微服務架構RPC-client序

2020-09-29 07:00:00

微服務API架構

2016-09-22 16:06:21

微服務架構RPC框架

2019-02-21 09:18:27

服務路由負載均衡微服務

2019-05-21 14:01:17

RPC框架Http

2025-01-20 00:10:00

Go語言Kratos

2021-12-28 08:36:55

網關APIRPC

2018-05-04 14:34:06

微服務SOAAPI

2022-03-23 09:00:00

微服務KafkaChronicle

2015-05-25 13:44:42

微服務微服務架構Docker

2020-06-04 09:24:26

微服務數據框架

2018-04-09 10:06:53

微服務云計算競爭

2023-03-27 15:39:53

微服務架構REST

2020-11-26 18:18:21

微服務業務規模技術

2020-09-08 06:48:07

微服務算法限流
點贊
收藏

51CTO技術棧公眾號

国产精品hd| 国产一区二区三区国产精品| 久久综合99re88久久爱| 国产精品久久久| 日韩精品电影一区二区三区| 国产精品黄色片| 亚洲精品乱码久久久久久日本蜜臀| 成人性色av| 看黄色一级大片| 你懂的网址国产 欧美| 精品在线小视频| 国产精品自拍视频在线| 成人黄色动漫| 中文字幕欧美区| 国产一区二区视频在线免费观看| wwwwww在线观看| 亚洲无吗在线| 丝袜亚洲欧美日韩综合| 日本一卡二卡在线| 91麻豆精品国产综合久久久 | 黄色一级免费视频| 久久av中文| 欧美www视频| 一起操在线视频| 欧美成人a交片免费看| 亚洲一区二区在线免费观看视频 | 色综合网色综合| 热久久最新地址| 自拍视频在线免费观看| 2017欧美狠狠色| 国产不卡一区二区在线观看 | 理论不卡电影大全神| 综合色中文字幕| 日韩影视精品| 国产香蕉在线观看| 韩国一区二区三区| 国产999视频| 日本三级理论片| 小处雏高清一区二区三区| 国产亚洲综合久久| 双性尿奴穿贞c带憋尿| 999在线精品| 欧美亚洲高清一区二区三区不卡| 少妇高潮毛片色欲ava片| 日本欧美电影在线观看| 中文字幕视频一区| 一区二区三区四区在线视频| 国产在线中文字幕| 国产亚洲欧美日韩日本| 美国av一区二区三区| 天堂在线观看免费视频| 成人avav影音| 国产原创精品| 少妇av一区二区| 不卡在线视频中文字幕| 黄色国产精品一区二区三区| 丰满人妻熟女aⅴ一区| 国产大陆精品国产| 国产传媒欧美日韩| 六月婷婷中文字幕| 99这里只有久久精品视频| 国产亚洲精品自在久久| 日韩一级在线播放| 91香蕉视频黄| 欧美日韩国产高清视频| 国产福利在线| 国产精品三级电影| 大桥未久一区二区三区| 男人添女人下部高潮视频在线观看| 一区二区三区美女| 日本午夜激情视频| 国产精品高清乱码在线观看| 欧美午夜精品久久久久久超碰| 日本www.色| 亚洲毛片在线免费| 精品日韩99亚洲| av直播在线观看| 日韩精品欧美| 欧美理论片在线观看| 永久免费看片在线播放| 美女尤物久久精品| 91精品在线影院| 高h调教冰块play男男双性文| 97se亚洲国产综合自在线| 欧美在线日韩精品| 免费观看久久久久| 午夜激情一区二区| 三级a在线观看| 欧美日韩中出| 亚洲精品午夜精品| 91香蕉视频在线播放| 亚洲精品护士| 国产精品一区二区三区免费视频 | 中国黄色录像片| xxx.xxx欧美| 欧美最猛黑人xxxxx猛交| 免费成人黄色大片| 日韩av资源网| 日韩一二三在线视频播| 国产网址在线观看| 卡一卡二国产精品 | 欧美大尺度做爰床戏| 欧美第一在线视频| 亚洲天堂av在线播放| 538精品在线视频| 爽好久久久欧美精品| 亚洲一区国产精品| 国产毛片av在线| 亚洲高清免费观看| 伊人色在线视频| 亚洲香蕉视频| 欧美高清一级大片| 中文字幕 亚洲视频| 波多野结衣视频一区| 中文字幕在线亚洲精品| 美女18一级毛片一品久道久久综合| 91精品国模一区二区三区| 亚洲AV无码国产成人久久| 欧美精品色网| 成人福利网站在线观看| 神马电影在线观看| 亚洲综合久久av| 911福利视频| 国产影视一区| 97精品在线视频| 性一交一乱一乱一视频| 日韩美女精品在线| 邪恶网站在线观看| 精品香蕉视频| 日韩av免费在线| 污污网站免费在线观看| 一区二区三区四区乱视频| 91高清国产视频| jizzjizz欧美69巨大| 欧美一区二区三区图| 亚洲精品一区二区口爆| 亚洲精品中文字幕在线观看| av亚洲天堂网| 色999国产精品| 国产精品高潮视频| 国家队第一季免费高清在线观看| 丰满岳妇乱一区二区三区| 一级少妇精品久久久久久久| 午夜日韩av| 91手机在线观看| 日本三级在线观看网站| 日韩精品影音先锋| 精品少妇久久久| 成人精品电影在线观看| 性高湖久久久久久久久aaaaa| 国产一区二区三区黄网站| 欧美插天视频在线播放| 精品国产伦一区二区三| 亚洲一区二区三区中文字幕| 国产无套精品一区二区三区| 国产综合自拍| 国产一级特黄a大片99| 精精国产xxxx视频在线播放| 精品亚洲一区二区| 色老头在线视频| 国产女人水真多18毛片18精品视频 | 国产对白叫床清晰在线播放| 欧美综合天天夜夜久久| 亚洲精品国产精品国自| 精品一区二区综合| 小泽玛利亚av在线| 精品国产导航| 日韩免费观看视频| 欧美尤物美女在线| 日韩欧美激情四射| 日韩成人免费观看| 久久精品男人的天堂| 国产福利在线免费| 国产精品v日韩精品v欧美精品网站| 成人av免费看| 欧美精品总汇| 日韩在线视频中文字幕| www.av黄色| 欧美日韩国产影院| 激情五月深爱五月| 国产传媒欧美日韩成人| 日本三级免费网站| 亚洲成av人片一区二区密柚| 国产激情一区二区三区在线观看| 亚洲精品一区| 久久精视频免费在线久久完整在线看| 风流老熟女一区二区三区| 一本大道久久a久久精二百| 九九热视频在线免费观看| 成人性生交大片免费看中文| 不卡av免费在线| 欧美视频福利| 婷婷久久伊人| 精品亚洲自拍| 成人av.网址在线网站| 国产在线观看www| 色青青草原桃花久久综合 | 成人免费毛片a| 国内自拍视频一区| 亚洲一级黄色| 中文字幕中文字幕一区三区| 色婷婷久久久| 亚洲综合一区二区不卡| 免费欧美电影| 91国内免费在线视频| 麻豆视频免费在线观看| 亚洲欧美日韩中文在线| 性欧美8khd高清极品| 欧美色视频在线| 日本高清www免费视频| 中文字幕一区av| 91网站免费入口| 国产不卡高清在线观看视频| 久久婷五月综合| 亚洲尤物影院| 久久久久99精品成人片| 欧美丰满老妇| 日韩中文字幕一区| 亚洲国产欧美日韩在线观看第一区 | 国产成人av毛片| 成人黄色在线免费| 精品三区视频| 国产aⅴ夜夜欢一区二区三区 | 裸体xxxx视频在线| 亚洲精品一区二区三区精华液| 国产乱叫456在线| 欧美色涩在线第一页| 波多野结衣人妻| 日韩欧美国产骚| www.中文字幕在线观看| 亚洲成av人片一区二区梦乃| 欧美黄色免费看| ...xxx性欧美| 成人免费视频入口| 日本一区二区三区视频视频| 波多野结衣片子| 91蜜桃婷婷狠狠久久综合9色| 怡红院一区二区| 国产99精品视频| 久久久久久久穴| 懂色av一区二区三区免费看| 欧美人与性动交α欧美精品 | 中文字幕精品久久久| 成人国产精品免费网站| 日批免费观看视频| 成人一区二区三区| 精品人妻一区二区三区日产| 不卡的av网站| 久久人人爽人人爽人人片| 97超碰欧美中文字幕| 极品人妻一区二区三区| 91看片淫黄大片一级在线观看| 国产精品无码毛片| 91首页免费视频| 精品国产无码在线观看| 国产免费成人在线视频| 我想看黄色大片| 中文字幕成人网| 免费成人美女女在线观看| 亚洲免费观看高清完整| 欧美精品一区二区蜜桃| 亚洲图片有声小说| 久久久国产精品成人免费| 欧美色另类天堂2015| 麻豆成人免费视频| 欧美在线视频不卡| 国产麻豆91视频| 日韩欧美国产一区二区在线播放 | 99re99热| 亚洲午夜av| 激情六月丁香婷婷| 精一区二区三区| 中文字幕1区2区| xnxx国产精品| 我要看一级黄色录像| 亚洲一区二区三区国产| 国产成人无码av| 7777精品伊人久久久大香线蕉的| 国精产品一品二品国精品69xx| 日韩久久免费电影| 欧美激情午夜| 国内久久久精品| 不卡亚洲精品| 国产富婆一区二区三区| av一区二区三区四区电影| 亚洲警察之高压线| 色一情一乱一乱一区91| 午夜亚洲福利在线老司机| 久久久久久久久久一区| 99久久伊人网影院| 欧洲美女女同性互添| 精品免费在线观看| 国产一区二区在线视频观看| 精品国产人成亚洲区| av网站大全在线观看| 欧美日本精品在线| 四虎影视4hu4虎成人| 不卡视频一区二区三区| 日韩成人a**站| 男人日女人视频网站| 九九视频精品免费| 在线观看日本中文字幕| 亚洲一区二区三区爽爽爽爽爽 | 茄子视频成人在线观看| 欧美成人午夜| 亚洲综合欧美在线| 91色综合久久久久婷婷| 久久久.www| 欧美视频一区二区| 亚洲 小说区 图片区 都市| 日韩在线小视频| 日本免费一区二区三区四区| 国产高清精品一区| 欧美阿v一级看视频| 亚洲小视频网站| 亚洲国产高清不卡| 羞羞影院体验区| 欧美成人vr18sexvr| 拍真实国产伦偷精品| 国产精品国产三级国产专播精品人 | www视频在线看| 国产精品尤物福利片在线观看| 日韩中出av| 黄色片网址在线观看| 国产精品18久久久久久久网站| 青娱乐国产视频| 色综合一个色综合| 爽爽视频在线观看| 91极品女神在线| 国产96在线亚洲| 黄色网在线视频| 国产一区三区三区| 国产日产在线观看| 欧美日韩一区二区三区不卡| 国产www.大片在线| 欧美一级大片在线观看| 日韩系列在线| 久久久久久久久久久久久国产精品| 成人h动漫精品| 免费日韩在线视频| 日韩三级中文字幕| 影院在线观看全集免费观看| 91视频免费网站| 欧美一区久久| 久久黄色一级视频| 亚洲影院理伦片| 丰满少妇在线观看bd| 性欧美在线看片a免费观看| www.神马久久| www.av片| 91在线小视频| 天码人妻一区二区三区在线看| 日韩成人网免费视频| 亚洲深夜视频| 日本不卡在线播放| 日本伊人色综合网| 99精品中文字幕| 欧美一卡二卡在线| 国产盗摄精品一区二区酒店| 4438全国亚洲精品在线观看视频| 黄色av免费在线| 成人福利网站在线观看11| 91tv精品福利国产在线观看| www.色.com| 一区二区三区精品视频在线| 成人午夜视频一区二区播放| 韩日精品中文字幕| 蜜桃视频欧美| 超碰超碰在线观看| 一区二区三区不卡在线观看| 人妻无码中文字幕| 欧洲亚洲免费视频| 91欧美在线| 在线播放av网址| 日韩欧美中文字幕在线观看 | 国产一区二区三区18| 欧洲亚洲精品| 国产一区二区三区在线免费| yourporn久久国产精品| 亚洲国产av一区二区三区| 色婷婷综合久久久久中文字幕1| 国产日韩中文在线中文字幕| 欧日韩免费视频| 国产午夜精品一区二区三区视频| 亚洲一卡二卡在线观看| 久久久久久久国产精品视频| 精品国产99| 国产精品一级无码| 色婷婷一区二区| 亚洲区欧洲区| 热舞福利精品大尺度视频| 国产精品99久久久久久似苏梦涵| 日韩在线视频免费播放| 日日噜噜噜夜夜爽亚洲精品| 美女主播精品视频一二三四| 91欧美视频在线| 欧美日韩国产色| 国产精品剧情一区二区在线观看| 麻豆成人av| 国产成人精品亚洲日本在线桃色|