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

Node.js 服務(wù)性能翻倍的秘密(一)

開(kāi)發(fā) 前端
用過(guò) Node.js 開(kāi)發(fā)過(guò)的同學(xué)肯定都上手過(guò) koa,因?yàn)樗?jiǎn)單優(yōu)雅的寫(xiě)法,再加上豐富的社區(qū)生態(tài),而且現(xiàn)存的許多 Node.js 框架都是基于 koa 進(jìn)行二次封裝的。

[[357556]]

前言

用過(guò) Node.js 開(kāi)發(fā)過(guò)的同學(xué)肯定都上手過(guò) koa,因?yàn)樗?jiǎn)單優(yōu)雅的寫(xiě)法,再加上豐富的社區(qū)生態(tài),而且現(xiàn)存的許多 Node.js 框架都是基于 koa 進(jìn)行二次封裝的。但是說(shuō)到性能,就不得不提到一個(gè)知名框架:fastify ,聽(tīng)名字就知道它的特性就是快,官方給出的Benchmarks甚至比 Node.js 原生的 http.Server 還要快。


Benchmarks

性能提升的關(guān)鍵

我們先看看 fastify 是如何啟動(dòng)一個(gè)服務(wù)的。

  1. # 安裝 fastify 
  2. npm i -S fastify@3.9.1 

  1. // 創(chuàng)建服務(wù)實(shí)例 
  2. const fastify = require('fastify')() 
  3.  
  4. app.get('/', { 
  5.   schema: { 
  6.     response: { 
  7.       // key 為響應(yīng)狀態(tài)碼 
  8.       '200': { 
  9.         type: 'object'
  10.         properties: { 
  11.           hello: { type: 'string' } 
  12.         } 
  13.       } 
  14.     } 
  15.   } 
  16. }, async () => { 
  17.   return { hello: 'world' } 
  18. }) 
  19.  
  20. // 啟動(dòng)服務(wù) 
  21. ;(async () => { 
  22.   try { 
  23.     const port = 3001 // 監(jiān)聽(tīng)端口 
  24.     await app.listen(port) 
  25.     console.info(`server listening on ${port}`) 
  26.   } catch (err) { 
  27.     console.error(err) 
  28.     process.exit(1) 
  29.   } 
  30. })() 

從上面代碼可以看出,fastify 對(duì)請(qǐng)求的響應(yīng)體定義了一個(gè) schema,fastify 除了可以定義響應(yīng)體的 schema,還支持對(duì)如下數(shù)據(jù)定義 schema:

  1. body:當(dāng)為 POST 或 PUT 方法時(shí),校驗(yàn)請(qǐng)求主體;
  2. query:校驗(yàn) url 的 查詢(xún)參數(shù);
  3. params:校驗(yàn) url 參數(shù);
  4. response:過(guò)濾并生成用于響應(yīng)體的 schema。
  1. app.post('/user/:id', { 
  2.   schema: { 
  3.     params: { 
  4.       type: 'object'
  5.       properties: { 
  6.        id: { type: 'number' } 
  7.       } 
  8.     }, 
  9.     response: { 
  10.       // 2xx 表示 200~299 的狀態(tài)都適用此 schema 
  11.       '2xx': { 
  12.         type: 'object'
  13.         properties: { 
  14.           id: { type: 'number' }, 
  15.           name: { type: 'string' } 
  16.         } 
  17.       } 
  18.     } 
  19.   } 
  20. }, async (req) => { 
  21.   const id = req.params.id 
  22.   const userInfo = await User.findById(id) 
  23.   // Content-Type 默認(rèn)為 application/json 
  24.   return userInfo 
  25. }) 

讓 fastify 性能提升的的秘訣在于,其返回 application/json 類(lèi)型數(shù)據(jù)的時(shí)候,并沒(méi)有使用原生的 JSON.stringify,而是自己內(nèi)部重新實(shí)現(xiàn)了一套 JSON 序列化的方法,這個(gè) schema 就是 JSON 序列化性能翻倍的關(guān)鍵。

如何對(duì) JSON 序列化

