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

Node.js 服務性能翻倍的秘密之一

開發 前端
用過 Node.js 開發過的同學肯定都上手過 koa,因為他簡單優雅的寫法,再加上豐富的社區生態,而且現存的許多 Node.js 框架都是基于 koa 進行二次封裝的。

[[357408]]

前言

用過 Node.js 開發過的同學肯定都上手過 koa,因為他簡單優雅的寫法,再加上豐富的社區生態,而且現存的許多 Node.js 框架都是基于 koa 進行二次封裝的。但是說到性能,就不得不提到一個知名框架:fastify ,聽名字就知道它的特性就是快,官方給出的Benchmarks甚至比 Node.js 原生的 http.Server 還要快。

 

Benchmarks

性能提升的關鍵

我們先看看 fastify 是如何啟動一個服務的。

  1. # 安裝 fastify 
  2. npm i -S fastify@3.9.1 
  1. // 創建服務實例 
  2. const fastify = require('fastify')() 
  3.  
  4. app.get('/', { 
  5.   schema: { 
  6.     response: { 
  7.       // key 為響應狀態碼 
  8.       '200': { 
  9.         type: 'object'
  10.         properties: { 
  11.           hello: { type: 'string' } 
  12.         } 
  13.       } 
  14.     } 
  15.   } 
  16. }, async () => { 
  17.   return { hello: 'world' } 
  18. }) 
  19.  
  20. // 啟動服務 
  21. ;(async () => { 
  22.   try { 
  23.     const port = 3001 // 監聽端口 
  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 對請求的響應體定義了一個 schema,fastify 除了可以定義響應體的 schema,還支持對如下數據定義 schema:

  1. body:當為 POST 或 PUT 方法時,校驗請求主體;
  2. query:校驗 url 的 查詢參數;
  3. params:校驗 url 參數;
  4. response:過濾并生成用于響應體的 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 的狀態都適用此 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 默認為 application/json 
  24.   return userInfo 
  25. }) 

讓 fastify 性能提升的的秘訣在于,其返回 application/json 類型數據的時候,并沒有使用原生的 JSON.stringify,而是自己內部重新實現了一套 JSON 序列化的方法,這個 schema 就是 JSON 序列化性能翻倍的關鍵。

如何對 JSON 序列化

在探索 fastify 如何對 JSON 數據序列化之前,我們先看看 JSON.stringify 需要經過多么繁瑣的步驟,這里我們參考 Douglas Crockford (JSON 格式的創建者)開源的 JSON-js 中實現的 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.         // 處理數組 
  23.         length = value.length; 
  24.         for (i = 0; i < length; i += 1) { 
  25.           // 每個元素都需要單獨處理 
  26.           partial[i] = str(i, value) || "null"
  27.         } 
  28.         // 將 partial 轉成 ”[...]“ 
  29.         v = partial.length === 0 
  30.           ? "[]" 
  31.           : "[" + partial.join(",") + "]"
  32.         return v; 
  33.       } else { 
  34.         // 處理對象 
  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 轉成 "{...}" 
  44.         v = partial.length === 0 
  45.           ? "{}" 
  46.          : "{" + partial.join(",") + "}"
  47.         return v; 
  48.       } 
  49.   } 

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

