久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Node.js+Scala協(xié)同構(gòu)建推薦系統(tǒng)展示層實(shí)戰(zhàn)

Node.js+Scala協(xié)同構(gòu)建推薦系統(tǒng)展示層實(shí)戰(zhàn) 1. 項(xiàng)目概述為什么推薦系統(tǒng)的結(jié)果必須“看得見(jiàn)”“十二使用Node.js在網(wǎng)頁(yè)中展現(xiàn)結(jié)果——從0開(kāi)始大數(shù)據(jù)開(kāi)發(fā)實(shí)戰(zhàn)電影推薦系統(tǒng)scala版”這個(gè)標(biāo)題里藏著一個(gè)被很多初學(xué)者忽略的關(guān)鍵矛盾算法跑得再快、模型調(diào)得再準(zhǔn)如果用戶(hù)看不到結(jié)果整個(gè)系統(tǒng)就等于沒(méi)存在過(guò)。我?guī)н^(guò)不少剛從學(xué)校出來(lái)的同學(xué)做推薦系統(tǒng)實(shí)訓(xùn)他們花三周時(shí)間把ALS協(xié)同過(guò)濾模型用Scala寫(xiě)完、在Spark集群上跑通、RMSE降到0.85以下興沖沖來(lái)演示結(jié)果打開(kāi)瀏覽器——一片空白的HTML頁(yè)面上面只有一行字“推薦結(jié)果加載中…”。后臺(tái)日志顯示接口返回了200但前端根本沒(méi)解析JSON。那一刻他們才真正理解標(biāo)題里那個(gè)不起眼的“十二”有多重它不是技術(shù)棧的簡(jiǎn)單拼接而是數(shù)據(jù)價(jià)值閉環(huán)的最后一道閘門(mén)。這個(gè)環(huán)節(jié)解決的不是“能不能算”而是“能不能用”。它把離線批處理的冷數(shù)據(jù)比如每晚2點(diǎn)生成的Top-10推薦列表通過(guò)Node.js服務(wù)實(shí)時(shí)“翻譯”成瀏覽器能懂的語(yǔ)言把Scala代碼里抽象的Vector和Rating對(duì)象變成用戶(hù)手指一劃就能看到的電影海報(bào)、評(píng)分條、相似度標(biāo)簽。它不參與模型訓(xùn)練卻決定了業(yè)務(wù)方是否愿意為你的算法買(mǎi)單——市場(chǎng)部要拿推薦效果做A/B測(cè)試產(chǎn)品要根據(jù)點(diǎn)擊熱力圖優(yōu)化首頁(yè)布局運(yùn)營(yíng)要基于用戶(hù)實(shí)時(shí)偏好調(diào)整推送策略所有這些動(dòng)作的前提都是“結(jié)果可展示、可交互、可驗(yàn)證”。關(guān)鍵詞“Node.js”在這里不是為了趕時(shí)髦而是由三個(gè)硬性需求決定的第一它原生支持異步I/O能輕松應(yīng)對(duì)高并發(fā)的推薦請(qǐng)求比如某部新上映電影突然爆火瞬間涌入5000用戶(hù)查“類(lèi)似推薦”第二它的生態(tài)有成熟的模板引擎如EJS、Pug和靜態(tài)資源服務(wù)方案讓后端開(kāi)發(fā)者不用學(xué)Vue/React也能快速搭出可用界面第三它與Scala后端的通信成本極低——我們不需要重寫(xiě)整個(gè)推薦邏輯只需在Scala服務(wù)外加一層輕量API網(wǎng)關(guān)用HTTPJSON橋接兩個(gè)世界。這正是標(biāo)題強(qiáng)調(diào)“scala版”的深意它不是要你放棄Scala去學(xué)JavaScript全棧而是教你如何讓已有的大數(shù)據(jù)能力安全、可控、低成本地走向終端。適合誰(shuí)來(lái)讀如果你已經(jīng)用Scala寫(xiě)過(guò)Spark MLlib的ALS模型能跑通MovieLens數(shù)據(jù)集但卡在“怎么讓老板看到效果”這一步或者你是前端開(kāi)發(fā)者接到任務(wù)要對(duì)接一個(gè)“推薦接口”卻對(duì)背后的數(shù)據(jù)結(jié)構(gòu)、更新頻率、容錯(cuò)機(jī)制一無(wú)所知又或者你是運(yùn)維同學(xué)被要求部署這個(gè)“Node.js服務(wù)”但不確定它和Spark集群的依賴(lài)關(guān)系、資源配比、監(jiān)控指標(biāo)——那么這篇就是為你寫(xiě)的。它不講Node.js基礎(chǔ)語(yǔ)法也不重復(fù)Scala推薦算法原理只聚焦于那個(gè)最實(shí)際的問(wèn)題當(dāng)Scala程序輸出了一個(gè)包含用戶(hù)ID、電影ID、預(yù)測(cè)評(píng)分的List[Recommendation]我該怎么把它變成一個(gè)能發(fā)朋友圈截圖的網(wǎng)頁(yè)2. 整體架構(gòu)設(shè)計(jì)為什么選Express而非Spring Boot或Nginx2.1 核心思路分層解耦各司其職整個(gè)展示層的設(shè)計(jì)核心就八個(gè)字“Scala管算Node.js管展”。我們絕不把推薦邏輯搬到Node.js里重寫(xiě)那會(huì)失去Spark的分布式計(jì)算優(yōu)勢(shì)也絕不讓Scala直接渲染HTML那會(huì)讓業(yè)務(wù)代碼和UI強(qiáng)耦合一次前端改版就得重啟整個(gè)Spark作業(yè)。正確的做法是建立清晰的三層結(jié)構(gòu)數(shù)據(jù)層Scala側(cè)運(yùn)行在YARN或Standalone集群上的Spark應(yīng)用每天凌晨定時(shí)執(zhí)行ALS訓(xùn)練將結(jié)果寫(xiě)入HDFS或HBase。關(guān)鍵輸出是一個(gè)結(jié)構(gòu)化文件比如hdfs://path/to/recommends/user_based/20240520/目錄下每個(gè)文件按用戶(hù)ID命名uid_12345.json內(nèi)容為{ user_id: 12345, timestamp: 1716220800000, recommendations: [ {movie_id: 884, predicted_rating: 4.72, similarity_score: 0.93}, {movie_id: 1029, predicted_rating: 4.65, similarity_score: 0.87} ] }這個(gè)格式是刻意設(shè)計(jì)的字段名全部小寫(xiě)下劃線符合JSON通用規(guī)范不包含任何Scala特有的類(lèi)信息如$outer、serialVersionUID確保Node.js能無(wú)痛解析。服務(wù)層Node.js側(cè)獨(dú)立部署的Express應(yīng)用只做三件事① 定時(shí)從HDFS/HBase拉取最新推薦數(shù)據(jù)或監(jiān)聽(tīng)Kafka消息觸發(fā)更新② 提供RESTful API如GET /api/v1/recommend?user_id12345③ 渲染前端頁(yè)面GET /recommend?user_id12345。它不碰模型參數(shù)不參與特征工程純粹是“數(shù)據(jù)搬運(yùn)工翻譯官”。表現(xiàn)層瀏覽器側(cè)純靜態(tài)HTML/CSS/JS通過(guò)AJAX調(diào)用Node.js API獲取JSON用原生JavaScript或輕量庫(kù)如Swiper渲染卡片流。所有樣式、動(dòng)畫(huà)、交互邏輯都放在這里和后端完全隔離。這種設(shè)計(jì)的好處是故障域隔離如果Node.js服務(wù)掛了Scala推薦作業(yè)照常運(yùn)行數(shù)據(jù)不會(huì)丟失如果HDFS暫時(shí)不可用Node.js可以降級(jí)返回緩存結(jié)果比如內(nèi)存中保留最近24小時(shí)的推薦快照如果前端頁(yè)面需要增加“按類(lèi)型篩選”功能只需改前端代碼后端API接口完全不用動(dòng)。2.2 為什么是Express而不是其他方案面對(duì)“用什么框架寫(xiě)Node.js服務(wù)”這個(gè)問(wèn)題我見(jiàn)過(guò)太多人掉坑里。有人想用Spring Boot寫(xiě)Java版Web服務(wù)理由是“團(tuán)隊(duì)更熟Java”——這看似合理實(shí)則埋雷。Spring Boot啟動(dòng)慢平均3秒以上而推薦接口的P95延遲要求通常在200ms內(nèi)它依賴(lài)JVM堆內(nèi)存管理而推薦結(jié)果數(shù)據(jù)量大單用戶(hù)可能返回50電影容易觸發(fā)Full GC導(dǎo)致請(qǐng)求超時(shí)。更重要的是它和Scala生態(tài)的集成成本高你需要額外維護(hù)一個(gè)Java客戶(hù)端去讀HDFS或者把Scala服務(wù)包裝成Thrift接口徒增復(fù)雜度。也有人提議用Nginx直接代理到Scala服務(wù)——這更危險(xiǎn)。Nginx是反向代理不是應(yīng)用服務(wù)器它無(wú)法處理“用戶(hù)未登錄時(shí)跳轉(zhuǎn)登錄頁(yè)”、“請(qǐng)求參數(shù)校驗(yàn)”、“結(jié)果緩存策略”等業(yè)務(wù)邏輯。一旦Scala服務(wù)返回500錯(cuò)誤Nginx只能拋給用戶(hù)一個(gè)丑陋的502頁(yè)面沒(méi)有任何友好的錯(cuò)誤提示或降級(jí)方案。Express成為最終選擇源于它在四個(gè)維度的精準(zhǔn)匹配啟動(dòng)速度一個(gè)空Express應(yīng)用啟動(dòng)時(shí)間50ms冷啟動(dòng)后首請(qǐng)求延遲穩(wěn)定在80ms內(nèi)實(shí)測(cè)數(shù)據(jù)AWS t3.micro實(shí)例Node.js v18.17。這意味著你可以隨時(shí)滾動(dòng)更新服務(wù)用戶(hù)幾乎無(wú)感。中間件生態(tài)Express的中間件機(jī)制app.use()天然適合推薦場(chǎng)景的鏈?zhǔn)教幚?。比如rateLimit()限制單IP每分鐘最多10次推薦請(qǐng)求防刷cacheControl({ maxAge: 300 })給推薦結(jié)果加5分鐘緩存頭減輕后端壓力errorHandler()統(tǒng)一捕獲HDFS讀取失敗、JSON解析異常等錯(cuò)誤返回結(jié)構(gòu)化錯(cuò)誤碼如{code:503,msg:推薦服務(wù)暫不可用}前端可據(jù)此展示“稍后再試”按鈕。與Scala的零摩擦集成Scala服務(wù)只需暴露一個(gè)簡(jiǎn)單的HTTP接口如GET /recommends/{user_id}返回標(biāo)準(zhǔn)JSON。Express用axios庫(kù)調(diào)用它一行代碼搞定const response await axios.get(http://scala-service:8080/recommends/${userId});不需要任何序列化/反序列化配置沒(méi)有類(lèi)型系統(tǒng)沖突。輕量級(jí)部署Express應(yīng)用打包后只有幾十MB含node_modules而Spring Boot Jar包動(dòng)輒200MB。在Docker環(huán)境下Express鏡像構(gòu)建速度快、體積小CI/CD流水線更穩(wěn)定。提示不要被“Express已過(guò)時(shí)”的言論誤導(dǎo)。它不是框架而是Node.js的HTTP服務(wù)器封裝。就像Linux內(nèi)核不會(huì)過(guò)時(shí)一樣Express的核心價(jià)值在于穩(wěn)定、可靠、可預(yù)測(cè)。我們用它不是為了炫技而是因?yàn)樗馨选鞍袹SON變成網(wǎng)頁(yè)”這件事做得足夠簡(jiǎn)單、足夠快、足夠穩(wěn)。3. 核心細(xì)節(jié)解析從HDFS讀取到頁(yè)面渲染的完整鏈路3.1 數(shù)據(jù)同步如何讓Node.js安全、高效地訪問(wèn)HDFSNode.js本身不支持HDFS協(xié)議直接調(diào)用Hadoop Java API不現(xiàn)實(shí)需JVM橋接性能損耗大。我們的方案是在Scala側(cè)啟動(dòng)一個(gè)輕量HTTP服務(wù)作為HDFS的“只讀代理”。這比讓Node.js直連HDFS更安全、更可控。具體實(shí)現(xiàn)分三步第一步Scala側(cè)構(gòu)建HDFS代理服務(wù)用Akka HTTP比Play Framework更輕量寫(xiě)一個(gè)微型服務(wù)監(jiān)聽(tīng)/hdfs/file端點(diǎn)// Scala代碼片段 val route: Route pathPrefix(hdfs) { path(file) { get { parameter(path.as[String]) { hdfsPath // 1. 校驗(yàn)路徑白名單防止目錄遍歷攻擊 val safePath if (hdfsPath.startsWith(/recommends/)) hdfsPath else /invalid // 2. 從HDFS讀取文件使用Hadoop FileSystem API val fs FileSystem.get(new Configuration()) val stream fs.open(new Path(safePath)) // 3. 直接流式返回不加載全量到內(nèi)存 complete(HttpEntity.Chunked.fromData(ContentTypes.application/json, stream)) } } } }這個(gè)服務(wù)只做一件事根據(jù)path參數(shù)從HDFS讀取指定文件并以Chunked方式返回。關(guān)鍵點(diǎn)在于路徑白名單校驗(yàn)強(qiáng)制path必須以/recommends/開(kāi)頭杜絕../../../etc/passwd這類(lèi)攻擊流式傳輸不把整個(gè)JSON文件讀進(jìn)內(nèi)存再返回而是邊讀HDFS邊寫(xiě)HTTP響應(yīng)內(nèi)存占用恒定在幾KB無(wú)狀態(tài)設(shè)計(jì)不緩存任何數(shù)據(jù)每次請(qǐng)求都是新鮮讀取保證數(shù)據(jù)一致性。第二步Node.js側(cè)實(shí)現(xiàn)智能緩存策略Express不直接調(diào)用HDFS代理而是加一層內(nèi)存緩存使用node-cache庫(kù)const NodeCache require(node-cache); const cache new NodeCache({ stdTTL: 300, checkperiod: 600 }); // TTL 5分鐘每10分鐘清理過(guò)期項(xiàng) app.get(/api/v1/recommend, async (req, res) { const userId req.query.user_id; const cacheKey rec_${userId}; // 1. 先查緩存 let data cache.get(cacheKey); if (data) { return res.json(data); } // 2. 緩存未命中調(diào)用Scala代理 try { const response await axios.get(http://scala-hdfs-proxy:8080/hdfs/file?path/recommends/user_based/${userId}.json); data response.data; // 3. 寫(xiě)入緩存注意只緩存成功結(jié)果 cache.set(cacheKey, data, 300); res.json(data); } catch (error) { // 4. 代理失敗時(shí)嘗試降級(jí)到本地磁盤(pán)緩存部署時(shí)預(yù)置的兜底文件 if (fs.existsSync(/opt/app/fallback/${userId}.json)) { data JSON.parse(fs.readFileSync(/opt/app/fallback/${userId}.json, utf8)); res.json(data); } else { res.status(503).json({ code: 503, msg: 推薦服務(wù)暫不可用 }); } } });這個(gè)緩存策略解決了三個(gè)痛點(diǎn)降低HDFS壓力同一用戶(hù)5分鐘內(nèi)重復(fù)請(qǐng)求全部走內(nèi)存緩存HDFS代理QPS下降90%提升響應(yīng)速度內(nèi)存讀取延遲1ms遠(yuǎn)低于網(wǎng)絡(luò)調(diào)用的50ms保障服務(wù)可用性當(dāng)HDFS代理宕機(jī)或網(wǎng)絡(luò)抖動(dòng)時(shí)自動(dòng)切換到本地磁盤(pán)的“昨日推薦”作為兜底避免頁(yè)面空白。注意本地磁盤(pán)兜底文件不是靜態(tài)的我們?cè)赟cala推薦作業(yè)成功完成后會(huì)自動(dòng)執(zhí)行一個(gè)腳本把最新生成的推薦結(jié)果復(fù)制一份到Node.js服務(wù)器的/opt/app/fallback/目錄。這樣即使整個(gè)HDFS集群維護(hù)服務(wù)仍能提供“過(guò)期但可用”的推薦。3.2 接口設(shè)計(jì)RESTful不是教條而是用戶(hù)體驗(yàn)的起點(diǎn)很多人把RESTful當(dāng)成一種技術(shù)規(guī)范其實(shí)它是面向用戶(hù)的設(shè)計(jì)哲學(xué)。GET /api/v1/recommend?user_id12345這個(gè)接口表面看只是返回JSON但它的每一個(gè)參數(shù)、每一個(gè)狀態(tài)碼都在回答用戶(hù)的一個(gè)潛在問(wèn)題。參數(shù)設(shè)計(jì)原則user_id必填這是唯一標(biāo)識(shí)但必須做類(lèi)型校驗(yàn)。我們用joi庫(kù)驗(yàn)證const schema Joi.object({ user_id: Joi.number().integer().min(1).max(99999999).required() });為什么限制最大值因?yàn)镸ovieLens數(shù)據(jù)集用戶(hù)ID最大是71828超出范圍的ID一定是輸入錯(cuò)誤或爬蟲(chóng)試探直接拒絕比返回空數(shù)組更安全。limit選填默認(rèn)10控制返回電影數(shù)量。這里有個(gè)隱藏需求移動(dòng)端和PC端需要不同數(shù)量。PC端首頁(yè)展示20部移動(dòng)端因屏幕小只展示8部。所以接口必須支持動(dòng)態(tài)調(diào)整而不是寫(xiě)死。format選填默認(rèn)json支持formathtml直接返回渲染好的HTML片段用于AJAX局部刷新避免前端重復(fù)解析JSON。狀態(tài)碼語(yǔ)義化200 OK正常返回推薦列表400 Bad Requestuser_id格式錯(cuò)誤如傳了字符串a(chǎn)bc404 Not Found用戶(hù)ID存在但該用戶(hù)無(wú)推薦結(jié)果比如新注冊(cè)用戶(hù)還沒(méi)行為數(shù)據(jù)503 Service Unavailable后端服務(wù)不可用HDFS代理宕機(jī)、緩存失效且無(wú)兜底。關(guān)鍵在于每個(gè)非200狀態(tài)碼都必須附帶code和msg字段前端可據(jù)此做精準(zhǔn)處理{ code: 404, msg: 該用戶(hù)暫無(wú)推薦試試看熱門(mén)電影吧, suggestion: hot_movies }這樣前端不用猜“404是用戶(hù)不存在還是推薦沒(méi)生成”直接按suggestion字段跳轉(zhuǎn)到熱門(mén)電影頁(yè)。3.3 頁(yè)面渲染用EJS模板引擎實(shí)現(xiàn)“零JavaScript”推薦頁(yè)很多前端開(kāi)發(fā)者第一反應(yīng)是“用React/Vue寫(xiě)個(gè)SPA”但這對(duì)推薦展示是過(guò)度設(shè)計(jì)。一個(gè)推薦頁(yè)的核心訴求是快、穩(wěn)、省流量。用戶(hù)打開(kāi)頁(yè)面0.3秒內(nèi)看到電影海報(bào)和標(biāo)題比任何酷炫動(dòng)畫(huà)都重要。我們選擇EJSEmbedded JavaScript templates作為模板引擎原因很實(shí)在它在服務(wù)端渲染SSR首屏HTML直接包含所有推薦數(shù)據(jù)無(wú)需等待JS下載、解析、執(zhí)行模板語(yǔ)法簡(jiǎn)單后端開(kāi)發(fā)者能直接修改比如把“預(yù)測(cè)評(píng)分”改成“相似度”支持局部刷新同一個(gè)EJS模板既可渲染完整頁(yè)面res.render(recommend, data)也可只渲染推薦列表區(qū)塊res.render(recommend_list, data)供AJAX調(diào)用。一個(gè)典型的recommend.ejs模板長(zhǎng)這樣!DOCTYPE html html head title為您推薦的電影/title link relstylesheet href/css/main.css /head body header h1Hi, 用戶(hù)% user_id %/h1 /header main section classrecommend-list % if (recommendations recommendations.length 0) { % h2根據(jù)您的觀影歷史我們推薦/h2 div classmovie-grid % recommendations.forEach(function(movie) { % article classmovie-card img src% movie.poster_url || /images/default-poster.jpg % alt% movie.title % loadinglazy h3% movie.title %/h3 div classrating span classscore% movie.predicted_rating.toFixed(1) %/span span classlabel預(yù)測(cè)評(píng)分/span /div p classsimilarity與您相似度% (movie.similarity_score * 100).toFixed(0) %%/p /article % }); % /div % } else { % div classno-recommend p暫無(wú)個(gè)性化推薦/p a href/hot-movies看看熱門(mén)電影 rarr;/a /div % } % /section /main script src/js/main.js/script /body /html這個(gè)模板的關(guān)鍵細(xì)節(jié)loadinglazy圖片懶加載首屏只加載可視區(qū)圖片減少初始請(qǐng)求量poster_url兜底如果Scala數(shù)據(jù)里沒(méi)提供海報(bào)URL用默認(rèn)圖避免404錯(cuò)誤打斷渲染toFixed(1)格式化把4.7231顯示為4.7符合用戶(hù)閱讀習(xí)慣% %邏輯分離所有業(yè)務(wù)邏輯如空數(shù)據(jù)判斷都在服務(wù)端完成前端只負(fù)責(zé)展示降低JS執(zhí)行負(fù)擔(dān)。實(shí)操心得上線前務(wù)必用Chrome DevTools的“Network”面板檢查首屏加載。我們?cè)l(fā)現(xiàn)一個(gè)bug模板里寫(xiě)了img src% movie.poster_url %但某些電影poster_url為空字符串導(dǎo)致瀏覽器發(fā)起GET /請(qǐng)求意外觸發(fā)首頁(yè)重載。修復(fù)方案很簡(jiǎn)單src% movie.poster_url || /images/placeholder.jpg %。這種細(xì)節(jié)只有真正在生產(chǎn)環(huán)境跑過(guò)流量的人才會(huì)踩到。4. 實(shí)操過(guò)程從零搭建可運(yùn)行的Node.js推薦服務(wù)4.1 環(huán)境準(zhǔn)備與依賴(lài)安裝在開(kāi)始編碼前先確認(rèn)你的運(yùn)行環(huán)境。我們推薦使用Node.js v18.17 LTS長(zhǎng)期支持版因?yàn)樗鼘?duì)ES2022語(yǔ)法支持完善且V8引擎優(yōu)化成熟。絕對(duì)不要用v20的實(shí)驗(yàn)性版本某些新特性如fetch全局API在Docker Alpine鏡像中默認(rèn)不啟用會(huì)導(dǎo)致線上環(huán)境報(bào)錯(cuò)。創(chuàng)建項(xiàng)目目錄并初始化mkdir movie-recommender-web cd movie-recommender-web npm init -y安裝核心依賴(lài)按生產(chǎn)環(huán)境最小化原則# Web框架與HTTP客戶(hù)端 npm install express axios # 模板引擎與靜態(tài)資源服務(wù) npm install ejs serve-static # 緩存與配置管理 npm install node-cache dotenv # 日志與錯(cuò)誤處理 npm install winston morgan # 開(kāi)發(fā)時(shí)熱重載僅dev環(huán)境 npm install --save-dev nodemon關(guān)鍵點(diǎn)說(shuō)明serve-static用于托管CSS/JS/圖片等靜態(tài)資源比Express內(nèi)置的express.static更輕量、更可控winston企業(yè)級(jí)日志庫(kù)支持按級(jí)別info/error分離日志文件方便運(yùn)維排查morganHTTP請(qǐng)求日志中間件能記錄每個(gè)請(qǐng)求的耗時(shí)、狀態(tài)碼、IP是性能分析的基礎(chǔ)。創(chuàng)建.env文件配置環(huán)境變量永遠(yuǎn)不要把密碼、地址寫(xiě)死在代碼里# 服務(wù)監(jiān)聽(tīng)配置 PORT3000 HOST0.0.0.0 # Scala后端地址HDFS代理服務(wù) SCALA_PROXY_URLhttp://scala-hdfs-proxy:8080 # HDFS文件路徑前綴與Scala側(cè)保持一致 HDFS_BASE_PATH/recommends/user_based # 緩存配置 CACHE_TTL_SECONDS300 FALLBACK_DIR/opt/app/fallback # 日志配置 LOG_LEVELinfo LOG_FILE_PATH/var/log/movie-web/app.log4.2 核心服務(wù)代碼實(shí)現(xiàn)創(chuàng)建app.js作為主入口文件const express require(express); const axios require(axios); const fs require(fs).promises; const path require(path); const NodeCache require(node-cache); const winston require(winston); const morgan require(morgan); require(dotenv).config(); // 初始化日志 const logger winston.createLogger({ level: process.env.LOG_LEVEL || info, format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), transports: [ new winston.transports.File({ filename: process.env.LOG_FILE_PATH || app.log }) ] }); // 初始化緩存 const cache new NodeCache({ stdTTL: parseInt(process.env.CACHE_TTL_SECONDS) || 300, checkperiod: 600 }); const app express(); const PORT process.env.PORT || 3000; // 中間件 app.use(morgan(combined, { stream: { write: (message) logger.info(message.trim()) } })); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.set(view engine, ejs); app.set(views, path.join(__dirname, views)); // 靜態(tài)資源服務(wù) app.use(/css, express.static(path.join(__dirname, public/css))); app.use(/js, express.static(path.join(__dirname, public/js))); app.use(/images, express.static(path.join(__dirname, public/images))); // 主頁(yè)路由健康檢查 app.get(/, (req, res) { res.json({ status: ok, timestamp: new Date().toISOString() }); }); // 推薦API路由 app.get(/api/v1/recommend, async (req, res) { const userId parseInt(req.query.user_id); const limit parseInt(req.query.limit) || 10; const format req.query.format || json; // 參數(shù)校驗(yàn) if (!userId || isNaN(userId) || userId 1) { logger.warn(Invalid user_id: ${req.query.user_id}); return res.status(400).json({ code: 400, msg: user_id must be a positive integer }); } const cacheKey rec_${userId}_${limit}; let data cache.get(cacheKey); if (data) { logger.debug(Cache hit for user ${userId}); return res.json(data); } try { // 構(gòu)建HDFS代理URL const hdfsUrl ${process.env.SCALA_PROXY_URL}/hdfs/file?path${process.env.HDFS_BASE_PATH}/${userId}.json; const response await axios.get(hdfsUrl, { timeout: 5000 }); // 處理Scala返回的數(shù)據(jù)結(jié)構(gòu) let recommendations response.data.recommendations || []; // 按預(yù)測(cè)評(píng)分降序取limit條 recommendations recommendations .sort((a, b) b.predicted_rating - a.predicted_rating) .slice(0, limit); // 補(bǔ)充電影詳情調(diào)用另一個(gè)微服務(wù)此處簡(jiǎn)化為mock const enriched await Promise.all( recommendations.map(async (item) { // 實(shí)際項(xiàng)目中這里會(huì)調(diào)用電影元數(shù)據(jù)服務(wù) // 為簡(jiǎn)化我們用一個(gè)本地JSON文件模擬 try { const movieData JSON.parse(await fs.readFile(./movies/${item.movie_id}.json, utf8)); return { ...item, ...movieData }; } catch (e) { // 如果電影詳情缺失用默認(rèn)值填充 return { ...item, title: 電影ID ${item.movie_id}, poster_url: /images/default-poster.jpg }; } }) ); data { user_id: userId, timestamp: Date.now(), recommendations: enriched }; cache.set(cacheKey, data, parseInt(process.env.CACHE_TTL_SECONDS) || 300); logger.info(Fetched and cached recommendations for user ${userId}); if (format html) { // 返回HTML片段用于AJAX局部刷新 res.setHeader(Content-Type, text/html; charsetutf-8); return res.render(recommend_list, data); } else { res.json(data); } } catch (error) { logger.error(Failed to fetch recommendations for user ${userId}:, error.message); // 降級(jí)到本地兜底文件 const fallbackPath path.join(process.env.FALLBACK_DIR || ./fallback, ${userId}.json); try { if (await fs.access(fallbackPath).then(() true).catch(() false)) { const fallbackData JSON.parse(await fs.readFile(fallbackPath, utf8)); res.json(fallbackData); } else { res.status(503).json({ code: 503, msg: Recommendation service is unavailable }); } } catch (fallbackError) { res.status(503).json({ code: 503, msg: Fallback failed, detail: fallbackError.message }); } } }); // 推薦頁(yè)面路由服務(wù)端渲染 app.get(/recommend, async (req, res) { const userId parseInt(req.query.user_id); if (!userId) { return res.status(400).render(error, { message: 缺少u(mài)ser_id參數(shù) }); } try { const apiResponse await axios.get(http://localhost:${PORT}/api/v1/recommend?user_id${userId}formatjson); res.render(recommend, apiResponse.data); } catch (error) { logger.error(Failed to render page for user ${userId}:, error.message); res.status(500).render(error, { message: 頁(yè)面加載失敗請(qǐng)稍后重試 }); } }); // 啟動(dòng)服務(wù) app.listen(PORT, process.env.HOST, () { logger.info(Server running on http://${process.env.HOST}:${PORT}); });這個(gè)app.js實(shí)現(xiàn)了完整的生產(chǎn)就緒能力健壯的錯(cuò)誤處理每個(gè)try/catch塊都記錄詳細(xì)日志并區(qū)分業(yè)務(wù)錯(cuò)誤如參數(shù)錯(cuò)誤和系統(tǒng)錯(cuò)誤如網(wǎng)絡(luò)超時(shí)靈活的降級(jí)策略HDFS代理失敗 → 本地兜底文件 → 返回503層層遞進(jìn)日志驅(qū)動(dòng)運(yùn)維所有關(guān)鍵路徑緩存命中、API調(diào)用、文件讀取都有日志且按級(jí)別分離方便用ELK或Grafana分析配置驅(qū)動(dòng)所有外部依賴(lài)URL、路徑、超時(shí)都從環(huán)境變量讀取無(wú)需改代碼即可切換測(cè)試/生產(chǎn)環(huán)境。4.3 前端頁(yè)面與樣式實(shí)現(xiàn)在views/目錄下創(chuàng)建recommend.ejs前面已展示再創(chuàng)建public/css/main.css定義基礎(chǔ)樣式/* public/css/main.css */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif; line-height: 1.6; color: #333; } header { background: #2c3e50; color: white; padding: 1rem 2rem; text-align: center; } main { max-width: 1200px; margin: 0 auto; padding: 2rem; } .movie-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1.5rem; } .movie-card { border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden; transition: transform 0.2s, box-shadow 0.2s; } .movie-card:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.1); } .movie-card img { width: 100%; height: 300px; object-fit: cover; display: block; } .movie-card h3 { padding: 0.75rem 1rem 0; font-size: 1.1rem; font-weight: 600; } .rating { padding: 0.5rem 1rem; background: #f8f9fa; display: flex; align-items: center; } .score { font-size: 1.4rem; font-weight: bold; color: #e74c3c; margin-right: 0.5rem; } .label { font-size: 0.85rem; color: #6c757d; } .similarity { padding: 0 1rem 0.75rem; font-size: 0.85rem; color: #27ae60; } .no-recommend { text-align: center; padding: 2rem; } .no-recommend a { display: inline-block; margin-top: 1rem; padding: 0.5rem 1rem; background: #3498db; color: white; text-decoration: none; border-radius: 4px; } /* 響應(yīng)式平板端 */ media (max-width: 768px) { .movie-grid { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); } } /* 響應(yīng)式手機(jī)端 */ media (max-width: 480px) { .movie-grid { grid-template-columns: 1fr; } header { padding: 0.75rem 1rem; } main { padding: 1rem; } }這個(gè)CSS的關(guān)鍵設(shè)計(jì)移動(dòng)優(yōu)先先寫(xiě)手機(jī)端樣式再用媒體查詢(xún)?cè)鰪?qiáng)平板和桌面端性能優(yōu)化避免import所有樣式在一個(gè)文件不使用!important靠選擇器權(quán)重控制視覺(jué)層次用陰影、懸停動(dòng)畫(huà)、顏色對(duì)比紅色評(píng)分、綠色相似度引導(dǎo)用戶(hù)注意力無(wú)障礙友好字體大小適中顏色對(duì)比度符合WCAG AA標(biāo)準(zhǔn)。4.4 Docker化部署與生產(chǎn)配置生產(chǎn)環(huán)境絕不能用node app.js裸跑。我們用Docker容器化確保環(huán)境一致性。創(chuàng)建Dockerfile# 使用官方Node.js Alpine鏡像體積小、安全性高 FROM node:18.17-alpine # 創(chuàng)建非root用戶(hù)安全最佳實(shí)踐 RUN addgroup -g 1001 -f nodejs adduser -S nextjs -u 1001 # 設(shè)置工作目錄 WORKDIR /app # 復(fù)制package.json并安裝依賴(lài)?yán)肈ocker layer緩存 COPY --chownnextjs:nodejs package*.json ./ USER nextjs RUN npm ci --onlyproduction # 復(fù)制應(yīng)用代碼 COPY --chownnextjs:nodejs . . # 切換回非root用戶(hù) USER nextjs # 暴露端口 EXPOSE 3000 # 啟動(dòng)命令 CMD [npm, start]創(chuàng)建docker-compose.yml編排服務(wù)包括Node.js和Nginx反向代理version: 3.8 services: web: build: . restart: unless-stopped environment: - NODE_ENVproduction - PORT3000 - SCALA_PROXY_URLhttp://scala-proxy:8080 - HDFS_BASE_PATH/recommends/user_based - CACHE_TTL_SECONDS300 - FALLBACK_DIR/app/fallback - LOG_LEVELinfo - LOG_FILE_PATH/var/log/app.log volumes: - ./logs:/var/log - ./fallback:/app/fallback depends_on: - scala-proxy networks: - recommender-net nginx: image: nginx:alpine restart: unless-stopped ports: - 80:80 - 443:443 volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./logs:/var/log/nginx depends_on: - web networks: - recommender-net scala-proxy: image: your-scala-proxy-image:latest restart: unless-stopped ports: - 8080 networks: - recommender-net networks: recommender-net: driver: bridge關(guān)鍵生產(chǎn)配置要點(diǎn)非root用戶(hù)運(yùn)行Docker容器默認(rèn)以root運(yùn)行但Node.js應(yīng)用應(yīng)降權(quán)避免容器逃逸風(fēng)險(xiǎn)日志卷掛載./logs:/var/log將容器內(nèi)日志映射到宿主機(jī)方便運(yùn)維查看環(huán)境變量注入所有敏感配置URL、路徑通過(guò)environment注入不寫(xiě)入鏡像健康檢查在Dockerfile中添加HEALTHCHECK指令此處省略但生產(chǎn)必須加HEALTHCHECK --interval30s --timeout3s --start-period5s --retries3 \ CMD wget --quiet --tries1 --spider http://localhost:3000/health || exit 15. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 典型問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查命令/步驟解決方案頁(yè)面打開(kāi)空白控制臺(tái)報(bào)Failed to load resource: net::ERR_CONNECTION_REFUSEDNode.js服務(wù)未啟動(dòng)或Ngin
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久天美| 亚洲色图尤物视频| 人人妻人人操人人乐| 久久精品国产亚洲AV清纯| 操九九九九九九| 亚洲精品无码久久AV| 97碰碰色| 蜜臀久久99精品久久久久久无删减| 欧美久久毛片基地| 九九无码| 小情侣高清国产在线视频| 亚洲97在线观看| 秋霞福利网| 狠狠干精品一二三四五六2022| 久热99| 国产精品点击进入在线影院| 香蕉视频精品亚洲一区二区三区在线播| 欧美少妇第一页| 91中文在线| 日韩激情啪啪| 国产精品久久久久久久黄无码 | 美女操逼A A| 天天综合网~91| 五月天色电影| 91天天美女| 男人把坤坤插入女人的下体| 欧美少妇高潮视频| 中文字幕视频二区| 亚洲免费成人在线高清无码视频| 探花视频免费观看国产专区| 美女诱惑久久| 欧美综合1性辶| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 日韩欧美综合激情| 日韩成人性爱电影在线播放| 一,爱啪啪,在线免费视频| 亚洲国产精品久久AV| 91第一页| 99re免费| 久久久久久久久久va| 亚欧高清| blacked精品一区国产| 日本性感人妻91| 3PAV乱伦视频| 亚洲三区视频| 日韩性爱小视频在线观看| 一类无码操逼视频| 久久精品国产亚洲AV成人直播| 日本一区二区成人在线| 国产精点久久久成人| 岛国黄色大片网站| 久热9| 久久99视频| 国产刺激视频| 热的中文 热的有码 热的国产| 天天看特黄的免费网站| 少妇天堂| av天堂精品久久| 男男H黄动漫啪啪无遮挡网站| 亚洲色啪| 天天看特黄的免费网站| 加勒比色综合| 午夜福利国产欧美日韩夜夜| 久操视频资源站公开| AV中文在线| 青娱乐亚洲热| 天天日骚逼熟女| 人人操人人操人妻人| 日日夜夜精品视频| 久久久亚洲欧美综合| 久久99亚洲精品久久99果| 五月丁香亭亭| 一区二区三区色综合| 九九九不卡| 欧美91精品国产自产| 自拍偷拍第26| 免費黃色視頻觀看一| 操九九九九九九| 久日91在线| 色97国产69香蕉| 青青草中文字幕| 国产辣妈在线视频福利| 91free福利| 91亚洲不卡一区| 欧美日韩97在线| 国产精品爆乳懂色蜜乳| 美日韩成人| 老司机免费视频在线91| 熟女探花啪啪| 色色色综合网| 大香蕉99re| 人妻丰满熟妇一区二区三| 国产伦精品一区二区三区在线观 | 人妻啪| 91美女中出| 蜜桃久久久久久久久久久久| 欧美性爱日韩高清| 内射中国少妇高清视频免费视频 | 五月婷婷深深爱| 狠狠夜色午夜久久综合在线| 亚洲欧美黄| 在线人人人人人人精品超| 亚洲 中文 女同| 激情文学小说一区二区 | 亚洲一区二区专区-国产丝袜精品丝袜-成人AV| 亚洲日韩美女丝袜美腿人妻视频| 色狠狠色| 人人操人人肉久久精品| 99精品热| 天天综合官网| 丁香五月天堂网| 丰满少妇精品一区二区| 曰韩av中文字幕专区| 久噜噜| 亚洲美女av无码| 蜜臀国产AV中文字幕| 蜜臀久久99'精品久久久| 精品久久久久久无码| 人妻碰碰碰碰碰碰| 日本一区二区亚洲综合| 亚州成人a∨| 天天干18禁| 91精品久久综合熟女| 欧美成人国产精品| 人妻少妇av在线观看| 亚洲人妻久久久| JULIA一区二区三区在线播放| 国产成人精品一区| 欧美 亚洲 偷拍自拍| 久久激情视频| 四虎AV在线观看| 青青草好吊色| 欧美三级免费伊人| 国产精品嫩草久久久久| 久久久成人精品| 99热在线观看| 欧美人妻少妇| 天美一区在线| 97超色| 欧美精品99久久久**| 青青草白白色| 亚洲图片偷拍视频区| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 99色视频| 91国产操逼视频| 欧美在线啊啊啊| 精品国产人成在线| 九九九不卡| 五月天色图影视| 欧洲久久一二线| 欧美少妇大量自拍视频在线观看| 国产乱色国产精品免费视| www被窝色com| 天堂精品在线| 日韩av不卡在线观看| 精品一区二区三区蜜桃| 台湾肥佬网一区二区三区| 亚洲字幕一区二区| 青青在线视频日韩欧美| 国产欧洲精品亚洲午夜拍精品| 久久人人看| 最新日本中文字幕| 亚洲蜜臀精品视频久久| 欧洲一区二区三区免费| 中文字幕精品一区二区精品| 午夜.DJ高清在线观看免费7| 亚洲日韩狠狠撸视频| 国产精品熟女AV中文字幕在线播放| 精品九九国产无码| 啊啊啊啊啊啊在线| 97操在线| 加勒比综合九九99视频在线播放| 91狠狠综合久久久| 香蕉久久AⅤ...| 亚洲做性| 久久99草| 性色av一区二区| 日日干夜夜干| 欧美中字二区| 久久熟妇五十路一区| 久久色情| 九九热精品| 国产熟女免费观看久久| 岛国片在线视频网站| 女生看匆91网站| 九一国产精品| 免费成人在线熟妇网| 欧美人妻精品| 欧美后进式| 91超碰人人操| 欧美黄色片AAAAA| 日韩精品在线观看观看| 啪啪视频亚洲第一| 日韩欧美午夜一区二区| 狠狠色伊人亚洲综合网站色| 久久人妻熟女一区二区 | 97色伦97色伦国产欧美| 天天做天天爱| 加勒比海人人操超碰在线| 校园春色宗合网| 欧美内射少妇| 69视频福利导航| 中文字幕91综合| 水澄无码AV| 日本三级日本三级99| 男女激情黄色网址| blacked精品一区国产| 亚洲AV秘无码一区..| 日日爱99| 亚洲黄色视频在线观看视频| 国产午夜无码片在线观看影视 | www.操| 久久天天性久久伊人| 激情综合久久| AA丁香综合激情| 色婷婷99| 久久人妻97久久久久久久| 99超碰色| 嗯嗯嗯啊啊啊操的我好爽 | 亚洲成人AB| 黄色工厂这里只有精品| 天天看片青娱乐| 97超碰日韩| 在线人成亚洲视频免费观看| 国产精品成人久久一区二区三区| 欧美精品99久久久**| 久久9久久| 嗯阿好爽好紧| xxx亚洲午夜天堂| 亚洲成人一二三区| 粉嫩小泬久久久一区二区| 97看操| 天天做天天爱天天爽AV| 青青草无码视频| 久久久亚洲熟妇资源| 久久99国产精品| 国模无码人体一区二区三| 国模私拍一区二区三区神乳| 亚洲五月婷| 天天日天天操心| 厕所偷拍在线| 亚洲自拍青操视频| 天天色天天干天天爱| 亚洲精品人妻吞精av | 亚洲另类色图片| 亚洲欧美在线综合| 日日爱99| 亚洲福利中文字幕在线| 日韩内射视频| 久久久91| 亚洲va有码在线天堂| 乱伦系列一区二区| 精品免费1| 久久 久久国内精品亚洲| 免费视频97| 日韩卡一卡二卡三在线| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 国产一区二区啪啪视频| 夜夜操91744565| 天天草AV| 免费精品人妻一区二区三| 久久99久久99精品免视看婷婷| 超碰97资源大奶| 国语精品av| 乱伦一区二区三区‘| 99热| 国产自偷| 浪人综合网| 91麻豆天美国产| AV女资源| 97福利视频| 97bbn| 97日韩| 性爱av在线免费观看| 91色综合激情| 国产精品 视频| 大地资源在线观看中文第二页| 青青草在线视频人人想人人上| 日韩精品亚洲一二三| 秋霞无码av鲁丝片一区| 四虎AV影视国产精品亚洲精品| 九久9精品| 日本性爱少妇| 另类欧美| 欧美日韩国内不卡| 蜜桃网熟妇| 天天视频黄网站| 久久111| 午夜亚洲WWW湿好大| 首页亚洲国产高跟丝袜诱惑视频| 欧美日韩国产色五月综合在线| 影音先锋新男人| 蜜乳中文字幕a在线| 人人透人人操| 快灬快灬 一下爽蜜桃在线观看 | 夜夜高潮夜夜爽国产伦精品| 凸凹视频在线观看| 97在线播放| 欧美成人一区二区三区在线播放| 强乱老妇中文字幕| 99热啪啪| 欧美成人精品一区| 成人AV素股で擦久久| 久久久久久九九九九| 少妇二级| 亚洲欧美高清无码| 人妻 欧美 中文| 黄页视频网站野外| 中出20p| 日韩久久三区| 成人26uuu| 婷婷五月天无码| 高跟丝袜AV专区国产| 亚洲少妇免费视频\| 丁香五月婷婷啪啪| 91亚洲欧美| 久操操| 91c色| 97超碰国产亚洲精品| 长长久久免费视频| 天天上日日上日韩精品| 欧天美中出| 国产精品无码AV网站| 9Ⅰ超碰| 久久久久久性爱视频| 影音先锋视频在线| 亚洲色阁| 欧美九一精品久久久熟妇| 亚洲激情网| 国产日韩欧美中文在线播放| AV电影在线播放| 91爱剪切久久| 久久精品72| 中文字幕丝袜国产第一页不卡| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 日人妻视频91| 亚洲激情片| 97视频www| 国产一级片| 国内毛片国产欧美拍| 久久国产999| 亚洲天堂,男人| 懂色中文一区二区三区| 亚洲日韩美女丝袜美腿人妻视频| 中文字幕精品乱码| 热久久91婷婷| 五月激情综合网| 人人操我人人干| 欧美性性性| 亚洲综合骚逼| 超碰激情808| 天美麻花大全视频| 久久综合国产精品国产| 国产传媒一区二区三区| 亚洲骚男同com| 亚洲人91| 日韩美女高潮喷水视频| 亚洲AV无码| 日亚韩精品视频二区三| 91午夜无码| 欧洲人妻视频| 欧美色图片色哟哟| 肉丝无码中文高清| 久操视频免费观看| 亚洲另类色综合网站| 啊啊啊啊在线观看网址| 欧美九九爱| 色 亚洲 91| 天美国产精品| 伊人天堂在线| 九九热免费国产视频婷婷伊人五月| 人妻精品一区二区在线| 欧美日韩精品一区二区三区高清| 69XX一中文字幕人妻91| 精品免费视频国产一区| 久久大黄片| 亚洲欧美另类图片| 久久一二三四| 97超碰久久| 国产成人欧美精品在线| 午夜小电影在线插入淫高潮| 最新日本中文字幕| 999久久久免费精品国产牛牛| 亚洲天天操| 香蕉99秘 一区精品蜜桃臀| 91久久国产精品| 久久久久96| 欧美九一精品久久久熟妇| 久久一区二区加油站| 天天躁狠狠躁av| 久久中日麻豆| 白丝在线一区| 黑人性欧美| 加勒比aⅴ| 亚洲男人天堂手机版| 欧美—性—交—色| 家庭乱伦国产精品| 精品亚洲国产成人av网站| 亚洲字幕一区二区| 99天堂网| 性性久久| 欧美后入式| 大鸡巴久久| 久久色人体 | 亚洲性图91| 人妻另类| 熟妇综合一区二区三区| 国产女人极品高潮毛片| 亚洲中文字幕三级在线| 欧美天堂超碰97| 丁香五月天婷婷姐| 欧美熟女妇同| 大香蕉手机在线| 中文字幕99999| 欧美偷拍区| 熟女六十路| 欧美成人9797| 伊人四虎综合| 欧美色欧美| 国产高清免费不卡av| 国产又色又爽又舒服的三级视频| 荡小穴在线观看| 亚洲精品蜜桃久久久久久久| 亚洲人综合19| 一起草日韩| 免费视频a级毛片免费视频| 精品夜夜澡人妻无码| 97精品国产手机| 丰满人妻一区二区三区四区| 女人被男人桶爽视频网站| 久久草大香蕉| 久久久不卡区一区二区三区久久久| 日日玩天天干| 天天操天天射天天日| 国产亚洲色婷婷久久99精品91| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 在线观看精品国产免费| 青青草日本中文字幕| 无码二级三级| 日韩乱伦AⅤ| 精品少妇后入一区二区三区四区人妻巨乳| 亚洲 欧美 综合 91| 操屄日韩| 综合网欧美在线| 欧美日韩天堂| 成人麻豆av电影网站| 一牛影视久久久一区二区三区| 色香综合天天影视综合 | www.av在线视频| 国产欧美一区二区| 猛猛干| 人妻乱仑一区二区三区| 熟女AV一区| 在线观看亚洲成人精品| 嗯嗯,啊啊,国产精品| 蜜臀久久99精品久久久久久成人小说 | 91AV入口| 一二三啪啪专区| 不卡二三区人妻少妇| 国产1769在线| 日韩人妻精品| 国产福利av精彩对白| 美女黑人91神马| 最新国内自拍av免费| 嗯嗯啊啊用力视频免费| 精品人妻中文字幕高清| 欧美78p| 天天做天天爱| 宅男91视频在线播放| 国产久久久久久| 午夜免费视频1000| 91美女在线观看| 日本在线一二| 欧美日韩国产成人高清| 九九久久99| 蜜乳AV.COM| 91久久伊人婷婷青青草| 一级特级aaaa毛片免费观看 | 久久这里只精品免费福利| 男人的天堂成人的社区| 色欲Av人妻精品一区二| 日日夜夜草草草| 亚洲成人av电影在线| 91强在线播放| 影音先锋国产精品| 欧美九九九九九| 亚洲天堂女优在线| 国产精品亚洲天堂网址| 999色欧美中文字幕| 日日夜夜狠狠| 亚洲伊人久久综合97| 超碰碰激情97+久| 久久高清欧美国产| 国产精品香蕉| 国产精品视频播放| 操91| 1000部熟女视频在线观看| 国产乱人妻精品入口| 蜜桃av综合网发布| 超碰欧美| 国产丝袜一区二区三区| 曰韩欧美国产传媒麻豆第一区| 欧美亚洲高清| Aa东京男人的天堂| 野狼激情网| 亚洲图片婷婷五月天| 全国男人天堂网| 蜜臀久久99精品久久久久免费观| 亚洲综合精品国产一区| 秋霞怕怕片| 东北操逼| 江都AV在线| 蜜乳AV一区二区三区四| AAAA级日本片免费视频| 欧美爱国产综合、| 亚洲综合性感在线| 五月丁香综合网| 成全在线观看免费观看| 九九九热| 午夜噜噜噜| 国产亚洲日本| av在线人气| 欧洲熟妇xxXx欧美老妇裸体| 人人摸.人人色| 欧美一二三| 99热国产| 国外91| 色好看av| 亚洲一区二区三区久久 亚洲一区二区| 变态乱伦伪娘灌肠一区二区| 呦呦一区| 国产精品suv一区| 欧美色图欧美| 亚洲一区二区中文字幕| 一区二区三| 国产精品毛片| 加勒比人妻综合| 成人AV素股で擦久久| 不卡啪啪视频| 做爱A级亚欧| 超碰在线欧美性爱激情| 国产极品馒头逼| 亚洲成人在线乱码色午夜| 人人操人人射人人干| 日本加靬比网站发布页| 国产天天骚| 久久婷婷五月天| 搡老熟女老女人老熟妇免费视频| 亚洲成a人片在线观看中文!!!| 色综合V| 91肉丝| 国产精品视屏| 96久久久久| 99re视频这里只有精品| 欧美一级二级三级| 91九色丨风韵犹存| 又大又大又大又粗爽高潮观看| 男人天堂新| 亚州色综合| 日日摸天天爽夜夜欢| 熟女人妻精品一区二区视频| 久久色精品视频在线| 亚州性色| 一起草高清无码| 黄片视频观看| 69少妇一区二区| 九九久久一区二区伦理| 久久激情亚洲精品无码?V| 亚洲古典另类欧美在线| 国产女人成人精品视频| 九九人人操| 国产亚洲一黄| 性欧美天天| 人妻在线大香蕉| 欧美国产操逼| 精品人妻丰满熟妇一区二区三| 婷婷五月天激情四射| 无码久久国产| 九月丁香综合网| 丁香婷婷久久 | 性爱av在线免费观看| 日韩精品一区的| 性爱综合网| 超碰亚洲97| 亚洲 欧美 另类 日韩 人妻一区 | 日韩一级特黄av毛片| 人人干人人搞人人摸| 五月天色综合| 密臀AV在线| 国产97在线播放| 无码精品久久久久久亚洲| 欧美日韩另类在线播放| 九九热九九| 婷婷五月天久久精品视频一区二区三区 | 国产蜜臀精品一区免费尤物| 中国小夫妻勾搭露脸淫荡对白| 啊啊啊男女| 2017av无码免费无线播| 亚洲最大AV网| 看黑人AV不卡| 天天影视综合色| 天堂69亚洲精品中文字| 在线看免费无码AV天堂的| 99青草| 天操天操夜操夜月月年年操操| 久久久无码视频| 精品亚洲国产成人av网站| 亚洲丝袜二区| 四虎免费视频| 亚洲图片激情综合另类| 天天日天天插| 日本精品九九九| 2020久久免费视频| 亚洲天堂热| 青青伊人加勒比海| 美女操逼A A| 日韩一区二区精品视频| 综合色久欲| 17c在线成人免费A片观看| 熟妇在线视频一区二区| 91男人综合| 二男一女成人A片| 男女打扑克高清网站| 夜夜高潮夜夜爽国产伦精品| AV在线性爱| 美女人妻色网站| 夜夜嗨免费视频| 东京成人一区| 99中文字幕| 日本三级日本三级99| 桃色人妻在线视频| 国产高清午夜成人在线观看| 91碰碰碰| 青青草色AV| 麻豆啪啪啪视频| AV色五月天| 亚洲 日本 国产 综合| 久久综合中文国产| 9色国产精品一区粉嫩| 裸体美女免费看网站青草| 天天色综合影视网| 亚洲欧美激情在线视频| 神马久久免费电影观看| 日本护士高潮| 97综合激情| 五月天社区| 亚洲色电影在线| 五月激情综合网| 亚洲a色| 91oumei| 国产精品96| 日韩内射视频| 国产v片在线免费观看| 亚洲综合在线高清| 无码一区二区精品视频久久久春药| 麻豆久久久久久久久丝袜| 操国产逼| 熟妇国产免费一区| 国产精品岛国片在线观看| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| japan日本高清乱xxxx| 超碰碰小说97| 婷婷五月天成人网| 97视频在线| 97超级欧美| 综合免费无码中文| 偷拍导航视频网站| 欧美黑人猛交春色影视大全| 中日韩免费看男女操逼大全| 日韩二三区| 亚洲一级特黄大片在线播放91| 另类欧美| 97视频网站在线观看| 操逼视频色| 人人澡人人澡人人| 久久久久精| 91久久国产综合精品| 免费簧片在线观看| 大香蕉淫人| 青青操少妇| 欧美性爱一级操| 久久久久久久97| 国产美女激情| 九九热九九| 日韩欧洲操屄视频| 日韩精品资源| 97se综合网| 无码自拍SM| 国产强奸AV在线| 色婷婷一区二区三区久久午夜成人不| 日韩乱码Av| 中文字幕一区电影在线观看| 一本色道久久综合精品婷婷| 亚洲码和欧洲精品激情系列| 亚洲精品一区二区精品| 夜草欧美| 亚洲天堂综合AV| 精品人妻av在线播放| 99夜夜操| 亚洲精品97中文字幕| 爱射综合| 中文字幕av乱伦| 熟妇xxxxx性春色| 丰满人妻一区二区三区免费| 色网1| 欧美九九99久久精品| 高清国产av无码| 在线观看无码三级少妇| 啊啊啊啊啊啊在线观看| 91男女| 无码视频一区二区| 久久9精品视频| 三级三久久线久久99久目本WW| 国产强奸乱伦xd| 国产在线视频午夜精华在| 久久9免费视频| 亚洲资源网| 欧美老妇女内射网址| 精品妇女一区二区三区| 色狠狠色| 国产视频一区二区免费| 亚洲第一精品在线视频| 欧美 精品国产制服第一页 | 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 99操| 97内射偷拍| 日韩在线视频1234| 夜夜肏2021| 欧美一级色| 久操不卡视频| 26uuu国产免费观看| 午夜精品久久久久久久99热影院| 人妻熟女字幕一区二区| 六月婷婷综合| 美女黄色一级A视频| 色婷婷综合视频| 精品少妇一区二区三区在线视频| 操逼操逼逼操操逼91| 欧美另类精品xxxx| 欧美性爱1080p| 国语国产操逼伊人AV网| 国产 亚洲 丝袜 制服| 中文字幕精品一区二区精| 精品国产人成在线| 91成人精品在线播放| 欧美综合自拍| 欧美色图综合| 黄片www视频免费| 亚洲天堂精品日韩电影| 91精品国产91久久青草 | 亚洲囯产精品女人久久久| 在线色导航| 亚洲欧美综合区自拍另类| 少妇xx精品| 静品嫩模一区二区| 女优免费一区二区永久| 97资源超碰| 色天使大香蕉| 亚洲欧美日韩中文久久自慰| 久久久内射良家| 欧美春色| 亚洲无码 国产无码| 久久免费99精品久久久久久| 欧美亚洲| 亚洲无码色| 人妻插插人妻人| 鸥美极品| 亚洲97精品| 国产精品一区二区亚洲人成毛片| 久草免费福利在线播放| 中文字幕jul-617人妻熟女| 开心五月婷婷| 少妇三P| 天天性射网| 男人的天堂 在线一区| gogogo免费高清看中国国语| 在线观看黄色电话| 蜜色网色哟哟| 十八禁电影伊人网| www国产无码| 国产高清成人mv在线观看| 97人人射| 亚洲 欧美 另类 日韩 人妻一区| 91日韩网站| 国产精品久久久无码aV去| 亚洲 欧美 手机在线观看| 1区2区3区在线视频| 天天操天天日天天干| 美女黄网| 成年女人18级毛片毛片免费观看| 伊人97色天使| 91精品国| 蜜乳Av成人片网站| 人妻激情偷乱视频一区二区三区| 精品性爱久久视频| 97久久网| 久久人人爽人人爽人人片Ⅴ| 亚洲精品欧美专业| 亚洲高清综合网| 人妻人人做人人澡人人爽欧美一区| 婷婷色一区| 国产91丝袜 在线播放| 亚洲性爱免费电影| 人妻精品综合中文字幕在线 | 亚洲欧洲色情高清| 九九九九热| 综合色色婷婷| 久久亚洲天堂| 香蕉黄色一级视频| 99久久久无码| 欧美 亚洲| 激情久久av一区av二区av| 亚洲永久AV无码精品秋霞| 亚洲开心网| 97操操| 欧美日韩妖精91com| 国产精品一二三在线看| 中文字幕-区二区三区四区视频中国| 99热一区二区三区四区| 熟女六十路| 色香伊人| 中文字幕123| 四虎在线免费视频| 污污汅18禁网站在线永久免费观看| 午夜激情床戏激情| 欧美激情综合网| 在线黄页看毛片| 国产精品农村妇女| 天天综合精品| 蜜臀AV午夜精品久| 一区二区 韩日AV| 色吊丝 日日骚 清纯唯美| 日韩AC| 欧美亚洲特P| 狠狠干狠狠色| 少妇高潮九九九九| 成人在线视频二区| 中文视频在线观看| 色月天AV导航| 91精品微拍福利| 久久久久久9999| 国产aⅴ无码片毛片一级网站| 国产噜噜噜噜噜久久久久久久久| 天天色,天天干,天天干| 操老熟女AV| 猛猛干| 久久久久网站-538在线视频-欧美永久乱码 | 久妇网| 天天射夜夜操| 青青草久久一区网| 美国黄片aaa| 粉嫩久久久久| 成年人黄色小视频网站| 亚洲偷拍欧美激情| 国产三级电影免费观看| 美女好片色日本| 另类图片五月| 影视综合无码少妇| 蜜桃一区二区三区| 综合色啪| 校园春色综合网| 欧州激情视频在线一区二区| 园内精品自拍视频在线播放| 蜜臀一二三区| 久久久久13| 少妇熟女1区2区3区| 综合91网| 亚洲人妻av| 日本操逼无码| 九九九九免费高| 五月天色综合| 日日夜夜精品| 久久九九97| 成人A片男人的天堂| 操逼网免费无码视频| 干少妇视频| 在线免费试看60秒| 96精品在线| 伦伦成年午夜免费视频| 91丝袜视频在线观看| 东北女人| 六月婷婷五月丁香| 欧美丰满少妇xx高潮| 97亚洲中文| 亚洲综合一| 久久久影院| 久久久久九九九| 日韩中文字墓| 久操免费电影| 人人噜夜夜操| 爱爱动态120秒| 岛国视频免费在线观看| 97在线免费视频| 色与欲影视天天看综合网| 干b在线性社区| 色五月亚洲| 国产 亚洲 丝袜 制服| 性夜影院爽黄A爽免费动漫| 中文欧丝袜诱惑| 精品人妻一区二区免费蜜桃| 综合激情五月丁香| 欧美强奸乱| 日本操逼aaaaa| 中文乱码字幕观看视频| 超碰在线成人电影| 亚州春色| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 九九热超碰97亚洲最新香蕉| 午夜男女爽爽爽在线视频| 国产黄色影片在线观看| av网站免费看| www.av在线视频| 久操频道免费在线呗看| 使劲用力艹少妇视频一区二区| 91丨九色丨大屁股| 韩国午夜理伦三级好看| 亚欧高清| 麻豆成人影音在线| 亚洲情色 自拍| 中文字幕精品亚洲熟女| 色婷婷久久综合超碰| 特级大荫道BBwBBwBBW| 国内91熟女人妻丝袜天天精品视频在线 | 国产成年女黄特黄| 久久久久久九九九九| BBBBB97COM| 色狠狠一区二区三区香蕉| 狠狠干妹子| 校园春色家庭伦理欧美激情| 中文字幕第23区| 久久久久9999精品九九九| 麻豆一区在线| 天天舔天天日天天射| 啊啊啊啊啊好舒服视频| 精品国产人成在线| 免费日韩黄片| 国产成人99久久亚洲综合| 9色国产精品一区粉嫩 | 亚洲一区二区中文字幕| 操高情无码| 另类 日韩 熟女| 日韩AV一起草| 操逼日韩无码 | 2025亚洲男人天堂| 97干色天堂| 青青草视频久久久久| 97干色天堂| 一区二区 电影 亚洲| 老司机久久| 亚州欧美综合| 男人的天堂VA| 农村女一级毛卡片| 欧美九九爱| 国产夜夜艹| 一区二区三区四区久久视1| 1二区9| 久久人妻一区二区三区高清 | 看一级特黄a大一片| 91丨熟女丨丰满熟女| 国产成人网| 久久久久久大| 久久九精品| 青青草大香蕉视频| 免费AV中文网在线观看| 精品无码不卡视频| 色情五月丁香| 中文字幕丝袜美腿| 校园春色宗合网| 久久粉色| 国产一级特黄大片处女| 国产强奸超碰AV| 欧美亚洲玖玖玖| 女人的天堂大香蕉网| 少妇熟女视频一二三区| 久热一区二区| AV不卡在线| 婷婷爱五月| 最新av在线| 国产精选视频| 成人无遮挡毛片免费看| 亚卅熟女乱色| 99热aaa| 国产精品乱码久久久久久久久| 精品人成视频在线观看| 艹少妇网站| 亚洲日韩肥臀视频在线观看| 精品久久9| 麻豆久久精品亚洲精品88| 青娱乐国产盛宴视频| 天天干天天操天天拍| 欧美色色人| 操逼操2| 最近的最新的中文字幕视频| 日日干日日操五月天伦理视频| 色婷婷A V一二三四区麻豆综合| 日本熟妇浓毛hdsex| 中文字幕亚洲在线一区| 99www.bibizy香蕉资源国产一区二区三区高清 | 久久社区一区二区三区| 日本人体九九九九九九| 欧美色图小说综合| 眼镜人妻101.com| 99少妇精品视频| 亚洲成人AB| 草草影院最新网址| 久久久工口| 中文字幕成人乱码熟女精品国50| 3028国产精品| 久久中文色图| 又大又大又大又粗爽高潮观看| 国产a级午夜毛片| 色网在线| 国产又猛又粗又爽又黄| 久久久久久亚洲精品不卡人乳| 热久久无毒不卡| 北约熟女超碰| 中文字日本乱码| 中文字幕一区二区视频在线观看 | 97日韩欧美亚洲| 成人三一级一片aaa| 五月天色电影| 九九热男人天堂| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 亚洲精品性爱片| 亚洲国产一区二区三区在线| juliaann欧美丝袜办公室| 国产呦精品一区二区三区下载| 久草男人天堂| 老司机天天操| 大香网伊人久久综合网eew| AAAA欧美日韩| 久久久久久大| 国产中出内射一区二区| 天美av在线观看| 一区二区高清视频| 蜜桃成人1区2区3区| 凌辱美少妇久久aV| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 久久av成人无码免费| 日韩欧美偷拍美女视频| 777琪琪午夜免费A片| 久久精品视频在线观看| 亚洲成人在线高清| 久插综合| 中国一级操逼视频| 超碰久久精品| 亚洲欧美日韩精品久久久一区二区 | 天天日美女的B| 日韩人妻中文视频| 91成人亚洲色图| 婷婷视频网| 亚洲毛片基地专区| 久久的网站啊啊啊啊啊| 韩三级a视频在线观看| 97精品综合久久网| 国产第25页在线观看| 四季av一区二区凹凸精品小说| 九色婷婷| 嗯嗯啊啊操我| 好看的91视频| 亚欧日韩成人| 天天综合91入口| 一品道视频一区二区三区| 日韩兔费看黄片| 狠插 制服 自拍| 国产69精品久久久久99尤物| 亚州五月| 亚洲国产一区二区三区在线| 人人做天天爱| 免费精品AB| 欧美不卡在线美女| 三级激情网站| 熟女久久| 怡红院怡春院| 国产精品无码论坛| 一区二区不卡视| 91l欧美在线| 五月丁香六月婷综合成人综合| 黑人猛交| 日本精品九九九| 熟妇熟女视频一区二区三区| 亚洲成人在线高清| 久肏视频字幕| 国产久久日韩网站导航| 凸凹视频在线观看| 久久婷婷电影网| 久久亚洲天堂| 综精品久久久aaaa| 一级性爱aaaa| 超碰免费人妻人人| 东京男人天堂| 九九九九九九成人| 婷婷五月成人| 亚洲成人av电影在线| 欧成人精品H无码| 日本欧美m v精品网站加| 久7色| 韩国一级做A片免费的| 明星性猛交ⅹxxx乱大交| 精品少妇人妻一区二区三区| 色婷婷成人综合| 九九综合色| 亚洲AV无码AV吞精久久久久| 亚洲美女AV无码| 国产后入式在线观看| 天天澡天天爽日日av| 欧美黑人猛交春色影视大全| 亚洲最新a在线观看| 亚洲另类欧美精品| 老鸭窝成人免费毛片视频| 国产精品3| 熟女欧美日韩综合婷婷| 亚洲欧洲小说图片视频 | 国产99热| 欧美十八禁网站| 久久久国产av美女私房| 国产97亚洲| AV中文字幕三四五| 韩日自拍| 加勒比AV天堂| 日韩激情视频| 欧美最婬乱婬爆婬性视频| 国产精品色| 97人人干人人操| 亚州AV无码国产精品| 欧美一级A片不卡视频。| 涩综合导航| 91天天| 91亚洲网| 亚洲天堂男人的天堂| 性高潮久久久久久久久久久| 久久骚| 97热视频在线观看| 国产精品久久久九九九| 国产美女激情| 夜夜综合| 亚洲色悠悠久久88| 日韩电影天堂视频一区二区| 国产一级久久久| wwe 天天干.com| 黄色视频特级毛片| 欧美极品女人的天堂| 国产又色又爽又舒服的三级视频| 久草免费福利在线播放| 天天日天天搞天天干| 久久成人国产精品| 13小男生GAY自慰脱裤子| 国产精品视频内谢女人| 乱伦强奸区日韩| 呦呦影院| 日本一区视频在线观看| 美国一区二区三区视频| 日韩美女操b| 免费在线观看国内色片网站网址| 国产熟女乱论| 欧美黄片视频在线观看免费 | 九九热免费国产视频婷婷伊人| 欧美第一页性| 中文有码第五页| 色www精品视频在线观看|