日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何設計一個安全的對外接口,老司機總結了這幾點...

來源: 責編: 時間:2024-01-15 17:12:14 302觀看
導讀博主之前做過恒豐銀行代收付系統(相當于支付接口),包括現在的oltpapi交易接口和虛擬業務的對外提供數據接口。總之,當你做了很多項目寫了很多代碼的時候,就需要回過頭來,多總結總結,這樣你會看到更多之前寫代碼的時候看不到

博主之前做過恒豐銀行代收付系統(相當于支付接口),包括現在的oltpapi交易接口和虛擬業務的對外提供數據接口。總之,當你做了很多項目寫了很多代碼的時候,就需要回過頭來,多總結總結,這樣你會看到更多之前寫代碼的時候看不到的東西,也能更明白為什么要這樣做。XEO28資訊網——每日最新資訊28at.com

XEO28資訊網——每日最新資訊28at.com

做接口需要考慮的問題

1.什么是接口

接口無非就是客戶端請求你的接口地址,并傳入一堆該接口定義好的參數,通過接口自身的邏輯處理,返回接口約定好的數據以及相應的數據格式。XEO28資訊網——每日最新資訊28at.com

2.接口怎么開發

接口由于本身的性質,由于和合作方對接數據,所以有以下幾點需要在開發的時候注意:XEO28資訊網——每日最新資訊28at.com

(1) 定義接口入參:寫好接口文檔XEO28資訊網——每日最新資訊28at.com

(2) 定義接口返回數據類型:一般都需要封裝成一定格式,確定返回json還是xml報文等XEO28資訊網——每日最新資訊28at.com

XEO28資訊網——每日最新資訊28at.com

見如下返回數據定義格式:XEO28資訊網——每日最新資訊28at.com

package com.caiex.vb.model; import java.io.Serializable;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "Result", propOrder = { "resultCode", "resultMsg" })public class Result implements Serializable { private static final long serialVersionUID = 10L; protected int resultCode; protected String resultMsg;  public int getResultCode() {  return this.resultCode; }  public void setResultCode(int value) {  this.resultCode = value; }  public String getResultMsg() {  return this.resultMsg; }  public void setResultMsg(String value) {  this.resultMsg = value; }}
package com.caiex.vb.model; import java.io.Serializable; public class Response implements Serializable {  private static final long serialVersionUID = 2360867989280235575L;  private Result result;  private Object data;  public Result getResult() {  if (this.result == null) {   this.result = new Result();  }  return result; }  public void setResult(Result result) {  this.result = result; }  public Object getData() {  return data; }  public void setData(Object data) {  this.data = data; } }

(3) 確定訪問接口的方式,get or post等等,可以根據restful接口定義規則RESTful API:RESTful APIXEO28資訊網——每日最新資訊28at.com

(4) 定義一套全局統一并通用的返回碼,以幫助排查問題:XEO28資訊網——每日最新資訊28at.com

 public static int NO_AGENT_RATE = 1119;  //未找到兌換率  public static int SCHEME_COMMIT_FAIL = 4000;  //方案提交失敗  public static int SCHEME_CONFIRMATION = 4001;  //方案確認中  public static int SCHEME_NOT_EXIST = 4002;  //方案不存在  public static int SCHEME_CANCEL= 4005;  //方案不存在  //。。。。

(5) 統一的異常處理:應該每個系統都需要一套統一的異常處理XEO28資訊網——每日最新資訊28at.com

package com.caiex.vb.interceptor; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody; import com.caiex.vb.model.Response; @ControllerAdvice@ResponseBodypublic class GlobalExceptionHandler {  private  Logger  logger = LoggerFactory.getLogger(this.getClass());      /**     * 所有異常報錯     * @param request     * @param exception     * @return     * @throws Exception     */    @ExceptionHandler(value=Exception.class)      public Response allExceptionHandler(HttpServletRequest request,              Exception exception) throws Exception      {       logger.error("攔截到異常:", exception);        Response response = new Response();        response.setData(null);        response.getResult().setResultCode(9999);        response.getResult().setResultMsg("系統繁忙");        return response;      }   }

(6) 攔截器鏈設置:合作方訪問接口的時候,會根據你接口定義好的傳參訪問你的接口服務器,但是會存在接口參數類型錯誤或者格式不對,必傳參數沒傳的問題,甚至一些惡意請求,都可以通過攔截器鏈進行前期攔截,避免造成接口服務的壓力。XEO28資訊網——每日最新資訊28at.com