“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.   // 序列化對象 ... 
  17.  
  18. function buildArray (schema, code, name) { 
  19.   // 序列化數組 ... 
  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 對外暴露一個 build 方法,該方法接受一個 schema,返回一個函數($main),用于將 schema 對應的對象進行序列化,具體使用方式如下:

  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"

經過 build 構造后,返回的序列化方法如下:

  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 做支撐,序列化的邏輯瞬間變得無比簡單,最后得到的 JSON 字符串只保留需要的屬性,簡潔高效。我們回過頭再看看 buildObject 是如何生成 $main 內的代碼的:

  1. function buildObject (schema, code, name) { 
  2.   // 構造一個函數 
  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 需要加上雙引號 
  12.     code += ` 
  13.       json += '${$String(key)}:' 
  14.     ` 
  15.     // 通過 nested 轉化 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 的類型,不同類型進行不同的處理 
  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 為一個對象,需要一個新的方法進行構造 
  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.   } 

其實就是對 type 為 "object" 的 properties 進行一次遍歷,然后針對 value 不同的類型進行二次處理,如果碰到新的對象,會構造一個新的函數進行處理。

  1. // 如果包含子對象 
  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. // 子對象會通過另一個函數處理 
  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 

總結

當然,fastify 之所以號稱自己快,內部還有一些其他的優化方法,例如,在路由庫的實現上使用了 Radix Tree 、對上下文對象可進行復用(使用 middie 庫)。本文只是介紹了其中的一種體現最重要明顯優化思路,希望大家閱讀之后能有所收獲。

本文轉載自微信公眾號「 更了不起的前端」,可以通過以下二維碼關注。轉載本文請聯系 更了不起的前端公眾號。

 

責任編輯:武曉燕 來源: 更了不起的前端
相關推薦

2020-12-14 15:40:59

Nodefastifyjs

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技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2022-08-28 16:30:34

Node.jsDocker指令

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2020-10-12 08:06:28

HTTP 服務器證書

2022-08-22 07:26:32

Node.js微服務架構

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2015-11-04 09:18:41

Node.js應用性能

2015-12-14 10:39:14

2011-09-02 14:47:48

Node

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-09 14:23:13

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js
點贊
收藏

51CTO技術棧公眾號

91精品国产综合久久福利| 99久久免费国产| 久久手机免费视频| 制服丝袜在线第一页| 人在线成免费视频| 中文字幕第一区二区| 99国产在线视频| 狠狠人妻久久久久久综合| 欧美3p在线观看| 欧美大片一区二区三区| av免费中文字幕| 国产写真视频在线观看| 日韩毛片一区| 亚洲欧洲成人自拍| 国产一区免费| 中文字幕一区二区三区波野结| 欧美fxxxxxx另类| 亚洲欧洲一区二区三区久久| 极品粉嫩美女露脸啪啪| 国产调教在线| 亚洲欧美成aⅴ人在线观看| 国产一区二区三区高清| 中文字幕欧美在线观看| 在线日韩av| 久久婷婷国产麻豆91天堂| 短视频在线观看| 综合中文字幕| 欧美另类久久久品| 黄色a级片免费| 天堂亚洲精品| 亚洲欧洲韩国日本视频| 欧美亚洲爱爱另类综合| 亚洲AV无码精品自拍| 免费高清成人在线| 91干在线观看| 久久久久久久蜜桃| 亚洲一区二区三区| 中文字幕日韩免费视频| 91视频在线网站| 韩国精品福利一区二区三区| 91精品国产综合久久福利| 成年网站在线播放| 农村妇女精品一二区| wwwww在线观看| 国产精品久久久久77777丨| 欧美日韩一区二区三区| 久久精品国产sm调教网站演员| av在线免费网址| 亚洲图片你懂的| 致1999电视剧免费观看策驰影院| 成人影视在线播放| 国产亚洲精品aa午夜观看| 精品视频一区二区| 天天射,天天干| 99久久久无码国产精品| 蜜桃导航-精品导航| 五月天福利视频| 91丨九色丨国产丨porny| 国新精品乱码一区二区三区18| h片在线免费看| 国产成人在线免费| 99在线免费观看视频| 国产高清第一页| 粉嫩av一区二区三区粉嫩| 99影视tv| 天堂网av在线播放| 久久女同互慰一区二区三区| 免费看污久久久| 国产视频在线看| 亚洲国产成人自拍| 一区二区三区免费看| 欧美18hd| 亚洲综合丁香婷婷六月香| 天堂а√在线中文在线| а√在线天堂官网| 色哟哟一区二区| 在线观看av网页| 国产日本亚洲| 亚洲国产成人av在线| 日韩一级视频在线观看| 精品午夜久久| 久久国产色av| 日韩精品在线免费视频| 日韩成人一区二区三区在线观看| 国产在线一区二区三区| www.色亚洲| 久久亚洲一区二区三区明星换脸| 日韩精品一区二区三区色偷偷| 91啦中文在线| 亚洲在线观看免费视频| 日日碰狠狠添天天爽超碰97| 国产激情欧美| 精品久久久久一区| 在线免费观看视频| 欧美电影《睫毛膏》| 久久久久国产精品免费网站| 不卡av电影在线| 国内精品伊人久久久久av一坑| 国产精品制服诱惑| 国产h在线观看| 亚洲一二三区在线观看| 欧美精品成人网| 一区二区日韩| 色一区av在线| 亚洲精品国产精品乱码| 国产一区在线不卡| 久久99国产精品| 曰本三级在线| 在线观看欧美黄色| 久久久久成人精品无码中文字幕| 日韩精品永久网址| 国产91精品高潮白浆喷水| 一本色道久久综合熟妇| 91在线视频免费观看| 最新不卡av| 在线成人视屏 | 99蜜月精品久久91| 日韩美女视频在线| 91视频最新网址| 先锋影音久久久| 岛国视频一区| а√资源新版在线天堂| 欧美吞精做爰啪啪高潮| 人妻无码一区二区三区| 国精品一区二区| 91欧美精品午夜性色福利在线| 男男激情在线| 精品久久久中文| 亚洲美女精品视频| 亚洲中无吗在线| 国产免费一区二区三区香蕉精| 色视频在线观看免费| 亚洲成人自拍网| 国产乱国产乱老熟300部视频| 亚洲中无吗在线| 成人免费高清完整版在线观看| 国自产拍在线网站网址视频| 色综合中文综合网| 国产熟女高潮一区二区三区| 亚洲欧洲一级| 超碰在线观看97| av免费网站在线| 日韩一级欧美一级| 久久久久亚洲av无码专区体验| 久久精品国产精品亚洲红杏 | 精品成人一区二区三区免费视频| 无吗不卡中文字幕| 在线观看国产三级| 一本一本久久| 精品视频一区二区| 国产精品专区免费| 亚洲欧美日韩成人| 草莓视频18免费观看| 久久久不卡网国产精品一区| 红桃av在线播放| 精品高清在线| 国产精品亚洲网站| 日本在线免费播放| 这里只有精品免费| 久久久精品国产sm调教网站| 大尺度一区二区| 国产午夜福利100集发布| 精品自拍偷拍| 日本三级韩国三级久久| www.国产精品.com| 在线播放国产精品二区一二区四区 | www.夜夜爱| 精品在线网站观看| 国产成人av在线播放| 91欧美在线视频| 日韩限制级电影在线观看| 国产精品九九九九九九| 成人精品国产一区二区4080| 缅甸午夜性猛交xxxx| 最新亚洲精品| 成人免费福利在线| av蜜臀在线| 亚洲无限av看| 国产乱子伦精品无码码专区| 亚洲一区二区欧美日韩| 丰满圆润老女人hd| 狠狠色丁香婷综合久久| 日本精品久久久久久久久久| 国产99久久久国产精品成人免费| 国产精品自拍偷拍视频| 金瓶狂野欧美性猛交xxxx| 亚洲美腿欧美激情另类| 国产色视频在线| 疯狂做受xxxx高潮欧美日本| 林心如三级全黄裸体| 高清日韩电视剧大全免费| 成人毛片视频网站| 成人久久一区| 国产一区免费观看| 久久91超碰青草在哪里看| 欧美日本精品在线| 久久精品蜜桃| 精品日韩av一区二区| 波多野结衣在线观看视频| 亚洲精品自拍动漫在线| 在线免费观看成年人视频| 国产精品原创巨作av| www.欧美日本| av成人黄色| 强伦女教师2:伦理在线观看| 日韩在线麻豆| 不卡视频一区二区| 成人国产精品一区二区免费麻豆| 欧美激情欧美激情在线五月| 岛国视频免费在线观看| 精品福利av导航| 国产乱码精品一区二三区蜜臂| 一本色道久久加勒比精品 | 国产精品综合不卡av| 77thz桃花论族在线观看| 久久精品99久久久久久久久| 四虎精品在永久在线观看 | 亚洲av综合一区二区| 国产福利91精品| 亚洲天堂2018av| 日日夜夜精品免费视频| 久久综合色视频| 伊人久久亚洲影院| 超碰10000| 99久久激情| 亚洲精品久久久久久一区二区| 日韩精品免费一区二区夜夜嗨| 99九九视频| 国产一区二区三区精品在线观看| 国产狼人综合免费视频| gogo亚洲高清大胆美女人体| 欧美一区三区三区高中清蜜桃| 黄色小说在线播放| 欧美国产在线视频| 50度灰在线| 不卡伊人av在线播放| 免费高清完整在线观看| 中文字幕亚洲无线码在线一区| 国产三级电影在线观看| 亚洲热线99精品视频| 色视频免费在线观看| 亚洲精品视频在线观看视频| 天天操天天干天天爽| 亚洲精品国产综合区久久久久久久| 刘亦菲久久免费一区二区| 精品福利一二区| 天堂在线资源库| 亚洲精品国精品久久99热一| 亚洲av片在线观看| 日韩精品中文字幕有码专区| 青青青免费视频在线2| 日韩精品亚洲精品| 国产性生活一级片| 久久的色偷偷| 成人精品视频久久久久| 2019中文亚洲字幕| 51国偷自产一区二区三区的来源 | 成人动漫一区二区在线| 天天躁日日躁狠狠躁免费麻豆| 不卡高清视频专区| 久久久亚洲av波多野结衣| 久久免费国产精品| 蜜臀久久99精品久久久久久| 中文字幕 久热精品 视频在线| 99热6这里只有精品| 亚洲乱码国产乱码精品精98午夜| 久久这里只有精品国产| 黄色成人av网| 中文字幕你懂的| 日韩午夜电影在线观看| 人人妻人人澡人人爽人人欧美一区 | 欧美成人乱码一二三四区免费| 国产一区美女在线| 亚洲图片欧美另类| 本田岬高潮一区二区三区| 欧美一区二区三区成人精品| 国产精品久久久久久久久久久免费看| 日韩a级片在线观看 | 最新中文字幕第一页| 91麻豆精品国产91久久久使用方法 | 欧美激情护士| 国产精品一二三在线| 亚洲综合色婷婷在线观看| 欧美日韩免费精品| 久久久久美女| 欧美a v在线播放| 久久丁香综合五月国产三级网站| 日本黄色三级网站| 91网上在线视频| 欧美h片在线观看| 精品欧美一区二区三区| 在线免费看av片| 亚洲国产女人aaa毛片在线| av网站大全在线观看| 久久噜噜噜精品国产亚洲综合| 日韩精品三区| 国产九区一区在线| 99精品视频在线观看播放| 国产h视频在线播放| 国产在线播放一区| 九色porny自拍视频| 一区二区理论电影在线观看| 久久永久免费视频| 亚洲大胆人体av| 欧美jizzhd69巨大| 国产999精品| 精品国产乱子伦一区二区| 久久精品国产99国产精品澳门 | 久久精品小视频| 最近高清中文在线字幕在线观看1| 成人做爰www免费看视频网站| 国产精品视频一区二区三区四蜜臂| 中文字幕精品在线播放 | 男人女人拔萝卜视频| 国产亚洲精品7777| 国产成人精品亚洲男人的天堂 | 日本黄色不卡视频| 日韩在线欧美在线国产在线| 成人性教育av免费网址| 国产精品二区在线观看| 亚洲午夜精品一区二区国产| 午夜免费看视频| 国产亚洲欧美在线| 看片网址国产福利av中文字幕| 日韩视频免费观看高清完整版 | 日本精品久久电影| 91国内精品| 日本一区二区三区四区五区六区| 日韩高清在线一区| 91精彩刺激对白露脸偷拍| 婷婷夜色潮精品综合在线| 丰满人妻一区二区三区无码av| 伦伦影院午夜日韩欧美限制| 日日狠狠久久| 亚洲欧洲日韩精品| 日本不卡视频在线| 影音先锋制服丝袜| 欧美综合欧美视频| 国产精品视频二区三区| 国产99在线|中文| 久久超碰99| 欧在线一二三四区| 久久久不卡影院| 最近国语视频在线观看免费播放| 亚洲性av在线| 91成人在线| 吴梦梦av在线| 国产精品一区专区| 国产1区2区3区4区| 精品久久久久久久久久久久久久久久久 | 国产剧情久久久| 久久亚洲精品成人| 日韩一区二区三区精品视频第3页| 亚洲啊啊啊啊啊| 成人app下载| 日本高清不卡码| 一本色道久久综合亚洲精品小说 | 日韩高清成人| 日韩精品最新在线观看| 另类人妖一区二区av| 在线观看亚洲网站| 日韩午夜中文字幕| 草草影院在线| 欧美日本韩国国产| 免费成人你懂的| 欧美一区免费观看| 亚洲精品在线一区二区| 少妇视频一区| 亚洲高清精品中出| 国产一区三区三区| 日韩免费av片| 亚洲人成啪啪网站| 亚洲欧美在线综合| 国产美女永久无遮挡| 91视频www| 97超视频在线观看| 久久久久久久网站| 亚洲理论电影| www.色就是色.com| 午夜久久久影院| 成人免费黄色网页| 91成人免费看| 裸体素人女欧美日韩| 三级在线观看免费大全| 亚洲精品国产成人| 日韩黄色三级| 日韩精品―中文字幕| 综合欧美亚洲日本| 头脑特工队2在线播放| 国产在线视频欧美| 国产精品免费看| 国产又粗又硬又长又爽| 亚洲精品按摩视频| 色8久久久久| 男人和女人啪啪网站| 国产精品美女久久福利网站| 天天综合永久入口| 91久久久亚洲精品| 可以看av的网站久久看| 裸体武打性艳史|