在探索 fastify 如何對(duì) JSON 數(shù)據(jù)序列化之前,我們先看看 JSON.stringify 需要經(jīng)過(guò)多么繁瑣的步驟,這里我們參考 Douglas Crockford (JSON 格式的創(chuàng)建者)開(kāi)源的 JSON-js 中實(shí)現(xiàn)的 stringify 方法。

“JSON-js:https://github.com/douglascrockford/JSON-js/blob/master/json2.js

  1. // 只展示 JSON.stringify 核心代碼,其他代碼有所省略 
  2. if (typeof JSON !== "object") { 
  3.   JSON = {}; 
  4. JSON.stringify = function (value) { 
  5.   return str("", {"": value}) 
  6. function str(key, holder) { 
  7.   var value = holder[key]; 
  8.   switch(typeof value) { 
  9.     case "string"
  10.       return quote(value); 
  11.     case "number"
  12.       return (isFinite(value)) ? String(value) : "null"
  13.     case "boolean"
  14.     case "null"
  15.       return String(value); 
  16.     case "object"
  17.       if (!value) { 
  18.         return "null"
  19.       } 
  20.       partial = []; 
  21.       if (Object.prototype.toString.apply(value) === "[object Array]") { 
  22.         // 處理數(shù)組 
  23.         length = value.length; 
  24.         for (i = 0; i < length; i += 1) { 
  25.           // 每個(gè)元素都需要單獨(dú)處理 
  26.           partial[i] = str(i, value) || "null"
  27.         } 
  28.         // 將 partial 轉(zhuǎn)成 ”[...]“ 
  29.         v = partial.length === 0 
  30.           ? "[]" 
  31.           : "[" + partial.join(",") + "]"
  32.         return v; 
  33.       } else { 
  34.         // 處理對(duì)象 
  35.         for (k in value) { 
  36.           if (Object.prototype.hasOwnProperty.call(value, k)) { 
  37.             v = str(k, value); 
  38.             if (v) { 
  39.               partial.push(quote(k) + ":" + v); 
  40.             } 
  41.           } 
  42.         } 
  43.         // 將 partial 轉(zhuǎn)成 "{...}" 
  44.         v = partial.length === 0 
  45.           ? "{}" 
  46.          : "{" + partial.join(",") + "}"
  47.         return v; 
  48.       } 
  49.   } 

從上面的代碼可以看出,進(jìn)行 JSON 對(duì)象序列化時(shí),需要遍歷所有的數(shù)組與對(duì)象,逐一進(jìn)行類(lèi)型的判斷,并對(duì)所有的 key 加上 "",而且這里還不包括一些特殊字符的 encode 操作。但是,如果有了 schema 之后,這些情況會(huì)變得簡(jiǎn)單很多。fastify 官方將 JSON 的序列化單獨(dú)成了一個(gè)倉(cāng)庫(kù):fast-json-stringify,后期還引入了 ajv 來(lái)進(jìn)行校驗(yàn),這里為了更容易看懂代碼,選擇看比較早期的版本:0.1.0,邏輯比較簡(jiǎn)單,便于理解。

“fast-json-stringify@0.1.0:https://github.com/fastify/fast-json-stringify/blob/v0.1.0/index.js

  1. function $Null (i) { 
  2.   return 'null' 
  3.  
  4. function $Number (i) { 
  5.   var num = Number(i) 
  6.   if (isNaN(num)) { 
  7.     return 'null' 
  8.   } else { 
  9.     return String(num) 
  10.   } 
  11.  
  12. function $String (i) { 
  13.   return '"' + i + '"' 
  14.  
  15. function buildObject (schema, code, name) { 
  16.   // 序列化對(duì)象 ... 
  17.  
  18. function buildArray (schema, code, name) { 
  19.   // 序列化數(shù)組 ... 
  20.  
  21. function build (schema) { 
  22.   var code = ` 
  23.     'use strict' 
  24.  
  25.     ${$String.toString()} 
  26.     ${$Number.toString()} 
  27.     ${$Null.toString()} 
  28.   ` 
  29.   var main 
  30.  
  31.   code = buildObject(schema, code, '$main'
  32.  
  33.   code += ` 
  34.     ; 
  35.     return $main 
  36.   ` 
  37.  
  38.   return (new Function(code))() 
  39.  
  40. module.exports = build 

fast-json-stringify 對(duì)外暴露一個(gè) build 方法,該方法接受一個(gè) schema,返回一個(gè)函數(shù)($main),用于將 schema 對(duì)應(yīng)的對(duì)象進(jìn)行序列化,具體使用方式如下:

  1. const build = require('fast-json-stringify'
  2.  
  3. const stringify = build({ 
  4.   type: 'object'
  5.   properties: { 
  6.     id: { type: 'number' }, 
  7.     name: { type: 'string' } 
  8.   } 
  9. }) 
  10. console.log(stringify) 
  11.  
  12. const objString = stringify({ 
  13.   id: 1, name'shenfq' 
  14. }) 
  15. console.log(objString) // {"id":1,"name":"shenfq"

經(jīng)過(guò) build 構(gòu)造后,返回的序列化方法如下:

  1. function $String (i) { 
  2.   return '"' + i + '"' 
  3. function $Number (i) { 
  4.   var num = Number(i) 
  5.   if (isNaN(num)) { 
  6.     return 'null' 
  7.   } else { 
  8.     return String(num) 
  9.   } 
  10. function $Null (i) { 
  11.   return 'null' 
  12. // 序列化方法 
  13. function $main (obj) { 
  14.   var json = '{' 
  15.  
  16.   json += '"id":' 
  17.  
  18.   json += $Number(obj.id) 
  19.   json += ',' 
  20.   json += '"name":' 
  21.  
  22.   json += $String(obj.name
  23.  
  24.   json += '}' 
  25.   return json 

可以看到,有 schema 做支撐,序列化的邏輯瞬間變得無(wú)比簡(jiǎn)單,最后得到的 JSON 字符串只保留需要的屬性,簡(jiǎn)潔高效。我們回過(guò)頭再看看 buildObject 是如何生成 $main 內(nèi)的代碼的:

  1. function buildObject (schema, code, name) { 
  2.   // 構(gòu)造一個(gè)函數(shù) 
  3.   code += ` 
  4.     function ${name} (obj) { 
  5.       var json = '{' 
  6.   ` 
  7.   var laterCode = '' 
  8.   // 遍歷 schema 的屬性 
  9.   const { properties } = schema 
  10.   Object.keys(properties).forEach((key, i, a) => { 
  11.     // key 需要加上雙引號(hào) 
  12.     code += ` 
  13.       json += '${$String(key)}:' 
  14.     ` 
  15.     // 通過(guò) nested 轉(zhuǎn)化 value 
  16.     const value = properties[key
  17.     const result = nested(laterCode, name, `.${key}`, value) 
  18.  
  19.     code += result.code 
  20.     laterCode = result.laterCode 
  21.  
  22.     if (i < a.length - 1) { 
  23.       code += 'json += \',\'' 
  24.     } 
  25.   }) 
  26.  
  27.   code += ` 
  28.       json += '}' 
  29.       return json 
  30.     } 
  31.   ` 
  32.  
  33.   code += laterCode 
  34.  
  35.   return code 
  36.  
  37. function nested (laterCode, namekeyschema) { 
  38.   var code = '' 
  39.   var funcName 
  40.   // 判斷 value 的類(lèi)型,不同類(lèi)型進(jìn)行不同的處理 
  41.   const type = schema.type 
  42.   switch (type) { 
  43.     case 'null'
  44.       code += ` 
  45.       json += $Null() 
  46.       ` 
  47.       break 
  48.     case 'string'
  49.       code += ` 
  50.       json += $String(obj${key}) 
  51.       ` 
  52.       break 
  53.     case 'number'
  54.     case 'integer'
  55.       code += ` 
  56.       json += $Number(obj${key}) 
  57.       ` 
  58.       break 
  59.     case 'object'
  60.       // 如果 value 為一個(gè)對(duì)象,需要一個(gè)新的方法進(jìn)行構(gòu)造 
  61.       funcName = (name + key).replace(/[-.\[\]]/g, ''
  62.       laterCode = buildObject(schema, laterCode, funcName) 
  63.       code += ` 
  64.         json += ${funcName}(obj${key}) 
  65.       ` 
  66.       break 
  67.     case 'array'
  68.       funcName = (name + key).replace(/[-.\[\]]/g, ''
  69.       laterCode = buildArray(schema, laterCode, funcName) 
  70.       code += ` 
  71.         json += ${funcName}(obj${key}) 
  72.       ` 
  73.       break 
  74.     default
  75.       throw new Error(`${type} unsupported`) 
  76.   } 
  77.  
  78.   return { 
  79.     code, 
  80.     laterCode 
  81.   } 

其實(shí)就是對(duì) type 為 "object" 的 properties 進(jìn)行一次遍歷,然后針對(duì) value 不同的類(lèi)型進(jìn)行二次處理,如果碰到新的對(duì)象,會(huì)構(gòu)造一個(gè)新的函數(shù)進(jìn)行處理。

  1. // 如果包含子對(duì)象 
  2. const stringify = build({ 
  3.   type: 'object'
  4.   properties: { 
  5.     id: { type: 'number' }, 
  6.     info: { 
  7.       type: 'object'
  8.       properties: { 
  9.         age: { type: 'number' }, 
  10.         name: { type: 'string' }, 
  11.       } 
  12.     } 
  13.   } 
  14. }) 
  15.  
  16. console.log(stringify.toString()) 

  1. function $main (obj) { 
  2.   var json = '{' 
  3.  
  4.   json += '"id":' 
  5.  
  6.   json += $Number(obj.id) 
  7.   json += ',' 
  8.   json += '"info":' 
  9.  
  10.   json += $maininfo(obj.info) 
  11.  
  12.   json += '}' 
  13.   return json 
  14.  
  15. // 子對(duì)象會(huì)通過(guò)另一個(gè)函數(shù)處理 
  16. function $maininfo (obj) { 
  17.   var json = '{' 
  18.  
  19.   json += '"age":' 
  20.  
  21.   json += $Number(obj.age) 
  22.   json += ',' 
  23.   json += '"name":' 
  24.  
  25.   json += $String(obj.name
  26.  
  27.   json += '}' 
  28.   return json 

 總結(jié)

當(dāng)然,fastify 之所以號(hào)稱(chēng)自己快,內(nèi)部還有一些其他的優(yōu)化方法,例如,在路由庫(kù)的實(shí)現(xiàn)上使用了 Radix Tree 、對(duì)上下文對(duì)象可進(jìn)行復(fù)用(使用 middie 庫(kù))。本文只是介紹了其中的一種體現(xiàn)最重要明顯優(yōu)化思路,希望大家閱讀之后能有所收獲。

 

責(zé)任編輯:姜華 來(lái)源: 更了不起的前端
相關(guān)推薦

2020-12-14 08:55:00

Node.js服務(wù)性框架

2020-12-28 08:48:44

JS工具fastify

2025-07-21 01:00:00

UDP性能QPS

2019-07-09 14:50:15

Node.js前端工具

2013-11-01 09:34:56

Node.js技術(shù)

2015-03-10 10:59:18

Node.js開(kāi)發(fā)指南基礎(chǔ)介紹

2022-08-28 16:30:34

Node.jsDocker指令

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2020-10-12 08:06:28

HTTP 服務(wù)器證書(shū)

2022-08-22 07:26:32

Node.js微服務(wù)架構(gòu)

2020-05-29 15:33:28

Node.js框架JavaScript

2012-02-03 09:25:39

Node.js

2015-11-04 09:18:41

Node.js應(yīng)用性能

2015-12-14 10:39:14

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本综合视频| 欧美亚洲日本| 好看的日韩av电影| 精品亚洲一区二区三区| 中文字幕国产传媒| 成人在线播放| 91麻豆免费视频| 国产综合视频在线观看| 日本熟妇色xxxxx日本免费看| 亚洲婷婷丁香| 91精品国产日韩91久久久久久| 中文字幕无码精品亚洲资源网久久| 毛片在线能看| 顶级嫩模精品视频在线看| 国产91露脸中文字幕在线| 91九色丨porny丨极品女神| 欧美精品国产白浆久久久久| 欧美久久久久久蜜桃| 国产黄色一级网站| 性xxxfreexxxx性欧美| 久久久久一区二区三区四区| 国产成人精品自拍| 中文字幕精品一区二| 亚洲高清电影| 久久艳片www.17c.com| 91成人破解版| 国产精品久av福利在线观看| 在线不卡中文字幕| 天堂中文视频在线| 五月天av在线| 亚洲成人动漫精品| 伊人久久在线观看| 欧美私人网站| 欧美激情一区在线| 欧美美乳视频网站在线观看| 免费观看毛片网站| 国产伦精品一区二区三区视频青涩 | 好吊色一区二区| 久久66热偷产精品| 国产精品女人久久久久久| 日韩手机在线视频| 亚洲综合电影一区二区三区| 亚洲91精品在线| 久久久国产成人| 欧美视频二区| 欧美精品少妇videofree| 免费在线观看黄色小视频| 国产在线观看91一区二区三区| 精品亚洲一区二区三区在线播放| 99久久久无码国产精品性波多 | 国产自产v一区二区三区c| 国产精品久久久久免费a∨大胸| 亚洲不卡视频在线观看| 久久精品天堂| 日本一区二区不卡| 成人av网站在线播放| 久久经典综合| 国产精品高潮呻吟久久av野狼| 日本黄色一级视频| 日本中文字幕一区二区视频| 国产精品久久久久久久久久小说| 欧美激情一区二区三区免费观看 | 国产精品伦子伦免费视频| 波多野结衣不卡| 日本不卡视频在线观看| 国产欧美日韩91| 91成人一区二区三区| 国产在线视频不卡二| av一本久道久久波多野结衣| 蜜桃91麻豆精品一二三区 | 国产一区自拍视频| 无码国产精品高潮久久99| 2014亚洲片线观看视频免费| 日韩高清国产一区在线观看| 中国日本在线视频中文字幕| 亚洲欧美日韩电影| 高清欧美精品xxxxx| 国产精品迅雷| 欧美日本视频在线| 在线精品视频播放| 国产剧情在线观看一区| 久久久成人的性感天堂| 国产第一页在线播放| 日韩精品一区第一页| 91在线精品播放| 五月婷婷狠狠干| 国产精品色婷婷久久58| 成人av在线播放观看| 中国色在线日|韩| 666欧美在线视频| 中文字幕影片免费在线观看| 日本久久黄色| 久久男人资源视频| 中文字幕一区二区三区免费看 | 在线观看男女av免费网址| 香港成人在线视频| 黄色永久免费网站| 国产在线播放精品| 日韩一区av在线| 中文字幕一区二区三区手机版 | 色综合中文综合网| 亚洲综合伊人久久| 深夜福利久久| 久久久久久亚洲精品中文字幕 | 日本不卡1234视频| 欧美精品日韩精品| 国产男男chinese网站| 艳女tv在线观看国产一区| 7m第一福利500精品视频| 中文字幕在线天堂| av日韩在线网站| 久久免费视频2| 成人私拍视频| 日韩无一区二区| 国产精品久久免费观看| 亚洲人体偷拍| 2014国产精品| 欧美被日视频| 欧美曰成人黄网| 人妻在线日韩免费视频| 欧美永久精品| 成人免费看黄网站| 69久久夜色| 狠狠久久五月精品中文字幕| 特种兵之深入敌后| 婷婷六月综合| 国产精品影片在线观看| 精品亚洲成a人片在线观看| 亚洲福利电影网| 性生活在线视频| 国产精品国内免费一区二区三区| 国产成人精品一区| 欧洲亚洲精品视频| 欧美天天综合色影久久精品| 国产黑丝一区二区| 精品成人免费| 国产精品久久久久av福利动漫| av资源在线观看免费高清| 色综合欧美在线视频区| 一本色道久久综合亚洲精品图片 | 亚洲免费观看高清完整版在线 | 欧洲av无码放荡人妇网站| 成人三级av在线| 久久久久久久久久久久av| 午夜精品在线播放| 亚洲综合在线第一页| 人妻精品久久久久中文字幕69| 性欧美欧美巨大69| 91精品视频网站| 最新黄网在线观看| 日韩欧美在线综合网| 欧美国产精品一二三| 国产精品亚洲专一区二区三区| 好色先生视频污| 蜜桃精品视频| 久久久久成人网| 内射后入在线观看一区| 婷婷六月综合网| 欧美丰满少妇人妻精品| 久久综合亚州| 亚洲精品一区二区三区四区五区 | 久久毛片亚洲| 一本色道久久综合狠狠躁篇怎么玩| 天堂av免费在线观看| 国产精品久久久久久久久果冻传媒 | 一本一道久久a久久综合精品| 欧美成人三级| 久久99精品久久久久久琪琪| 国产综合视频在线| 日韩欧美中文在线| 欧美丰满美乳xxⅹ高潮www| 美国三级日本三级久久99| 在线观看免费黄色片| 凹凸av导航大全精品| 国产91精品久久久久久| 99青草视频在线播放视| 欧美一区二区福利在线| 日本中文字幕免费| 国产午夜精品一区二区三区视频| 狠狠躁狠狠躁视频专区| 亚洲国产精品久久久天堂| 国产精品成人观看视频免费| 成人免费直播| 久久6精品影院| 手机福利在线| 欧美男男青年gay1069videost| 久久久久久久久毛片| 91视频精品在这里| 91视频这里只有精品| 一区二区视频欧美| 亚洲成人蜜桃| 成人动态视频| 91精品国产综合久久香蕉| 欧美videosex性欧美黑吊| 国产视频精品在线| 国产情侣在线播放| 欧美日韩亚洲一区二| 99精品中文字幕| 92精品国产成人观看免费| 亚洲欧美日本一区二区三区| 亚洲一区二区成人| 中国一级黄色录像| 国产精品一区二区av日韩在线| 99视频网站| 久久亚洲人体| 欧美一级淫片播放口| aaa大片在线观看| 一区二区三区视频免费| 好吊视频一二三区| 欧美理论片在线| 国产伦精品一区二区三区视频我 | 久久国产黄色片| 亚洲综合色网站| 国产午夜精品久久久久久久久| 波多野洁衣一区| 在线观看中文av| 奇米影视一区二区三区小说| 欧美日韩黄色一级片| 亚洲成人免费| 亚洲一区二区精品在线观看| 亚洲丁香日韩| 狠狠爱一区二区三区| 影音先锋欧美激情| 国产综合久久久久| 国产精品亲子伦av一区二区三区| 欧美又大又硬又粗bbbbb| 丝袜美腿av在线| 久久久国产精品免费| h视频网站在线观看| 精品无人区太爽高潮在线播放| 成人免费一级视频| 日韩丝袜美女视频| 国产人妻精品一区二区三区| 欧美日韩成人高清| 中文字幕一区二区三区波野结 | 色综合久久综合网欧美综合网| 国产一级大片在线观看| 国产精品网站在线观看| 三级男人添奶爽爽爽视频| 成人动漫视频在线| 逼特逼视频在线观看| 成人av网址在线| 免费看毛片的网站| 成人妖精视频yjsp地址| 免费啪视频在线观看| 成人一级视频在线观看| 五月天丁香社区| 91偷拍与自偷拍精品| 捆绑裸体绳奴bdsm亚洲| 91丝袜国产在线播放| 午夜理伦三级做爰电影| 国产亚洲婷婷免费| 日韩女同一区二区三区| 国产精品嫩草影院com| 日韩av网站在线播放| 亚洲色图丝袜美腿| 久久久久成人网站| 亚洲.国产.中文慕字在线| 青青草av在线播放| 色综合天天综合在线视频| 亚洲中文字幕无码爆乳av| 欧美在线三级电影| 国产精品玖玖玖| 欧美成人在线直播| 少妇高潮久久久| 亚洲欧美一区二区三区四区| av在线收看| 九九久久国产精品| 成人性生交大片免费看在线播放| 性欧美在线看片a免费观看| 一区二区乱码| 国产在线拍偷自揄拍精品| 亚洲视频国产| 欧美理论一区二区| 婷婷亚洲图片| 国产中文字幕二区| 青青青伊人色综合久久| 久久aaaa片一区二区| 91日韩精品一区| 成人做爰69片免网站| 亚洲自拍欧美精品| 在线观看日本网站| 欧美一级日韩不卡播放免费| 人人妻人人澡人人爽久久av| 一级做a爰片久久毛片美女图片| 国内精品久久久久国产| 91精品国产乱码久久久久久蜜臀| 91在线亚洲| 国产chinese精品一区二区| 精品久久美女| 日本a在线天堂| 日韩精品一二三四| 少妇欧美激情一区二区三区| 久久久久久夜精品精品免费| 欧产日产国产v| 色哟哟国产精品| www.精品久久| 中文字幕一区二区三区电影| 草莓视频丝瓜在线观看丝瓜18| 国产精品日韩在线播放| 精品无人区一区二区| a级黄色片网站| 日韩精品视频网站| 亚洲午夜久久久久久久久| 国产精品久久久久久久久免费樱桃| 久久精品亚洲无码| 欧美人与禽zozo性伦| 日本福利在线观看| 欧美肥婆姓交大片| 欧美91在线|欧美| 牛人盗摄一区二区三区视频| 黄色工厂这里只有精品| 在线一区二区不卡| 国产日产欧产精品推荐色| 日韩三级一区二区三区| 日韩视频123| 精品自拍一区| 国产精品亚洲自拍| 国产一区二区观看| 国产主播在线看| 成人a区在线观看| 麻豆changesxxx国产| 欧美日韩国产成人在线91| 国产视频精品久久| 青草成人免费视频| 欧美理论电影在线精品| www.在线观看av| 国产精品91xxx| 国产天堂av在线| 欧美日韩免费一区二区三区视频 | 日本天堂一区| 成人一区二区免费视频| 国产激情视频一区二区在线观看| 婷婷国产成人精品视频| 在线看不卡av| 啊v在线视频| 国产精品国语对白| 欧美欧美黄在线二区| 日本熟妇人妻xxxxx| 91麻豆精东视频| 国产精品久久久久久久久久久久久久久久久| 精品国产3级a| а√天堂8资源在线| 精品1区2区| 免费欧美日韩| 亚洲精品色午夜无码专区日韩| 欧美日韩在线免费观看| 亚洲aaa在线观看| 欧美在线视频观看| 综合伊思人在钱三区| 欧美日韩在线免费播放| 国产日本亚洲高清| 中文字幕乱码一区二区| 日韩视频免费中文字幕| 成人乱码手机视频| japanese在线播放| 成人黄色国产精品网站大全在线免费观看| 欧美成人一二三区| 日韩高清av在线| 怡红院成人在线| 一本色道久久99精品综合| 狠狠色丁香久久婷婷综合_中| 欧美性猛交xxxxx少妇| 日韩欧美国产小视频| 91九色在线播放| 欧美日韩三区四区| 久久国产夜色精品鲁鲁99| 69av视频在线| 亚洲精品99久久久久中文字幕| 亚洲人体影院| 日韩第一页在线观看| 成人av网站在线观看| 波多野结衣日韩| 蜜臀久久99精品久久久久久宅男| av日韩在线播放| 国产免费成人在线| 日韩久久一区二区| 三级视频在线看| 国产精品一区二区久久久久| 亚洲国产不卡| 久久精品成人av| 欧美一区二区在线不卡| 日韩av影片| 一区二区不卡在线| 成人永久看片免费视频天堂| 久久久蜜桃一区二区| 欧美成人激情在线| 自拍偷拍欧美一区| 日本泡妞xxxx免费视频软件| 在线观看亚洲专区| 神马午夜伦理不卡| 日韩av一区二区三区美女毛片| 国产精品123| 丰满熟女人妻一区二区三| 欧美日韩国产成人高清视频| 狠狠操综合网| jjzzjjzz欧美69巨大| 欧美日韩国产高清一区二区 | 中文字幕免费精品| 欧美激情aaa|