還有很重要的一點,加簽驗簽也可以在攔截器設置。繼承WebMvcConfigurerAdapter實現springboot的攔截器鏈。實現HandlerInterceptor方法編寫業務攔截器。XEO28資訊網——每日最新資訊28at.com

package com.caiex.vb.interceptor;  import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.stereotype.Component;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView; import com.alibaba.fastjson.JSON;import com.caiex.redis.service.api.RedisApi;import com.caiex.vb.model.Response;import com.caiex.vb.utils.CaiexCheckUtils; @Componentpublic class SignInterceptor extends BaseValidator implements HandlerInterceptor{  private Logger logger = LogManager.getLogger(this.getClass());  @Resource private RedisApi redisApi;   public void afterCompletion(HttpServletRequest arg0,   HttpServletResponse arg1, Object arg2, Exception arg3)   throws Exception {  // TODO Auto-generated method stub   }  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,   Object arg2, ModelAndView arg3) throws Exception {  // TODO Auto-generated method stub   }  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,   Object arg2) throws Exception {  if(isTestIpAddr(arg0)){   return true;  }  String securityKey = redisApi.hGet("securityKey", arg0.getParameter("agentid"));  if(StringUtils.isEmpty(securityKey)){   Response response = new Response();   response.setData(null);   response.getResult().setResultCode(8001);   response.getResult().setResultMsg("缺少私鑰, 渠道號:" + arg0.getParameter("agentid"));   logger.error("缺少私鑰, 渠道號:" + arg0.getParameter("agentid"));   InterceptorResp.printJson(arg1, response);   return false;  }    if(StringUtils.isEmpty(arg0.getParameter("sign")) || !arg0.getParameter("sign").equals(CaiexCheckUtils.getSign(arg0.getParameterMap(), securityKey))){   Response response = new Response();   response.setData(null);   response.getResult().setResultCode(3203);   response.getResult().setResultMsg("參數簽名認證失敗");   logger.error("參數簽名認證失敗:" + JSON.toJSONString(arg0.getParameterMap()) + " securityKey = " + securityKey);   InterceptorResp.printJson(arg1, response);   return false;  }else{   return true;  }   } }
package com.caiex.oltp.config; import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.EnableWebMvc;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.caiex.oltp.interceptor.APILimitRateValidator;import com.caiex.oltp.interceptor.CommonValidator;import com.caiex.oltp.interceptor.DDSAuthValidator;import com.caiex.oltp.interceptor.QueryPriceParamsValidator;import com.caiex.oltp.interceptor.TradeParamsValidator;  @EnableWebMvc@Configuration@ComponentScanpublic class WebAppConfigurer extends WebMvcConfigurerAdapter {    @Bean   CommonValidator commonInterceptor() {         return new CommonValidator();     }    @Bean   DDSAuthValidator ddsAuthInterceptor() {         return new DDSAuthValidator();     }    @Bean   QueryPriceParamsValidator queryPriceParamsInterceptor() {         return new QueryPriceParamsValidator();     }    @Bean   TradeParamsValidator tradeParamsInterceptor() {         return new TradeParamsValidator();     }     @Bean   APILimitRateValidator aPILimitRateInterceptor() {         return new APILimitRateValidator();     }       @Override     public void addInterceptors(InterceptorRegistry registry) {            //訪問速率限制      registry.addInterceptor(aPILimitRateInterceptor())      .addPathPatterns("/*/*");      //.addPathPatterns("/price/getPriceParam");       //參數簽名認證         registry.addInterceptor(ddsAuthInterceptor())         .addPathPatterns("/tradeState/*")         .addPathPatterns("/recycle/*")         .addPathPatterns("/matchInfo/*")         .addPathPatterns("/price/tradeTicketParam");                  //公共參數檢查         registry.addInterceptor(commonInterceptor())         .addPathPatterns("/price/tradeTicketParam")         .addPathPatterns("/tradeState/*")         .addPathPatterns("/recycle/*");                  //詢價參數校驗         registry.addInterceptor(queryPriceParamsInterceptor())         .addPathPatterns("/price/getPriceParam");                  //交易參數檢查         registry.addInterceptor(tradeParamsInterceptor())         .addPathPatterns("/price/tradeTicketParam");                  super.addInterceptors(registry);     }}

(7) token令牌和sign數字簽名實現數據保密性。XEO28資訊網——每日最新資訊28at.com

3.創建令牌(Token)

為保證請求的合法性,我們提供第三方創建令牌接口,某些接口需要通過token驗證消息的合法性,以免遭受非法攻擊。XEO28資訊網——每日最新資訊28at.com

token過期時間目前暫時定為1天,由于考慮到合作方往往是分布式環境,多臺機器都有可能申請token,為了降低合作方保證token一致性的難度,調用接口創建token成功以后一分鐘以內,再次請求token返回的數據是一樣的。XEO28資訊網——每日最新資訊28at.com

4.獲取私鑰

獲取用于數字簽名的私鑰,第三方獲取的私鑰需妥善保存,并定期更新,私鑰只參與數字簽名,不作為參數傳輸。XEO28資訊網——每日最新資訊28at.com

  • 數字簽名方式:參數簽名;簽名方式:所有值不為null的參數(不包括本參數)均參與數字簽名,按照“參數名+參數值+私鑰”的格式得到一個字符串,再將這個字符串MD5一次就是這個參數的值。(示例:h15adc39y9ba59abbe56e057e60f883g),所以需要先獲取私鑰。
  • 驗簽方式:將用戶的所有非null參數放入定義好排序規則的TreeSet中進行排序,再用StringBuilder按照按照“參數名+參數值+私鑰”的格式得到一個字符串(私鑰從redis拿),再將這個字符串MD5一次就是這個參數的值。將這個值與用戶傳來的sign簽名對比,相同則通過,否則不通過。
private String createToken(){  String utk = "Msk!D*"+System.currentTimeMillis()+"UBR&FLP";  logger.info("create token   --- "+Md5Util.md5(utk));  return Md5Util.md5(utk); }

(8) 接口限流XEO28資訊網——每日最新資訊28at.com

有時候服務器壓力真的太大,以防交易接口被擠死,就可以對一些其他不影響主要業務功能并且計算量大的接口做限流處理。RateLimit--使用guava來做接口限流,當接口超過指定的流量時,就不處理該接口的請求。詳細可看RateLimit。也可參考其他限流框架。XEO28資訊網——每日最新資訊28at.com

(9) 協議加密,http升級成https;XEO28資訊網——每日最新資訊28at.com

為什么要升級呢,為了保證數據的安全性。當使用https訪問時,數據從客戶端到服務斷,服務端到客戶端都加密,即使黑客抓包也看不到傳輸內容。當然還有其他好處,這里不多講。但這也是開發接口項目需要注意的一個問題。XEO28資訊網——每日最新資訊28at.com

如何提高接口的高并發和高可用

接口開發好了,接下來就討論接口的可用性問題。首先我們要將高并發和高可用區分一下,畢竟高可用是在可用的情況,只是很慢或者效率不高。其實也可以歸為一類問題,但是不重要啦,重要的是怎么提高你寫的接口的訪問速度和性能。XEO28資訊網——每日最新資訊28at.com

1.接口的高并發解決方案(其實沒有唯一答案,業界針對不同業務也有很多不同的方法)

當訪問一個接口獲取數據時,發現返回很慢,或者總是超時,如果排除網絡的原因,那就是接口服務器壓力太大,處理不過來了。在世界杯期間,我們查看后臺日志總是connection by reset和borker pipe和一些超時問題。XEO28資訊網——每日最新資訊28at.com

這時候,你可能遇到了高并發和高可用問題。但是,不管遇到什么問題,都不能臆斷和亂改,你得需要找到慢的原因,才能對癥下藥,亂改可能會導致其他問題的出現。首先,解決高并發問題的三個方向是負載均衡,緩存和集群。XEO28資訊網——每日最新資訊28at.com

(1) 負載均衡XEO28資訊網——每日最新資訊28at.com

我們使用的是阿里云服務器的負載均衡,后臺分布式服務管理,我們運維小哥哥搭建了一套k8s,可以自由在k8s上擴展服務節點,各個服務結點也能隨內存的使用自動漂移,不用多說,k8s真的很厲害,感興趣的同學可以詳細去學。那么問題來了,阿里云的負載均衡怎么對應到k8s的負載均衡呢?XEO28資訊網——每日最新資訊28at.com

這個涉及到了k8s的service暴露的一些特點,簡單說就是k8s把所有集群的服務都通過指定的內部負載均衡,在指定的服務器上暴露,然后我們又把這幾個服務器接在阿里云負載均衡下,這個涉及的細節和配置很多。當然,除nginx外,還有其他負載均衡解決方案,軟件硬件都有,硬件如f5等。XEO28資訊網——每日最新資訊28at.com

阿里云的nginx負載均衡,我們使用的是加權輪詢策略,其實輪詢是最低效的方式;XEO28資訊網——每日最新資訊28at.com

這就是最基本的負載均衡實例,但這不足以滿足實際需求;目前Nginx服務器的upstream模塊支持6種方式的分配:XEO28資訊網——每日最新資訊28at.com

負載均衡策略:XEO28資訊網——每日最新資訊28at.com

輪詢
XEO28資訊網——每日最新資訊28at.com

默認方式
XEO28資訊網——每日最新資訊28at.com

weightXEO28資訊網——每日最新資訊28at.com

權重方式XEO28資訊網——每日最新資訊28at.com

ip_hashXEO28資訊網——每日最新資訊28at.com

依據ip分配方式XEO28資訊網——每日最新資訊28at.com

least_connXEO28資訊網——每日最新資訊28at.com

最少連接方式XEO28資訊網——每日最新資訊28at.com

fair(第三方)XEO28資訊網——每日最新資訊28at.com

響應時間方式XEO28資訊網——每日最新資訊28at.com

url_hash(第三方)XEO28資訊網——每日最新資訊28at.com

依據URL分配方式XEO28資訊網——每日最新資訊28at.com

(2) 集群XEO28資訊網——每日最新資訊28at.com

首先,通過排查問題,發現是oltpapi接口服務處理請求很慢,大量請求過來,總是超時和中斷連接,這時候,我們想著最簡單的方法就是加機器,給oltp接口服務多加幾臺機器。XEO28資訊網——每日最新資訊28at.com

嗯,一切都很完美,如預期進行,但是加到一定數量,你發現,怎么不起效果,異步響應還是很慢,或者更直觀的說,消息隊列出現了嚴重的消息堆積。這時候,你發現出現了新的問題或者瓶頸,這個問題已經不是說加oltp服務器能解決了,那么,就需要去重新定位問題。發現是消息堆積,消息堆積就是生產者過快,導致消費者消費不過來,這時候,你就需要增加消費者的消費數量。給風控系統多加幾臺機器,讓消費者和生產者達到一定平衡。XEO28資訊網——每日最新資訊28at.com

這里有個誤區,你可能以為是rocketmq的broker數量過少,增加broker數量,其實當消費者和生產者保持一樣的速度時,消息肯定不對堆積,按照原始的broker數量就足夠。但是增加broker也會使得消息得到盡快的處理,提升一定效率。XEO28資訊網——每日最新資訊28at.com

(3) 緩存XEO28資訊網——每日最新資訊28at.com

當加機器不能解決問題時,或者說沒那么多服務器可使用時,那么就要重代碼層面解決高并發問題。Redis 是一個高性能的key-value數據庫,當獲取數據從數據庫拿很慢時,就可以存儲到redis,從redis取值。XEO28資訊網——每日最新資訊28at.com

  • 用ConcurrentHashMap緩存對象,并設置過期時間
  • redis緩存數據,結合spring定時任務定時獲取不會經常改動的key
  • 提高使用redis的效率:比如使用mGet一次獲取多個key
  • ....等

2.接口高可用問題

高可用問題應該上升到整個服務的架構問題上,就是說在搭建整體系統是就應該考慮到。高可用問題是以單點故障,訪問速度慢的問題為主導。見  服務高可用XEO28資訊網——每日最新資訊28at.com

  • redis主從分布式(redis的單點故障和訪問速度的提高和主從備份)
  • 分布式dubbo服務的zookeeper主從集群
  • strom的主從集群
  • ...等

總結

下面對接口開發服務做一些總結:XEO28資訊網——每日最新資訊28at.com

1.是拉還是推

當接口作為數據源時,還要考慮數據是讓合作方主動過來拉還是數據有變化就推送呢,當然是推的效果更好,但是如何有效的推數據,不推重復數據等都是需要根據實際業務考慮的問題。XEO28資訊網——每日最新資訊28at.com

2.多臺分布式服務器上,怎么保證交易的冪等和訂單的唯一性

當接口服務和合作方都處于分布式情況下,就很容易出現一個訂單號申請多次交易請求,但是根據冪等性,一張彩票只能交易一次,并且每次不管何時請求,結果都應該一樣不會改變。這種情況下,我們怎么保證唯一性呢,我們需要把該訂單和訂單狀態存redis,每次請求時去看是否訂單已存在。但可能這次交易不成功,下次這張票還可以繼續交易,可以生成新的訂單號啊。XEO28資訊網——每日最新資訊28at.com

redis的setNX是一個很好的解決方案,意思是當存在該key時,返回false,當沒有時,該key和value插入成功。用作檢查訂單是否正在提交,如果是,則阻塞本次請求,避免重復提交 ,可以設置過期時間3s。提交之前鎖定訂單,防止重復提交。XEO28資訊網——每日最新資訊28at.com

3.處理時間超過10s,自動返回該訂單交易失敗

總之,博主發現,在高并發場景下,導致服務崩潰的原因還是redis和數據庫,可能是redis讀寫太慢,或者數據庫的一些sql使用不當,或者沒建索引導致讀寫很慢。XEO28資訊網——每日最新資訊28at.com

總之,這是一條很漫長的路,我們都需要慢慢積累經驗和學習前人更優秀的解決辦法。XEO28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-61910-0.html如何設計一個安全的對外接口,老司機總結了這幾點...

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 未來世界的12個軟件開發預測

下一篇: 谷歌裁員千人,攪動硅谷!終身編程終結,我們何以茍活?

標簽:
  • 熱門焦點
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業務的發展,組織規模的擴大,越來越多的企業開始意識到協作效率對于企業團隊的重要性,甚至是決定其在某個行業競爭中突圍的關鍵,是企業長久生存的根本。得物
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 從零到英雄:高并發與性能優化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構師或者程序員,你是否曾經為公司的系統在面對高并發和性能瓶頸時感到手足無措或者焦頭爛額呢?筆者在出道那會為此是吃盡了苦頭的,不過也得
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對“勢”的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 華為HarmonyOS 4.0將于8月4日發布 或搭載AI大模型技術

    華為宣布HarmonyOS4.0將于8月4日正式發布。此前,華為已經針對開發者公布了HarmonyOS4.0,以便于開發者提前進行適配,也因此被曝光出了一些新系統的特性
  • 首發天璣9200+ iQOO Neo8系列發布首銷售價2299元起

    2023年5月23日晚,iQOO Neo8系列正式發布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強悍登場,限時售價3099元起;價位段最強性能手機iQOO Neo8同期上市
  • 回歸OPPO兩年,一加贏了銷量,輸了品牌

    成為OPPO旗下主打性能的先鋒品牌后,一加屢創佳績。今年618期間,一加手機全渠道銷量同比增長362%,憑借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久久综合精品| 亚洲免费激情| 国产精品区一区| 国产精品性做久久久久久| 中文一区二区| 在线观看av不卡| 亚洲国产美女| 国产一区二区三区免费观看| 欧美日韩一区二区在线 | 久久久久综合网| 欧美黄色一级视频| 国产精品国产自产拍高清av王其| 国产婷婷色一区二区三区| 亚洲国产成人在线| 中日韩美女免费视频网址在线观看 | 亚洲一区二区三区四区五区午夜 | 欧美在线一二三| 免费欧美视频| 国产精品久久久久久久久动漫| 国内精品久久久久影院薰衣草| 亚洲精品日韩一| 欧美一区三区二区在线观看| 欧美国产日韩a欧美在线观看| 国产精品久久久久久久久久久久久久 | 国产免费成人| 亚洲精品黄网在线观看| 91久久视频| 午夜精品网站| 欧美精品一区二区高清在线观看| 国产欧美一区二区精品仙草咪| 在线免费高清一区二区三区| 亚洲一区二区成人| 免费不卡在线观看| 国产精品一区二区a| 亚洲福利电影| 尤物99国产成人精品视频| 99re热这里只有精品免费视频| 欧美一区中文字幕| 欧美日韩精品免费观看视频完整| 国产亚洲激情视频在线| 一区二区三区**美女毛片| 久久亚洲综合| 国产伦精品一区二区三区视频孕妇| 亚洲啪啪91| 亚洲激情av| 欧美中文日韩| 国产精品成人一区二区三区吃奶| 亚洲国产精品第一区二区三区| 午夜精品久久久久久久| 欧美日韩另类一区| 亚洲国产精品久久久| 欧美在线一二三| 国产精品日韩电影| 一区二区三区欧美在线| 欧美风情在线观看| 在线精品一区二区| 久久精品国产亚洲精品| 国产精品日韩精品欧美精品| 亚洲最新视频在线| 新狼窝色av性久久久久久| 欧美激情亚洲国产| 尤物yw午夜国产精品视频| 欧美亚洲视频在线观看| 欧美性一二三区| 亚洲免费大片| 欧美高清视频在线| 亚洲高清中文字幕| 老司机免费视频一区二区三区| 国产亚洲福利| 欧美在线观看视频一区二区三区| 国产精品美女一区二区| 亚洲一区二区三区三| 欧美日韩视频在线观看一区二区三区 | 亚洲女同性videos| 国产精品v一区二区三区 | 久久精品男女| 国产日韩在线视频| 欧美有码视频| 国产午夜一区二区三区| 欧美一区二区三区播放老司机| 老巨人导航500精品| 狠狠干综合网| 制服丝袜激情欧洲亚洲| 欧美视频在线免费看| 一区二区三区四区五区精品视频| 欧美精品一区二区三区在线播放| 亚洲精品国产精品国自产在线| 欧美大片18| 亚洲美女视频| 欧美三级在线| 在线免费一区三区| 久热国产精品视频| 亚洲福利免费| 欧美黑人多人双交| 一区二区三区福利| 国产精品老牛| 久久不见久久见免费视频1| 国产日韩欧美精品| 99国产精品99久久久久久粉嫩| 欧美一级二区| 国产视频不卡| 久久免费的精品国产v∧| 一区二区三区自拍| 欧美成人在线免费视频| 99re6这里只有精品视频在线观看| 欧美日韩欧美一区二区| 亚洲午夜视频在线观看| 欧美ed2k| 亚洲精品1区2区| 欧美色道久久88综合亚洲精品| 亚洲一区二区三区精品动漫| 国产视频在线一区二区| 另类欧美日韩国产在线| 亚洲美女视频网| 国产精品久99| 久久久在线视频| 一区二区三区不卡视频在线观看 | 亚洲中无吗在线| 国产亚洲视频在线观看| 米奇777在线欧美播放| 99精品欧美| 国产欧美一区二区三区国产幕精品| 久久亚洲国产成人| aⅴ色国产欧美| 国产欧美69| 欧美成人亚洲成人日韩成人| 亚洲午夜一区| 国内伊人久久久久久网站视频| 欧美电影在线观看完整版| 亚洲摸下面视频| 精品999在线观看| 欧美视频中文字幕在线| 久久久久久久久久久久久女国产乱| 亚洲精品日本| 国产视频亚洲| 欧美精品免费在线| 欧美在线视频日韩| 日韩午夜电影在线观看| 国产农村妇女精品| 欧美国产视频一区二区| 欧美一级专区免费大片| 亚洲精品社区| 国产亚洲成人一区| 欧美天堂亚洲电影院在线观看| 久久久免费av| 亚洲一区影音先锋| 亚洲国产欧美精品| 国产亚洲精品美女| 欧美日韩免费在线| 久久躁狠狠躁夜夜爽| 亚洲一区二区在线看| 亚洲国产女人aaa毛片在线| 国产女人水真多18毛片18精品视频| 欧美国产专区| 久久九九国产精品怡红院| 亚洲深夜福利| 亚洲黑丝一区二区| 国产一区二区三区的电影| 欧美三级免费| 欧美精品久久天天躁| 久久一本综合频道| 欧美一级在线视频| 制服丝袜亚洲播放| 亚洲人成高清| 极品少妇一区二区三区精品视频| 欧美视频不卡中文| 欧美高清一区二区| 久久www成人_看片免费不卡| 宅男66日本亚洲欧美视频| 亚洲黄色片网站| 精久久久久久久久久久| 国产免费成人| 国产精品人人做人人爽| 久久亚洲欧美| 欧美一区二区三区日韩| 亚洲深夜福利在线| 日韩视频免费看| 亚洲激情综合| 伊人狠狠色j香婷婷综合| 国产喷白浆一区二区三区| 欧美性猛片xxxx免费看久爱 | 欧美顶级艳妇交换群宴| 久久精品青青大伊人av| 亚洲欧洲一区二区在线播放| 激情文学一区| 国产日韩欧美亚洲| 国产欧美日韩91| 国产精品专区一| 国产精品日韩欧美一区二区| 欧美午夜国产| 欧美性色视频在线| 国产精品二区影院| 国产精品成人在线| 欧美性生交xxxxx久久久| 欧美日韩中文字幕在线视频| 欧美激情精品久久久久久久变态| 欧美成人r级一区二区三区| 麻豆精品一区二区av白丝在线| 久久久精品日韩| 久久久伊人欧美| 老司机午夜精品视频在线观看| 久久九九国产| 久久一区亚洲| 一区二区三区精品国产|