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

ARTICLE DETAIL

資訊詳情

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

SpringCloud微服務(wù)在線教育系統(tǒng)實(shí)戰(zhàn):從單體拆分到部署避坑

SpringCloud微服務(wù)在線教育系統(tǒng)實(shí)戰(zhàn):從單體拆分到部署避坑 簡(jiǎn)介一套基于SpringCloud微服務(wù)架構(gòu)的在線教育系統(tǒng)完整項(xiàng)目面向Java初中級(jí)開(kāi)發(fā)者、畢業(yè)設(shè)計(jì)選題學(xué)生及需要微服務(wù)實(shí)戰(zhàn)經(jīng)驗(yàn)的程序員。系統(tǒng)分為前臺(tái)用戶網(wǎng)站和后臺(tái)運(yùn)營(yíng)平臺(tái)兩部分前臺(tái)包含課程、問(wèn)答、文章三大核心模塊后端采用SpringBoot、SpringCloud、MyBatis-Plus、MySQL、Docker等主流技術(shù)前端基于Node.js和Vue.js構(gòu)建并整合Redis、ActiveMQ、阿里云OSS與視頻點(diǎn)播同時(shí)使用ECharts實(shí)現(xiàn)圖表展示POI完成用戶批量上傳注冊(cè)JWT實(shí)現(xiàn)分布式單點(diǎn)登錄。壓縮包大小約198KB內(nèi)容以項(xiàng)目源碼、數(shù)據(jù)庫(kù)腳本與說(shuō)明文檔為主可幫助讀者快速理解前后端分離的微服務(wù)項(xiàng)目結(jié)構(gòu)。目前已有1154人學(xué)習(xí)下載適合參考其架構(gòu)設(shè)計(jì)、接口文檔生成及分布式組件集成方式用于個(gè)人項(xiàng)目練手或畢業(yè)設(shè)計(jì)二次開(kāi)發(fā)。1. 從單體撐不住到 online_edu 微服務(wù)改造這個(gè)在線教育系統(tǒng)到底在解決什么在線教育系統(tǒng) online_edu 的典型痛點(diǎn)不在“寫(xiě)接口”而在“拆模塊”。前臺(tái)用戶要刷課程、發(fā)問(wèn)答、看文章后臺(tái)運(yùn)營(yíng)要傳視頻、導(dǎo)報(bào)表、盯數(shù)據(jù)面板如果全部揉在一個(gè) SpringBoot 單體里熱部署慢、并發(fā)扛不住、運(yùn)營(yíng)活動(dòng)一上線就得整個(gè)重啟。所以這類系統(tǒng)最常見(jiàn)的落地方案是SpringBoot SpringCloud 做微服務(wù)底座MyBatis-Plus 做數(shù)據(jù)訪問(wèn)Vue.js 做前后端分離MySQL 存業(yè)務(wù)數(shù)據(jù)Redis 扛熱點(diǎn)ActiveMQ 解耦異步任務(wù)OSS 和視頻點(diǎn)播管文件ECharts 出圖表POI 導(dǎo) Excel。這套技術(shù)組合在 2026 年的今天依然是中小團(tuán)隊(duì)搭建在線教育平臺(tái)的主流選型因?yàn)槊恳粚佣加谐墒焐鷳B(tài)招人容易、排錯(cuò)資料多、踩坑成本低。這篇文章適合兩類人一是正在做畢業(yè)設(shè)計(jì)或課程設(shè)計(jì)、需要從零跑通一個(gè)完整微服務(wù)項(xiàng)目的學(xué)生二是公司要自建在線教育平臺(tái)、想用現(xiàn)成方案避免從頭造輪子的后端開(kāi)發(fā)。我會(huì)按“怎么拆服務(wù)、怎么寫(xiě)業(yè)務(wù)、怎么部署、怎么避坑”的順序把這套系統(tǒng)從骨架到上線講透。先說(shuō)明一點(diǎn)微服務(wù)不是越拆越好online_edu 這種體量拆 3 到 4 個(gè)核心服務(wù)就夠拆多了反而被分布式事務(wù)拖死。2. SpringCloud 微服務(wù)骨架搭建從 Maven 多模塊到 Nacos 注冊(cè)中心2.1 服務(wù)拆分的判斷標(biāo)準(zhǔn)online_edu 為什么拆成這四個(gè)服務(wù)很多初學(xué)者拿到“微服務(wù)架構(gòu)”這個(gè)要求就慌不知道拆幾個(gè)服務(wù)、按什么拆。我的經(jīng)驗(yàn)是按“獨(dú)立部署 獨(dú)立數(shù)據(jù)域 獨(dú)立伸縮”三個(gè)標(biāo)準(zhǔn)來(lái)判斷。online_edu 的前臺(tái)系統(tǒng)包含課程、問(wèn)答、文章三大部分這三塊業(yè)務(wù)的數(shù)據(jù)表互不重疊、訪問(wèn)頻率差異大——課程是高頻讀問(wèn)答是寫(xiě)多讀少文章是內(nèi)容管理為主。把它們拆成三個(gè)服務(wù)再加上一個(gè)管文件上傳、視頻點(diǎn)播和后臺(tái)報(bào)表的后臺(tái)服務(wù)正好四個(gè)不多不少。拆服務(wù)的時(shí)候有一個(gè)常見(jiàn)誤用把“微服務(wù)”理解成“每個(gè) Controller 一個(gè)服務(wù)”結(jié)果一個(gè)查詢要跨五次 HTTP 調(diào)用延遲直接爆炸。我一般會(huì)這樣判斷——如果兩個(gè)功能要頻繁聯(lián)查同幾張表它們就應(yīng)該在同一個(gè)服務(wù)里如果只是偶爾通過(guò) ID 互相引一下才值得拆開(kāi)。課程服務(wù)要查講師信息和視頻播放地址這些表天然在一塊硬拆反而不是微服務(wù)是給自己上刑。服務(wù)拆完每個(gè)服務(wù)獨(dú)立一個(gè)數(shù)據(jù)庫(kù)至少做到邏輯隔離。online_edu 這種規(guī)模不需要分庫(kù)分表但四個(gè)數(shù)據(jù)庫(kù)是底線。MySQL 5.7 和 8.0 都能跑建議直接上 8.05.7 的官方支持已經(jīng)走到盡頭新項(xiàng)目沒(méi)必要為難自己。2.2 用 Maven 多模塊搭建項(xiàng)目骨架父 POM 鎖定依賴版本微服務(wù)項(xiàng)目第一步是建 Maven 多模塊工程。父 POM 管依賴版本子模塊管具體實(shí)現(xiàn)。這一步的坑主要在版本兼容SpringBoot 和 SpringCloud 的版本號(hào)不是隨便配的SpringCloud 的每個(gè)大版本對(duì)應(yīng)一個(gè) SpringBoot 版本配錯(cuò)了啟動(dòng)直接報(bào) NoSuchMethodError而且是啟動(dòng)到一半才爆查起來(lái)非常惡心。我一般用 SpringBoot 2.6.x 配 SpringCloud 2021.x這套組合在 2026 年依然大量運(yùn)行在生產(chǎn)環(huán)境資料最多、坑基本都被踩平了。SpringBoot 3.x 配 SpringCloud 2022 當(dāng)然更好但對(duì) MyBatis-Plus 和 ActiveMQ 的兼容性要求更高學(xué)生項(xiàng)目和老系統(tǒng)升級(jí)沒(méi)必要賭這個(gè)。!-- 父 POM 關(guān)鍵配置片段 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.6.13/version relativePath/ /parent properties spring-cloud.version2021.0.5/spring-cloud.version mybatis-plus.version3.5.3.1/mybatis-plus.version mysql.version8.0.33/mysql.version /properties dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version${spring-cloud.version}/version typepom/type scopeimport/scope /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version${mybatis-plus.version}/version /dependency /dependencies /dependencyManagement這段配置的邏輯是SpringBoot 父 POM 統(tǒng)一管理 Spring 全家桶的版本SpringCloud 的 dependencyManagement 統(tǒng)一管微服務(wù)組件Nacos、Gateway、OpenFeign 等的版本MyBatis-Plus 和 MySQL 驅(qū)動(dòng)單獨(dú)鎖版本。這樣每個(gè)子模塊只需要聲明用到了什么不需要寫(xiě)版本號(hào)避免子模塊之間依賴版本漂移。注意 SpringCloud 的版本號(hào)是倫敦地鐵站名命名的2021.0.x 對(duì)應(yīng) Jubilee不要寫(xiě)錯(cuò)。2.3 Nacos 注冊(cè)中心與 Gateway 網(wǎng)關(guān)配置服務(wù)發(fā)現(xiàn)是微服務(wù)的地基服務(wù)拆完之后服務(wù)之間要互相找到對(duì)方這就需要注冊(cè)中心。Nacos 是當(dāng)前 SpringCloud 生態(tài)里用得最多的注冊(cè)中心比 Eureka 多了配置中心功能而且控制臺(tái)是中文的排查問(wèn)題方便很多。online_edu 的四個(gè)服務(wù)全部注冊(cè)到 Nacos前臺(tái)請(qǐng)求統(tǒng)一走 Gateway 網(wǎng)關(guān)轉(zhuǎn)發(fā)不直接調(diào)服務(wù)地址。# 每個(gè)微服務(wù)模塊的 application.yml 關(guān)鍵配置 server: port: 8101 # 不同服務(wù)用不同端口 spring: application: name: service-course # 服務(wù)名網(wǎng)關(guān)和 Feign 都靠這個(gè)名字路由 cloud: nacos: discovery: server-addr: 192.168.1.10:8848 namespace: online-edu-dev # 區(qū)分環(huán)境用dev/prod 隔離# Gateway 網(wǎng)關(guān)模塊路由配置 spring: cloud: gateway: routes: - id: course-route uri: lb://service-course predicates: - Path/api/course/** - id: qa-route uri: lb://service-qa predicates: - Path/api/qa/**注冊(cè)中心這一段邏輯是服務(wù)啟動(dòng)時(shí)向 Nacos 上報(bào)自己的 IP 和端口網(wǎng)關(guān)從 Nacos 拉取服務(wù)列表根據(jù)請(qǐng)求路徑的前綴把請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)服務(wù)。lb://前綴表示走負(fù)載均衡Gateway 會(huì)輪詢分發(fā)到服務(wù)實(shí)例。我在配置里加了namespace字段開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境用同一個(gè) Nacos 但不同命名空間防止聯(lián)調(diào)的時(shí)候服務(wù)串了。這里有個(gè)參數(shù)值得注意spring.application.name是微服務(wù)里的“身份證”所有注冊(cè)、發(fā)現(xiàn)、配置管理都靠這個(gè)名字。如果你把服務(wù)名寫(xiě)錯(cuò)了Nacos 控制臺(tái)里能看到服務(wù)但網(wǎng)關(guān)路由永遠(yuǎn)轉(zhuǎn)發(fā)不過(guò)去日志里只會(huì)報(bào) 503非常隱蔽。3. 前臺(tái)用戶系統(tǒng)落地課程、問(wèn)答、文章三大模塊的代碼實(shí)現(xiàn)3.1 課程模塊MyBatis-Plus 分頁(yè)查詢與視頻點(diǎn)播的配合課程模塊是 online_edu 的前臺(tái)核心用戶需要按分類瀏覽課程、搜索課程、查看課程詳情、播放視頻。數(shù)據(jù)庫(kù)設(shè)計(jì)上課程表、課程分類表、講師表、課程視頻表四張表就夠了不需要過(guò)度設(shè)計(jì)。課程列表頁(yè)的典型接口是分頁(yè)查詢這里直接用 MyBatis-Plus 的 Page 對(duì)象避免手寫(xiě) LIMIT 分頁(yè)的邊界判斷。MyBatis-Plus 的 BaseMapper 已經(jīng)封裝了大部分單表 CRUD寫(xiě)代碼的核心就變成“怎么組合條件”。// 課程分頁(yè)查詢接口實(shí)現(xiàn) Service public class CourseServiceImpl implements CourseService { Autowired private CourseMapper courseMapper; Override public PageCourse pageCourses(Integer current, Integer size, CourseQueryDTO query) { // 1. 創(chuàng)建分頁(yè)對(duì)象current 從 1 開(kāi)始 PageCourse page new Page(current, size); // 2. 構(gòu)建查詢條件LambdaQueryWrapper 避免硬編碼列名 LambdaQueryWrapperCourse wrapper Wrappers.lambdaQuery(); wrapper.like(StringUtils.hasText(query.getTitle()), Course::getTitle, query.getTitle()) .eq(query.getCategoryId() ! null, Course::getCategoryId, query.getCategoryId()) .eq(Course::getStatus, 1) // 只查上架的課程 .orderByDesc(Course::getPublishTime); // 3. 執(zhí)行分頁(yè)查詢MyBatis-Plus 會(huì)自動(dòng)生成 COUNT 查詢 return courseMapper.selectPage(page, wrapper); } }這段代碼的關(guān)鍵邏輯是LambdaQueryWrapper它用方法引用的方式指定列名編譯期就能發(fā)現(xiàn)字段名拼寫(xiě)錯(cuò)誤不用等運(yùn)行期報(bào) SQL 異常。like和eq第一個(gè)參數(shù)是布爾條件為 true 才拼接這個(gè)條件這樣查詢參數(shù)為空的時(shí)候不會(huì)生成多余 WHERE 子句。selectPage會(huì)自動(dòng)執(zhí)行一條 COUNT 查詢和一條分頁(yè)查詢返回的 Page 對(duì)象里帶總條數(shù)和頁(yè)數(shù)前端直接拿來(lái)渲染分頁(yè)組件。課程詳情頁(yè)要展示視頻播放地址這就涉及阿里云視頻點(diǎn)播的接入。常見(jiàn)做法是后端調(diào)用視頻點(diǎn)播的接口獲取播放憑證PlayAuth返回給前端前端配合視頻播放器 SDK 播放。播放憑證有過(guò)期時(shí)間一般是 100 秒所以不能緩存必須每次進(jìn)入播放頁(yè)時(shí)實(shí)時(shí)獲取。這里有個(gè)小坑憑證獲取接口要加防盜鏈配置否則播放地址泄露出去別人可以直接扒流。3.2 問(wèn)答模塊Redis 緩存熱點(diǎn)問(wèn)題與 ActiveMQ 異步通知問(wèn)答模塊的業(yè)務(wù)特征是用戶提問(wèn)、其他用戶回答、提問(wèn)者采納答案。這個(gè)模塊的并發(fā)模型和課程模塊不一樣——一個(gè)熱門(mén)問(wèn)題可能在短時(shí)間內(nèi)被大量瀏覽但回答數(shù)遠(yuǎn)小于瀏覽數(shù)。所以問(wèn)答模塊的緩存策略是題目詳情頁(yè)用 Redis 緩存回答列表也緩存用戶提交新回答時(shí)先更新數(shù)據(jù)庫(kù)再刪除緩存等下次查詢時(shí)重建。這里我用的是“先更新數(shù)據(jù)庫(kù)再刪除緩存”的模式而不是“先刪緩存再更新數(shù)據(jù)庫(kù)”。原因很簡(jiǎn)單先刪緩存的話更新數(shù)據(jù)庫(kù)那段時(shí)間內(nèi)來(lái)了請(qǐng)求緩存沒(méi)有會(huì)直接去打數(shù)據(jù)庫(kù)如果請(qǐng)求量大的話數(shù)據(jù)庫(kù)瞬間被壓垮這就是緩存擊穿。先更新庫(kù)再刪緩存雖然極端條件下會(huì)有幾百毫秒的臟讀但對(duì)問(wèn)答場(chǎng)景完全可接受。// 回答問(wèn)題的異步處理邏輯 Service public class AnswerServiceImpl implements AnswerService { Autowired private StringRedisTemplate redisTemplate; Autowired private JmsTemplate jmsTemplate; Override public void submitAnswer(Answer answer) { // 1. 保存回答到數(shù)據(jù)庫(kù) answerMapper.insert(answer); // 2. 刪除問(wèn)題詳情的緩存下次查詢時(shí)自動(dòng)重建 redisTemplate.delete(qa:question:detail: answer.getQuestionId()); // 3. 發(fā)送異步消息通知提問(wèn)者 jmsTemplate.convertAndSend(edu.qa.answer, JSON.toJSONString(answer)); } }ActiveMQ 在這里的作用是解耦把“新回答通知”這個(gè)非關(guān)鍵路徑剝離出去。如果不用消息隊(duì)列用戶提交回答后要同步調(diào)郵件或短信服務(wù)一旦短信服務(wù)掛了回答就提交失敗。用 ActiveMQ 之后回答只要存進(jìn)庫(kù)里就算成功通知失敗可以重試互不影響。上面代碼里convertAndSend是 JmsTemplate 最簡(jiǎn)單的用法消息體直接傳 JSON 字符串消費(fèi)者那邊用JmsListener注解接消息就行。Redis 緩存這里還有一層設(shè)計(jì)熱門(mén)的瀏覽計(jì)數(shù)也不直接寫(xiě)數(shù)據(jù)庫(kù)而是先寫(xiě) Redis再定時(shí)批量同步到 MySQL。不然用戶每打開(kāi)一次問(wèn)題詳情頁(yè)就 UPDATE 一次數(shù)據(jù)庫(kù)問(wèn)答這種讀多寫(xiě)少的場(chǎng)景也能把數(shù)據(jù)庫(kù)打滿。3.3 文章模塊富文本編輯與靜態(tài)化方案的取舍文章模塊相對(duì)簡(jiǎn)單核心就是兩類頁(yè)面文章列表和文章詳情。文章詳情如果每次請(qǐng)求都從數(shù)據(jù)庫(kù)查、再用模板渲染數(shù)據(jù)庫(kù)壓力大不說(shuō)響應(yīng)速度也慢。常見(jiàn)做法是文章發(fā)布時(shí)生成靜態(tài) HTML 頁(yè)面存到 OSS 或者本地磁盤(pán)前臺(tái)詳情頁(yè)直接返回靜態(tài)文件。我做過(guò)一個(gè)簡(jiǎn)化版本前端用 Vue.js 的vue-quill-editor做富文本編輯器文章正文以 HTML 片段存進(jìn) MySQL。詳情頁(yè)請(qǐng)求時(shí)后端把 HTML 片段拼進(jìn) Vue 組件里渲染。這個(gè)方案的優(yōu)點(diǎn)是改動(dòng)少、好維護(hù)缺點(diǎn)是首屏加載慢一點(diǎn)但對(duì)文章這種非實(shí)時(shí)性內(nèi)容用戶完全感知不到區(qū)別。// Vue.js 前端文章列表頁(yè)的分頁(yè)邏輯 export default { data() { return { articleList: [], current: 1, size: 10, total: 0 } }, methods: { async fetchArticles() { const res await axios.get(/api/article/list, { params: { current: this.current, size: this.size, category: this.categoryId } }) // 后端返回結(jié)構(gòu): { records: [], total: 100 } this.articleList res.data.records this.total res.data.total } } }這里要說(shuō)一個(gè)很多人忽略的細(xì)節(jié)分頁(yè)接口返回的records是文章列表但列表里不應(yīng)該包含文章正文這個(gè)字段。文章正文可能幾十 KB列表頁(yè)一次性拉 10 篇就是幾百 KB移動(dòng)端網(wǎng)絡(luò)扛不住。正確做法是列表接口只返回 ID、標(biāo)題、摘要、封面圖、發(fā)布時(shí)間詳情頁(yè)再單獨(dú)查正文。這個(gè)字段裁剪邏輯要看 SQL 里 select 了哪些列MyBatis-Plus 里用select(Course::getId, Course::getTitle, ...)指定就好。4. 后臺(tái)運(yùn)營(yíng)平臺(tái)ECharts 看板與 POI 報(bào)表導(dǎo)出的實(shí)現(xiàn)細(xì)節(jié)4.1 運(yùn)營(yíng)后臺(tái)的數(shù)據(jù)面板ECharts 圖表接口怎么設(shè)計(jì)才不卡后臺(tái)運(yùn)營(yíng)平臺(tái)要展示課程銷售趨勢(shì)、用戶增長(zhǎng)曲線、問(wèn)答活躍度這些圖表。ECharts 渲染本身是純前端的事后端的工作是提供聚合好的數(shù)據(jù)接口。最容易犯的錯(cuò)誤是后端直接返回明細(xì)數(shù)據(jù)讓前端去聚合。用戶量大了以后報(bào)表接口一次返回幾萬(wàn)條記錄前端渲染直接卡死而且圖表數(shù)據(jù)不需要那么細(xì)的粒度后端聚合完只返回十幾個(gè)點(diǎn)的坐標(biāo)就夠了。我的做法是后端按時(shí)間粒度聚合。按天、按周、按月給聚合接口前端拿到的是[{date: 2026-01-01, count: 32}, ...]這種結(jié)構(gòu)ECharts 塞進(jìn)去直接渲染。// 后臺(tái)數(shù)據(jù)面板的聚合查詢 RestController RequestMapping(/admin/stats) public class StatsController { Autowired private JdbcTemplate jdbcTemplate; GetMapping(/course-publish-trend) public ListMapString, Object coursePublishTrend( RequestParam String startDate, RequestParam String endDate) { String sql SELECT DATE(publish_time) AS date, COUNT(*) AS count FROM course WHERE publish_time BETWEEN ? AND ? GROUP BY DATE(publish_time) ORDER BY date; return jdbcTemplate.queryForList(sql, startDate, endDate); } }這個(gè)接口的邏輯是MySQL 的 GROUP BY 按天聚合課程上架數(shù)量返回的 Map 列表就是圖表的數(shù)據(jù)源。這里能用 JdbcTemplate 直接寫(xiě) SQL是因?yàn)榫酆喜樵兺嵌啾?JOIN 加復(fù)雜條件用 MyBatis-Plus 的 Wrapper 反而難寫(xiě)。一個(gè)項(xiàng)目里別只用一種數(shù)據(jù)訪問(wèn)方式聚合報(bào)表類和業(yè)務(wù) CRUD 類用不同工具很正常。圖表數(shù)據(jù)接口的響應(yīng)速度一般要求 200ms 以內(nèi)超過(guò)這個(gè)時(shí)間前端就能感知到卡頓。如果聚合查詢超過(guò) 1 秒優(yōu)先加聯(lián)合索引只要 WHERE 條件和 GROUP BY 的字段在同一個(gè)索引里性能通常能提升一個(gè)數(shù)量級(jí)。4.2 POI 實(shí)現(xiàn) Excel 導(dǎo)出百萬(wàn)行數(shù)據(jù)的正確導(dǎo)出姿勢(shì)后臺(tái)運(yùn)營(yíng)平臺(tái)離不開(kāi)導(dǎo)出功能課程清單、學(xué)員信息、問(wèn)答列表都要導(dǎo)成 Excel。POI 是最常用的庫(kù)但很多人只會(huì)用XSSFWorkbook數(shù)據(jù)量一超過(guò)幾萬(wàn)行就內(nèi)存溢出。POI 有 SXSSFWorkbook 專門(mén)處理大文件導(dǎo)出用內(nèi)存和磁盤(pán)交換的方式避免 OOM百萬(wàn)行數(shù)據(jù)毫無(wú)壓力。// POI 導(dǎo)出課程列表數(shù)據(jù)量大時(shí)使用 SXSSFWorkbook public void exportCourses(ListCourse courses, HttpServletResponse response) { // 1. 用 SXSSFWorkbook1000 行刷一次盤(pán)避免內(nèi)存堆積 SXSSFWorkbook workbook new SXSSFWorkbook(1000); Sheet sheet workbook.createSheet(課程列表); // 2. 設(shè)置表頭樣式 CellStyle headerStyle workbook.createCellStyle(); headerStyle.setAlignment(HorizontalAlignment.CENTER); Font headerFont workbook.createFont(); headerFont.setBold(true); headerStyle.setFont(headerFont); // 3. 寫(xiě)表頭 String[] headers {課程ID, 課程名稱, 講師, 價(jià)格, 上架狀態(tài)}; Row headerRow sheet.createRow(0); for (int i 0; i headers.length; i) { Cell cell headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(headerStyle); } // 4. 寫(xiě)數(shù)據(jù)行 int rowIndex 1; for (Course course : courses) { Row row sheet.createRow(rowIndex); row.createCell(0).setCellValue(course.getId()); row.createCell(1).setCellValue(course.getTitle()); row.createCell(2).setCellValue(course.getTeacherName()); row.createCell(3).setCellValue(course.getPrice().doubleValue()); row.createCell(4).setCellValue(course.getStatus() 1 ? 上架 : 下架); } // 5. 寫(xiě)響應(yīng)流 response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); response.setHeader(Content-Disposition, attachment; filenamecourses.xlsx); workbook.write(response.getOutputStream()); workbook.dispose(); // SXSSFWorkbook 用完必須調(diào) dispose 清理臨時(shí)文件 }這段代碼的要點(diǎn)是new SXSSFWorkbook(1000)這行的參數(shù)1000 表示內(nèi)存里最多保留 1000 行超過(guò)的行會(huì)刷到磁盤(pán)臨時(shí)文件。dispose()必須調(diào)用否則臨時(shí)文件會(huì)留在磁盤(pán)上一次導(dǎo)出清不干凈時(shí)間長(zhǎng)了磁盤(pán)被占滿。數(shù)據(jù)量大導(dǎo)出耗時(shí)超過(guò)幾秒時(shí)前端要配合 loading 狀態(tài)不然用戶會(huì)以為界面卡死了。POI 導(dǎo)出還有一個(gè)常見(jiàn)的亂碼坑文件名里的中文如果直接拼在Content-Disposition里瀏覽器會(huì)變成下劃線。需要做 URL 編碼URLEncoder.encode(課程列表.xlsx, UTF-8)這樣 Chrome、Edge、Safari 都不會(huì)亂。4.3 運(yùn)營(yíng)后臺(tái)的權(quán)限處理為什么把權(quán)限判斷放在網(wǎng)關(guān)層后臺(tái)運(yùn)營(yíng)平臺(tái)不允許普通用戶訪問(wèn)管理員和運(yùn)營(yíng)人員要分開(kāi)角色。微服務(wù)架構(gòu)下權(quán)限有網(wǎng)關(guān)層攔截和服務(wù)層校驗(yàn)兩層。網(wǎng)關(guān)層做粗粒度校驗(yàn)判斷請(qǐng)求路徑是否要求登錄、用戶有沒(méi)有這個(gè)角色的訪問(wèn)權(quán)限服務(wù)層做細(xì)粒度校驗(yàn)判斷用戶對(duì)某條數(shù)據(jù)有沒(méi)有操作權(quán)。SpringCloud Gateway 的全局過(guò)濾器可以統(tǒng)一做登錄態(tài)校驗(yàn)和角色判斷這樣四個(gè)服務(wù)不用每個(gè)都寫(xiě)一遍權(quán)限邏輯。token 用 JWT 格式網(wǎng)關(guān)解析出用戶 ID 和角色 ID 后通過(guò) Header 傳給下游服務(wù)。這里有個(gè)坑下游服務(wù)直接信任網(wǎng)關(guān)傳來(lái)的 Header 有安全風(fēng)險(xiǎn)要加一個(gè)內(nèi)部密鑰校驗(yàn)防止服務(wù)端口暴露時(shí)被繞過(guò)網(wǎng)關(guān)直接調(diào)用。5. 避坑與排查online_edu 從開(kāi)發(fā)到部署的 6 個(gè)真實(shí)踩坑記錄5.1 MySQL 連接報(bào)錯(cuò)SSL 連接錯(cuò)誤和時(shí)區(qū)問(wèn)題一起出現(xiàn)現(xiàn)象SpringBoot 項(xiàng)目啟動(dòng)時(shí)控制臺(tái)報(bào)Cannot create PoolableConnectionFactory具體原因里有The server time zone value й? is unrecognized和SSL connection error兩個(gè)問(wèn)題同時(shí)出現(xiàn)。原因MySQL 8.0 默認(rèn)啟用 SSL 連接而且時(shí)區(qū)配置從SYSTEM改成了需要明確指定。JDBC 連接串里既沒(méi)配useSSLfalse也沒(méi)配serverTimezoneAsia/Shanghai導(dǎo)致驅(qū)動(dòng)校驗(yàn)時(shí)區(qū)失敗整個(gè)連接池創(chuàng)建失敗。解決JDBC 連接串改成這樣jdbc:mysql://localhost:3306/online_edu?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue。其中allowPublicKeyRetrievaltrue是 MySQL 8.0 的另一個(gè)坑不配它連接時(shí)可能報(bào)Public Key Retrieval is not allowed。這行參數(shù)建議直接寫(xiě)進(jìn)每個(gè)微服務(wù)的配置文件里不要漏。5.2 Docker 安裝 MySQL 失敗鏡像拉不下來(lái)和容器起不來(lái)現(xiàn)象用 Docker 部署環(huán)境時(shí)docker pull mysql:8.0卡住不動(dòng)或者docker run之后容器秒退docker logs看報(bào)錯(cuò)是權(quán)限不足。原因拉鏡像卡住通常是網(wǎng)絡(luò)問(wèn)題容器秒退則是 MySQL 初始化時(shí)往宿主機(jī)掛載目錄寫(xiě)文件沒(méi)有權(quán)限。很多教程讓你掛載/my/own/datadir:/var/lib/mysql但這個(gè)目錄如果宿主機(jī)上沒(méi)有合適的權(quán)限MySQL 的mysqld進(jìn)程無(wú)法寫(xiě)入數(shù)據(jù)。解決掛載數(shù)據(jù)目錄時(shí)先建目錄再調(diào)整權(quán)限mkdir -p /data/mysql chmod -R 777 /data/mysql。然后啟動(dòng)時(shí)加上--usermysql參數(shù)運(yùn)行命令是docker run -d --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot123 -v /data/mysql:/var/lib/mysql mysql:8.0 --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci。--character-set-serverutf8mb4這個(gè)參數(shù)很重要MySQL 默認(rèn)的latin1編碼存不了中文不配的話建表時(shí)必須每個(gè)表單獨(dú)指定字符集非常麻煩。5.3 微服務(wù)之間調(diào)用超時(shí)HttpClient 連接池耗盡現(xiàn)象商城或問(wèn)答服務(wù)調(diào)用課程服務(wù)時(shí)偶爾報(bào)Connection pool timeout高峰時(shí)段特別頻繁。原因online_edu 的服務(wù)間調(diào)用用了 HttpClient而很多人的 HttpClient 配置是默認(rèn)的。默認(rèn)最大連接數(shù)只有 20而且連接空閑 60 秒后會(huì)被回收。一旦課程服務(wù)響應(yīng)變慢調(diào)用方積壓的請(qǐng)求占滿全部連接后續(xù)請(qǐng)求全部排隊(duì)等連接超時(shí)時(shí)間一到就報(bào)錯(cuò)。解決給 HttpClient 設(shè)置更大的連接池和合理的超時(shí)時(shí)間。PoolingHttpClientConnectionManager的setMaxTotal(200)和setDefaultMaxPerRoute(100)RequestConfig里的connectTimeout(5000)需要 5 秒socketTimeout(10000)是 10 秒。同時(shí)開(kāi)啟evictExpiredConnections()和evictIdleConnections(60, TimeUnit.SECONDS)定期清理空閑連接避免連接池被死連接占滿。5.4 Vue 打包放進(jìn) SpringBoot 之后的刷新 404 問(wèn)題現(xiàn)象前端 Vue.js 項(xiàng)目打包后的 dist 目錄放到 SpringBoot 的static目錄下訪問(wèn)首頁(yè)沒(méi)問(wèn)題但點(diǎn)擊前端路由跳轉(zhuǎn)到/course/1這種路徑后按 F5 刷新就報(bào) 404。原因Vue 是單頁(yè)應(yīng)用路由用的 history 模式刷新時(shí)瀏覽器向服務(wù)器請(qǐng)求/course/1這個(gè)路徑但 SpringBoot 里沒(méi)有對(duì)應(yīng)的靜態(tài)文件后端直接返回 404。開(kāi)發(fā)環(huán)境沒(méi)有這個(gè)問(wèn)題是 vite 或 webpack 的 dev server 做了 history 回退。解決后端加一個(gè)轉(zhuǎn)發(fā)規(guī)則把非接口路徑的請(qǐng)求都轉(zhuǎn)發(fā)到首頁(yè)。寫(xiě)一個(gè)配置類實(shí)現(xiàn)WebMvcConfigurer添加一個(gè) ViewController 把錯(cuò)誤路徑轉(zhuǎn)發(fā)到index.html。但是要注意/api/**和/admin/**這些接口路徑不能轉(zhuǎn)否則請(qǐng)求后端接口會(huì)被錯(cuò)誤地返回 HTML排查起來(lái)更迷惑。5.5 阿里云 OSS 視頻上傳失敗STS 臨時(shí)憑證失效現(xiàn)象后臺(tái)運(yùn)營(yíng)在管理臺(tái)上傳課程視頻時(shí)偶爾上傳到一半報(bào)InvalidAccessKeyId特別是上傳大視頻時(shí)幾乎必現(xiàn)。原因視頻點(diǎn)播和 OSS 的臨時(shí)憑證 STS 默認(rèn)有效期是一個(gè)小時(shí)但視頻上傳不是一次性的前端分片上傳大文件可能超過(guò)憑證有效期。憑證過(guò)期后后續(xù)分片攜帶舊憑證請(qǐng)求 OSS服務(wù)端直接拒絕。解決不要在前端固定一個(gè) STS 憑證上傳所有文件。每次開(kāi)始上傳時(shí)后端重新頒發(fā) STS前端檢測(cè)到上傳失敗時(shí)捕獲InvalidAccessKeyId錯(cuò)誤后重新獲取憑證并重試當(dāng)前分片。同時(shí)在服務(wù)端把 STS 的有效期適當(dāng)延長(zhǎng)比如 3 個(gè)小時(shí)但不要超過(guò) 12 小時(shí)安全性和體驗(yàn)要權(quán)衡。5.6 ActiveMQ 消息堆積消費(fèi)速度跟不上生產(chǎn)速度現(xiàn)象問(wèn)答模塊的異步通知越來(lái)越多ActiveMQ 控制臺(tái)看到某個(gè)隊(duì)列的PendingMessage數(shù)量持續(xù)上漲用戶反饋收不到回答通知。原因消費(fèi)者處理每條消息的邏輯里有調(diào)用遠(yuǎn)程接口的操作比如發(fā)送郵件或短信這個(gè)遠(yuǎn)程操作慢導(dǎo)致消費(fèi)吞吐量遠(yuǎn)低于生產(chǎn)量。解決先看消費(fèi)者日志確認(rèn)是遠(yuǎn)程調(diào)用慢然后改消費(fèi)者邏輯把發(fā)郵件的操作改成先入庫(kù)、再異步批量發(fā)送。同時(shí)給JmsListener配置并發(fā)消費(fèi)者concurrency 5-10讓 5 到 10 個(gè)線程同時(shí)消費(fèi)。這里要提醒一下消息的消費(fèi)冪等性一定要做否則消費(fèi)者重啟時(shí)重復(fù)消費(fèi)用戶會(huì)收到兩條重復(fù)通知。在數(shù)據(jù)庫(kù)里加一個(gè)message_id唯一索引消費(fèi)前先嘗試插入插入沖突說(shuō)明處理過(guò)了直接跳過(guò)。6. 進(jìn)階驗(yàn)證用 Docker Compose 一鍵部署 壓測(cè)確認(rèn)系統(tǒng)能上線項(xiàng)目開(kāi)發(fā)完本地能跑通不等于能上線。我習(xí)慣把所有中間件編排進(jìn) Docker Compose在測(cè)試環(huán)境一鍵拉起然后立刻做一輪簡(jiǎn)單的壓測(cè)確認(rèn)瓶頸不在基礎(chǔ)設(shè)施層。Docker 的部署方案分兩層中間件層用 Docker Compose 管應(yīng)用層用 Dockerfile 打包鏡像。先看中間件編排version: 3.8 services: mysql: image: mysql:8.0 container_name: edu-mysql environment: MYSQL_ROOT_PASSWORD: root123 TZ: Asia/Shanghai ports: - 3306:3306 volumes: - /data/mysql:/var/lib/mysql command: --character-set-serverutf8mb4 redis: image: redis:7.0 container_name: edu-redis ports: - 6379:6379 command: redis-server --appendonly yes activemq: image: rmohr/activemq:5.15.9 container_name: edu-activemq ports: - 61616:61616 - 8161:8161中間件的參數(shù)說(shuō)明TZ: Asia/Shanghai同時(shí)設(shè)置了容器的時(shí)區(qū)和 MySQL 的時(shí)區(qū)解決 5.1 提到的 serverTimezone 報(bào)錯(cuò)Redis 加了appendonly yes開(kāi)啟持久化避免容器重啟后緩存數(shù)據(jù)全部丟失ActiveMQ 映射了 61616服務(wù)端口和 8161控制臺(tái)端口控制臺(tái)可以用來(lái)排查消息堆積。應(yīng)用服務(wù)編排進(jìn)同一個(gè) Compose 文件里用 depends_on 指定依賴順序。網(wǎng)關(guān)服務(wù)對(duì)外暴露 8080其余服務(wù)只暴露給內(nèi)部容器網(wǎng)絡(luò)不映射宿主機(jī)端口這樣外部只能走網(wǎng)關(guān)服務(wù)端口不會(huì)被直接打穿。部署之后驗(yàn)證系統(tǒng)能不能扛住基本流量我用一個(gè)很簡(jiǎn)單的方法用ab壓測(cè)網(wǎng)關(guān)接口看吞吐量和錯(cuò)誤率。# 壓測(cè)課程列表接口模擬 200 個(gè)并發(fā)每個(gè)并發(fā)發(fā) 1000 個(gè)請(qǐng)求 ab -n 200000 -c 200 -k \ -H token: your-test-token \ http://localhost:8080/api/course/list # 壓測(cè)結(jié)果重點(diǎn)看這 3 個(gè)指標(biāo) # Time per request: 平均每個(gè)請(qǐng)求耗時(shí)應(yīng)小于 200ms # Failed requests: 應(yīng)接近 0 # Requests per second: 吞吐量單機(jī)網(wǎng)關(guān)應(yīng)超過(guò) 500壓測(cè)結(jié)果如果 Failed requests 不為零先用dmesg看是不是端口隊(duì)列滿了再逐個(gè)排查是 MySQL 慢查詢還是 Redis 連接數(shù)不夠。我的經(jīng)驗(yàn)是online_edu 這種體量的系統(tǒng)先確認(rèn)基礎(chǔ)設(shè)施沒(méi)選錯(cuò)型號(hào)再談業(yè)務(wù)優(yōu)化。做 docker compose 部署和壓測(cè)這件事我吃了不少虧。以前圖省事本地直接把服務(wù)跑起來(lái)就給測(cè)試看結(jié)果每次環(huán)境不一致要么 MySQL 配置不一樣要么 Redis 版本不同測(cè)試報(bào) bug 我本地又復(fù)現(xiàn)不了最后發(fā)現(xiàn)是環(huán)境差異。用 Docker Compose 之后整個(gè)團(tuán)隊(duì)的環(huán)境完全一致這個(gè)“在我電腦上能跑”的玄學(xué)問(wèn)題算是徹底根治了。最后的習(xí)慣是每次改完代碼先跑一遍壓測(cè)接口確認(rèn)響應(yīng)時(shí)間沒(méi)有明顯劣化再提交合并。壓測(cè)腳本放在項(xiàng)目的script目錄下隨手就能執(zhí)行不用臨時(shí)敲命令。希望這些步驟和踩坑記錄能幫你少走一段彎路把 online_edu 從本機(jī)跑通做到真正敢上線。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91婷婷| 欧美第二页午夜| 易易A毛视频| 97香焦色区| 9国产超碰| 久久久96精品| 97色色色综合网站| 婷婷伊人綜合中文字幕| 最近2019中文字幕国语免费版| 干妹子| 啊啊啊啊视频免费| 巨爆乳肉感一区二区三区竹菊影视 | 亚洲欧美在线综合| 在线只有精品| 亚洲操逼无码| 欧美精品成人在线播放| 97在线观看免费视频| 欧美精品 - 91爱爱| 国产97视频免费观看| 男人的天堂在线有码| 91精片| 亚洲综合校园春色| 目产99999久久999| 67194无码不卡| 爱媛媛久久国产福利| 91色综合| 免费视频在线一区二区不卡| 一二三区操逼国产91| 夜夜免费视频| 国产久久久久影院老熟女| 骚乳在线| 久久久久久久久久久久久久久性生活视频 | 精品国产AV一区天美传媒| 日韩视频小说在线观看| 麻豆性爱视频在线播放| 中文字幕日产av人| 久久偷拍人| 久久婷婷国产一区二区色| 日本视频在线观看污污污| 欧美激情性久久久久久| 国产福利视频精品视频| 日B操| 久9re热视频这里只有精品| 欧美日韩中文视频播放| 夜夜黄| 99精品丰满人妻无| 96一区二区三区| 中文字幕国产精品1区| 精品国产久热在线观看| 亚洲综合精品国产一区| 国产女人成人精品视频| 92人人操人人| 色婷婷九月| 国产大学生高潮在线播放| 国产情侣自拍在线播放| 99免费视频| 99在线免费视频| 人妻天堂综合网| 日本高清_区二区三区| 色哟哟综合| 午夜AV人气不卡| 手机午夜电影神马久久| 狠狠色噜噜狠狠狠狠狠色综合久久 | 熟女色图在线| 亚洲黄a三级三级三级看三级| 91丝袜在线视频| 欧美天堂第二区| 丰满欧美放荡少妇在线| 草草草视频| 91亚洲人| www.yeyecao| 欧美日本一区二区a人| 99热这里只有精品地址| 五月天社区| 欧美一二三区四五区| 啊啊啊97视频| 色偷偷超碰亚洲| 日本二三四区| 黄色片一区二区三区四区五区| 精品偷拍13p欧美dodk视频| 天天做日日爱夜夜爽| 一级啊性爱在线视频| 涩五月婷婷| 天堂av2019| 黑人精品久久97| 九九九九一区| 精品视频在线观看| 日韩国产乱子伦App| 中文字幕在线24| 久久婷婷在线观看视频| 偷拍欧美亚洲| 亚欧美天堂在线| 久久久久久91香蕉国产| 欧美一区二区男人天堂| 97这里都是精品| 免费97视频| 超碰欧美97| 国产不良强奸视频免费看| 3p国产色噜噜一区| 97精品97久久| 夜夜爽夜夜爽| 国产区性爱在线视频秋霞豆| av大香蕉网站| 激情小说亚洲| 操屄不卡视频| yy少妇精品久久| 国产精品播放| 人妻中文在线| 蜜桃视频啊啊啊啊| 操我无码| 欧美久久人妻少妇一区二区| 日韩欧美日韩| 亚洲中文字幕妇伦久久| 蜜臀久久久99久久久久| 色色婷| 91视频成人福利网站在线一区| 97久操| 爱爱啊啊啊| 日韩av不卡在线观看| 激情欧美日韩女同久久| 国产精品99精品视频网站| 老熟女综合网| 人妻aa| AV老汉| av网站免费线看| 91呆哥人妻| 欧美黑人猛交春色影视大全| 加勒比综合a∨| 国产日韩手机视频在线| 男人的天堂日韩| 最新三级网址| 超碰是碰在线观看| 欧美丝袜制服久久| 亚欧美综合| 综合欧美日韩在线观看| 精品人妻一区二区三区蜜桃视频| 久精品无码av一区二免费国产在线观看 | 久热免费视频| 97在线观看免费视频| 国产99 中文字幕日韩小视频| 色五月AV在线| 日本午夜久久电影| 在线不欧美| 大稥蕉免费视频这里只有精品| 欧美日韩色| 中文字幕在线观看视频www| 香蕉精品二区二区| 亚洲 欧美 中文 日韩超碰| 亚洲欧美日韩不卡人妻| 女同在线视频一区| 午夜男女爽爽爽影院视频| 欧美黄色图片| 97一区二压| 欧美激情性久久久久久| 久久人妻无码毛片A片麻豆| 久草网站免费在线观看| 91人妻人人澡人人爽人人精品| 蜜臀久久一区二区| 手机在线人成免费视频| 成人国产二区三区在线,男女精品。| 91日韩在线| 999999精品| 超碰天天久久79| 口爆吞精在线观看| 丝袜足交视频| 亚州色站 日韩电影| 在线免费观看日韩一区| 操国产高清| 欧美情色贴图| 夜间福利片1000无码| 高清孕妇孕交 交孕妇| 色一情一乱一乱一区91Av| 精品九九九九| 久久视频少妇美女| 啊啊啊啊嗯嗯嗯用力好爽| 91麻豆天美| 最新中文字幕av| 人人操人人操草草| 蜜臀久久99精品久久久| 熟妇激情| 综合国产影视三级| 91精品国产乱码| 超碰日本97美女人妻人人玩人人爱 | 婷婷五月天激情四射| AV高清一区| 成人AV超碰免费在线| 精品久操| 五月开心久久AV官网| 天天日天天操心| 精品久久久久久中文字幕三区 | 九色婷婷| 日本操逼视频导航| 尹人免费观看视频在线| 色97欧美| 久久亚洲日韩国产欧| 国产精品经典一卡久久久| 日本十八禁免费看污网站| 亚洲色宗合| 色香91| 亚洲、日韩、综合、另类| 国产无码一二三区| 青青草天天亲夜夜操网| 日本视频在线观看污污污| 啊啊啊在线观看| 超碰偷拍| 久久久一区二区| 三级片大波波| 国产精品小视频一区二区三区| 探花一区在线| 欧美 日韩第一性色| 国产极品久久久| 欧美 亚洲 综合 制服| 欧美一级国产一级| 亚洲欧美色图小说| 青青免费在线视频一区| 亚洲av性爱电影| 91亚.色| 国产精品午夜成人福利| 夜夜狠狠躁日日躁色视频| 中文字幕一区二区三区蜜臀| 97色伦欧美| 综合激情五月天| 日韩精品永久在线观看| 久久人人舔人人爽舔人人av片| 综合久久久久久久久91| 以及麻豆国产入口在线观看免费| 欧美日韩性爱电影在线| 91AV入口| 人人 操人人 操人人| 中文字幕美女91| 欧美色999| 天天肏天天干| 嫩草在线视频| av网页一区二区三区| WWW操逼| 秋霞成人一级在线观看| 人妻干天天| 日韩免费簧片| 婷婷视频在线免费观看| 欧美综合区| 人妻熟女午夜精品在线| 女同在线视频一区| 超碰97男人| 啊啊啊不要啊啊受不了了视频在线 | 亚洲各类熟们中文字幕| 国产伦精品一区二区三区在线观 | 综合久久六月久久婷婷| 性爱av在线免费观看| 日本精品第一视频在'| 日韩一级欧美一级在线观看| 综合色图区| 欧美久久九九| 天天综合影院91| 日韩99神马视频片| 一本色道久久综合狠狠操| 久久线上视频免费看| 欧美天天综合网| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 人妻熟女一区二区在线视频| 91亚洲综合在线| 日韩肏逼视频| 欧美一区二区观看在线| 韩国三级理论在线| 激情五月婷| 午夜大香蕉| 欧美天堂日韩三级国产传媒| 久久精品视频一区三区小泽玛利亚| 伊人嫩草| AV一起草在线| 人妻啊啊人妻啊| 啊啊啊啊二区好大| 偷拍盗拍亚洲色图图片| 久久99人妖视频国产| 国产精品色色| 精品9区| 欧美性夜| 国产午夜无码片在线观看影视| 日本天天操| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲精品电影| AV和黑人在线播放| 69超碰综合| 啊啊啊啊好疼视频| 九九九久久久| 九九激情网| 欧美亚洲厕所精品偷拍91| 欧美人妻另类在线| 69av一区二区三区| 99热超碰| 亚洲人妻爽爽爽| 91社操逼| 九九九草| 亚洲日韩成人性爱视频| 超碰这里只有精品| www.久久制服糖| 国产人妻天天干精品| 亚洲日本男人天堂网| 国产精品久久久久久久久久久久久久吹| 国产精品99精品视频网站| 蜜桃成人1区2区3区| 色综九九九一区| 色色香蕉| 天天综合网1| 女生91网站| 人人操人人操人人操人人操人人操人人人11.CM | 蜜桃视频精品一区二区| 大茄子熟女AV导航| 久综合网| 99少妇| 国产在线精品偷| 欧美日韩天堂| 欧亚乱色熟女一区二区| 综合久久99亚洲人妻中文在线| 亚洲区 欧美区| 婷婷色婷婷| 中日韩久久久免费看| 偷拍自拍在线视频观看| 91艹| 国产日韩欧美三级片| 97欧美色综合| 色色色99| 日本孕妇一区二区视频操逼免费看| 久久久久久性爱片| 亚洲国产欧美一区二区潘金莲| 国产第11页| 91在线无码精品秘 软件| 国产又粗又长视频| 素人无码中文字幕| 午夜天堂精品久久久久91| 伊人91| 亚洲淫乱骚妇AV| 自拍偷拍 日韩无码| 蜜臀久久久99久久久久 | 婷婷探花久久精品一区| 97久精品| 亚洲 日韩 丝袜 熟女 变态| 亚洲熟女av中文字幕| 91人妻丝袜无码| 欧美成人A天堂片在线观看| 色欲久久99精品久久| 欧美人妻精品| 国模吧 一区二区三区| a亚洲欧美色欲| 精品一区二区久久| 国产盗摄美女如厕大神作品在线观看| 在线播放中文字幕| 亚洲高清国产理伦片| 97国产人人| 曰韩少妇无码| 亚洲精品色| 国产精品成人无码av| 青青青国产手线观看视频2| 夜夜骑日日| 撸撸成人在线视频| 后入 亚洲 美女 射| 国产剧情AV不卡在线观看| 欧美成人免费在线观看| 日本欧美不卡| 五月天精品| 国产精品suv一区| 久无码| 亚洲激情av| 约操熟妇| 国产AV色黄看到爽| 久久美女国产| 三级精品三级在线观看| 久久久九97| 国产精品无码在线| 亚洲高清无码在线桃色| 日韩美女啪啪一区| 日韩AV无码网站| 啊啊啊好大好深| 在线小说视频一区| 日韩不卡一二三四| 日韩精彩视频| 青青草国产一区二区三区| 综合激情97 | 丁香五月天久久精品视频一区二区三区| 337p大胆噜噜噜噜噜91Av| 欧美大香蕉专区网| 日韩欧美综合激情| 精品少妇人妻av久久免费| 国产成人拍国产亚洲精品| 超碰欧美| 中文字幕久久婷婷丁香五月天| 天天92av| 97在线免费| 亚洲成人激情小说视频| 日本αv| 国产精品一区二区亚洲人成毛片 | 亚州国产精品乱| 婷婷色婷婷| 成片免费播放| 天美麻豆精品视频99| 国产精品天美传媒| 一道本东京热加勒比一区二区三区 | 亚州色图片在线色| 亚洲骚男同com| 熟女熟妇伦久久影院毛片一区二区| 黄久在线| 亚洲av资源| 亚洲日韩国产精品| 中字幕人妻一区二区三区| 国产JDAV无码视频在线观看| 国模不卡| 色综合婷婷| 加勒比大香蕉视频在线| 日韩在线人妻网站| 伊人四虎综合| 91成人无码| 日本性爱视频一级| 中文字幕人妻色偷偷久久皮| 亚洲中文字幕网| 国产在线综合福利网站| 午夜性生活av免费在线看| 狠狠操,使劲操| 亚洲男人久久综合天堂| 琪琪精品免费一区二区三区| 围产精品一区二区三区视频播放| 色5月婷婷| 欧美黑人猛交春色影视大全| 操一区| 91久久久老司机| 超碰97导航| 婷婷午夜清品久久久久久久性色视频观| 高清孕妇孕交 交| 五月天婷婷在线看| 亚洲欧美精品福利在线| 又黄又粗又硬又长又大| 婷婷丁香人妻 | 好爽视频在线观看| 伊人操你| 国产欧美一区激情交| 亚洲 欧美 另类 综合 偷拍| 99re6在线视频播放免费精品| 91亚洲综合| 东京热男人的天堂精品| 熟妇熟女一区二三区| 97 国产精品| 香蕉黄色一级视频| 国产亚洲一黄| 精品女同一区| 免费少妇一区二区| 久久久艹艹艹| 国产白丝网站| 操死我了嗯嗯嗯| 97在线日韩中文字幕| 久久中文字幕一区不卡| 欧插网站| 人妻久久一区二区三区| 92人人操人人| 91性| 91伊人久| 嗯嗯嗯不要不要免费视频| 97精品全部| 亚洲成?V人片在线观看福利| 国模不卡一本二本三电影| 亚洲毛片基地专区| 激情综合五月天| 国产中文字幕在线观看| 成年女人黄网站| 啊啊啊97视频| 日韩极品无码B| 亚洲欧美精品一区天堂久久 | av三级电影在线播放| 亚洲国产一区二区三区四区国产| 神马久久久久久久久久| 激情小说图片亚洲首页| 强奸少妇AV导航网| 人妻一区二区三区四区视频| 中文啪啪视频| 精品免费一区| 人人爽天天爽| 久久精品国产Aⅴ| 性欧美另类高清| 成人性生活高清视频在线播放| 五月丁香啪啪网| 欧美性高潮在线| 激情深爱五月天| 青青青在线高清视频在线一二三四区| 狠狠干婷婷| 极品少妇久久久| 九九热超碰| 欧美啪啪色吧在线| 九九英色视频| 亚洲精品一二区| 超碰免费欧美7| 伊人黄色视频免费观看| 青青草这里只有精品| 综合色欧美| 麻豆60秒| 超碰色男人操熟女| 99热国产| 色精品极品| 成人无遮挡毛片免费看| 天天热精品| 九九久久精品| 亚洲av综合伊人久久| 啊啊啊啊啊啊啊啊啊啊在线观看| 亚洲无码久久久久久久| 熟妇熟女一区二区三区| 蜜臀亚洲中文| 无码乱人伦中文视频| 青草精品视频一日本久久久久网站| 天美麻豆精品视频99| 最新av中文字幕高清| 嗯嗯嗯啊啊啊干死我吧| 好吊妞转入那个网| 黑人狂躁日本妞一区二区三区| 啊啊啊啊,啊啊好多水| 男人亚洲91首页在线| 岛国福利在线精品播放| 精品免费囯产一区二区三区| 91在线丝袜视频| 99九九精品| 伊人操你| 亚洲人久久久久日| 内射卯月麻衣| 亚洲精品色| 日韩精品亚洲专区在线影视| yiqicaoav| 精品少妇一区二区三区| 综合网久久| 99热最新| 看一级特黄a大一片| 少妇熟女一区二区三区| 亚洲色图自拍| 色好看av| 混色激情av| 国产亚州高清国产拍精| 啪啪啪精品| 久久激情婷婷| 九九这里只有精品| 少妇无码av专区线| 综合 亚洲 欧美| 久久综合久色欧美综合狠狠 | 亚洲无线码欧洲精品区别| 久久超碰天天| 91精品少妇搡搡搡| 欧美色图下一页| 日本熟妇熟色97一本在线观看| 国产激情av女片自拍| 久久久精品中文字幕爱豆| 97超碰欧美精品| 无卡一区=区| 色色色色色色色色综合| 超碰午夜在线| 日韩99神马视频播放片在线播放| 涩五月婷婷| 久久东京国产精品视频| 午夜理论片在线观看免费| 小日子操bb在线看| 免费福利视频中文字幕| 日韩无码视频黄色| 日本性感人妻91| 色欲天天综合久久久无码网中文| 97超碰久久| 国产97在线 | 亚洲| 欧综合网| 欧美爱爱97| 日本综合色图| 亚洲欧美日韩中文播放 | 综合久久中文字幕综合日韩精品| 欧美综合区| 国产97色在线| 丁香五月成人| 亚洲欧美激情另类色图| 国产欧美精品日韩区二区麻豆天美| 婷婷色网| 欧亚乱色熟一区二区三四区| 欧美亚综合色图| 欧美熟女激情| 国产乱青青草久久| 91精品操美女| 亚洲丝袜诱惑| A一区片| 天天激情干| 美国一区二区免费视频| 婷婷中文字幕| 青青操97| 超碰久久网| 亚洲色图8| 久久久蜜桃臀无码视频| 久热在线精品免费观看| 亚洲午夜福利视频| 精品久久久无码| 久久夜夜夜夜| 女上位精品在线| 火箭成精品视频884必出精品| 精品一区二区三区国产| 伊人久久大香线蕉无码| 久草五月| 性生活无遮挡纯毛片在线看| 91蜜桃传媒精品久久久一区二区| 97亚洲精品| 国产精品欧美日韩久久| 青青草中文-久久青草精品一区二区三 | 久久久影院| 97碰碰日本乱偷人妻中文的| 一本久久久精品| 性色AV网站| 久久精视频美日韩在线视频| 中文字幕日产av人| 啊啊啊 在线| AAAA欧美日韩| 人妻AV在线| 9久久美女首页| 欧美综合色,www| 亚洲色系另类精品国产| 精品少妇一区二区三区免费观看| 欧美传媒一区| 中文操逼字幕| 久9热| 超碰综合色| 亚洲牲交| 亚洲五月婷婷| 久久噜| 亚洲国产成人精品999| 91精品丝袜久久久久久| 极品色电影院| 熟女这里只有精品6| 99亚洲精品| 久久r精品| 亚洲天堂一区二区久久| 少妇国产不卡| 超碰地址久久| 120分钟婬片免费看| 久久熟女久| 国产传媒午夜理伦精品| 亚洲aw毛茸茸在线| 欧美色宗合| 色婷婷丁香五月| 久久久久久久综合,国产| 一区不卡在线观看av| 伊人久久亚洲中文字幕| 啊啊啊啊网站| 免费夜夜爱黄色视频毛片| 97国产精品在线观看| 国产 亚洲 丝袜 制服| 女生自91网站| 51久久夜色精品国产麻豆| 无码heyzo高清一区| 91美女小视频| 亚洲精品男人的天堂| 亚洲色图欧美色18直播在线| 凹凸视频特色日本特黄| 国产嫩草精品A88AV| 亚洲一区二区精品福利| 久久天堂网| 精品伊人久久久大香线蕉小说| 老熟妇一区二区三区啪啪| 啪啪啪东京| 五十路熟女工口| 欧美精品成人在线播放| 大香蕉综合在线| 污污汅18禁网站在线永久免费观看| 亚洲少妇诱惑| 成 人片 黄色大片| 久久骚| 国产激情av女片自拍| 亚洲不卡一| 婷婷色色网| 清纯唯美亚洲综合| 78久久久| 黑丝自慰喷水网站| 97人人夜| 欧美不卡在线美女| 国产综合在线视频网站| 亚洲欧美在线综合| 9999久久久久| 日本不卡五区| 91天天爱| 婷婷五月天久久久| 日韩无码一级黄色av片| 日韩视频小说在线观看| 爱做久久久久久| 色图综合网| 欧美在线l亚洲| 欧美性爱伊人| 十八禁啪啪视频| 天天看高清麻豆| 免费看久久久性性| 凹凸精品熟女在线观看| 日韩美女高潮喷水视频| 日韩国产中文字幕| 国产一级高清免费观看| 亚洲天堂日本| 920日本午夜免费| av在线播放国产一区| 久久久性少妇| 日本天堂网| 日本岛国黄色网址| 日韩激情电影中文字幕| 精品人妻一区二区蜜桃视频| 精品人妻二区三区| 熟女突然公开看18禁影片 | 欧美三级中文字幕hd| 精品视频在线观看| 久久久久久中文| 人人操天天爽| 九月婷婷久久| 一线黄色免费性爱片| 亚洲天天更新| 青操影院| 欧美 传媒 麻豆 日韩 偷拍| 国产 日韩 欧美 人妻 熟女 中文| 91伊人久| 国产乱子伦一区二区三区在线观看| 久久爱超碰网| 91在线美女| 综合色图区| 3028国产精品| a片 xxxx受爽视频| 78m啪啪啪| 4虎在线视频| 亚洲一二三四区机械| 这里有精品| 爽 好舒服 无码刺激久久| 国产精品ⅴ无码大片在线看.| 丝袜 中出 制服 人妻 美腿 中文字幕| 人人搡人人肉久久精品| 麻豆久久久久久久久丝袜| 色婷婷电影网| av资源在线观看少妇| 日韩精品人妻一| 俄罗斯一区二区视频在线观看| 亚洲精品久久久久久久蜜桃臀| 天天操福利视频综合网站| 天天内射| aaa淫乱视频| 欧美色图偷拍另类| 亚洲射综合网| 国产精品肉丝自拍| 91蜜臀在线久久久久| 亚洲精品一区中文字幕乱码| 人妻中文在线| 久热伊人| 91黑丝在线播放| 丁香色婷婷| 久久婷婷五月天| 丁香六月激情综合| 久99| 人妻久久久久久久久久久久久久久| 91|九色|国产熟女| 五月天精品| 久久黄黄| 国产有码一区| 国精品一区二区三| 亚洲淫乱骚妇AV| 久久婷婷欧美| 超碰97导航| 五月婷网站| 无码精品人妻一区二区三区妖精| 成人麻豆av电影网站| 老司机深夜影院18未满| 国产超碰人人爽人人做| 色五月婷婷色| 亚洲精品一区二区三区新线路| 淫色网综合| 日韩欧美丝袜诱惑| 伊人久久亚洲色欲综合网站 | 亚洲图片第一页| 日本影视久久免费| xxxx网站亚洲精品| 熟女乱伦二区| 久久手机好看网站| 天天插夜夜爽| 又黄又硬又粗又长国产视频| 午夜操一操| 国产精品成人无码a v毛片| 强奸乱伦中文字幕AV| 综合婷婷| 精品久久久久黄少妇| 亚洲性猛| 亚洲色人| 一区二区三区免费岛国片| 99热综合| 亚洲揄拍网| 欧美操逼录像国产黄色国产| 国产美女在线精品免费看| 色色色欧美| 亚洲 欧美都市激情| 九九热精彩视频| 中文字幕在线免费观看 | 嗯嗯嗯啊啊在线观看| 91丝袜在线观看| 天天操天天干一区二区| 亚洲精品男人的天堂| 精品无码人妻一区二区免费蜜桃| 97色香蕉| 97精品熟女少妇一区| 夜夜嗨AV一区天天| 欧洲亚洲综合| 国产日韩精品suv| 蜜乳AV色欲AVAV无码| 久草色悠悠在线视频| 风间由美日韩欧美久久| 18禁中文字幕| 亚洲欧洲小说图片视频 | 看日韩美女二区三区免费操逼视频 | 天天综合网~91综合网| 国产传媒av天美传媒在线| 亚洲av影院在线观看| 久久伊人网视频一区二区三区 | 六月丁香婷| 性性久久| 2024黄色视频| 婷婷激情五月| 久久久熟女一区| 国产午夜在线观看视频| 美女尤物福利视频| 国语精品av| 国产三区免费在线观看| 日本精品免费一区二区三区四区| 久草成人| 日本 欧美 亚中文字幕| 黑丝制服中文字幕| 国产亚洲日本精品在线| 欧美大片天天看| 黄片免费视频2019| 亚洲综合码| 欧美91在线| 女优视频第10页| 巨乳特殊服务按摩| 日本午夜久久电影| 日夜尻逼网| 日韩一区二区三区四区五区 | 午夜亚洲WWW湿好大| 又黑又大又粗| 久久久蜜桃臀无码视频| 成人情色一区二区| 96麻豆精品一区二区三区| 亚洲精品视频在线播放| 成人精品久久| 人妻AV在线| 亚洲天堂资源在线| www.夜夜操| 天天爽天天操啊啊啊| 五月婷婷激情网| 久久精品无码专区| 在线黄页看毛片| 神马久久午夜| 欧美美女啪啪视频| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 日韩猛交| 综合夜夜| 蜜伊人色综合97| 人妻干天天| 欧美激情色婷婷花野真衣一区二区| 曰韩操B| 99后入| 麻豆这里只有精品| 国产综合久久久麻桃个| 日本免费不卡二区| 国产最新小视频在线播放下载| 精品一区二区三区四区外站| 无码乱人伦中文视频| 亚洲欧美综合图片| 精品国产乱码久久久久久影片| 国产白丝精品在线观看| 中文字幕人妻色偷偷久久皮| 可以免费观看的日韩av毛片| 久久久久久人| 天堂av2019| 精品成人亚洲午夜电影| 99精品在线| 天美国产精品| 人妻一区视频| 久操国产在线| 97资源欧美| 天天干天天操天天干天天操| 久久久久白虎| 久久少妇视频| 欧美很很操视频| 香蕉欧美| 久草线上视频免费看| 国模一区二区三区| 久久男人精品| 欧美成人精品欧美一级乱黄一区二…| 玖玖爱综合| 操逼逼无码| jizz啪啪| 色九九久九九| 国产肏屁眼视频| 六月婷婷色综合| 黄片免费视频2019| 欧美综合色图片| 青青草精品| 91久久久久久| 欧美精品成人在线播放| 欧州91高潮| 欧美日日人人天天| 91麻豆天美国产| av一区二区三区 中文| 天天干天天燥| 夫妻天天操岛国视频| 精彩久久中文| 97视频在线观看高清资源| 任你艹| 色婷婷激一区二区三区| 家庭乱伦麻豆| 亚洲区 欧美区| 亚州欧美总和| 九九热超碰97亚洲最新香蕉| 五月婷婷综合激情| 激情综合二| 伊人久久大香线综合无码| 亚洲激情综合| 五月天玖玖资源站| 久久青青草原免费视频| 99无码狠狠久久| 怡红院成人视频| 人妻熟女一区二区| 亚州春色| 亚洲射综合网| 人妻天天爽夜夜爽爽| 亚洲操操操| 亚洲最大无码中文字幕网站| 久久精品中文字幕观看| 国产精品久久久久久久电影渣男| 人人妻人人玩人人澡人人爽| 99热精品在线观看| 日日躁狠狠躁天天躁精品| 亚洲性少妇| 91性高| 九九夜精品九九在线| 日韩精品人妻中文字幕有码午| 五月天激情网图片| 激情五月天丁香| 日韩婷婷| 亚洲色婷婷| 色色激情五月天| 婷婷丁香久久| 五月丁香婷婷综合网| 中文字幕jul-617人妻熟女| 中文字幕av乱伦| 国产一级αv免费看片| 天天躁日日躁AAA片李宗瑞| 成年人性爱日韩| 白嫩国模丰满一二三区| 性爱av在线免费观看| 国产日韩欧美三级片| 一级免费啪啪片| 97干在线| 性色一线| 亚洲色图20p| 国产偷仑| 蜜臀亚洲综合一二三四区| 91人妻久久久久久久久久久久久| 97精品在线| 国产一区二区精品久久久不卡蜜臀| 日日骚网站| 后入国产| 97精品一区二区视频| 日本三级A片网站com| 色成人Www精品永久观看| 首页中文字幕中文字幕免费| 色99视频| 又大又黄国产| 中文字幕78| 精彩久久中文| 风韵犹存大大大大香蕉| 亚洲精品久久久久毛片A片拉屎 | 中文子幕一二三| 中出91视频| 神马久久久久久久| 最新av网站在线观看| 日韩AV无码中文一区二区| 日本99久久| 欧美激情视频一区二区三区不卡| 欧美999999| 伊人网在线点播| 永久免费观看的毛片的网站| 国产精品一区av在线| 在线观看日韩av不卡| 99re超碰| 免费?级毛片无码?∨蜜芽试看| 欧美三级中文字幕hd| 欧美性猛交美女自慰91| 免费成人在线熟妇网| 91精品人妻一品二品三品| 欧美gv在线观看| 国产在线精品偷| 国产自产91区13区| 97久久精品不卡| 久久伊人最新网址视频| 97欧美性爱| 香一区二区三区| 人妻无码一区二区三区久久99| 大香蕉综合网| 在线中文字幕极品av| 国产不卡片| 超碰在线日韩一区| 99久久久久久亚洲精品不卡| 婷婷九月色| 久久精品视| 国产综合色精品在线观看| 日本午夜福利影院| a人欧美综合天堂麻豆| 欧美亚洲丝袜人妻制服中文99| 天天操夜夜操狠很操| av中文字幕在线熟女| 久久9精品网站| 黄片qw| 欧美成人9797| 97干在线看| 人妻丝袜肏逼| 成人av性爱电影在线观看| 蜜臀AV秘一区翔田千里| 青娱乐久久艹| 极品五月天噜噜| 日本孕妇孕交| 久久专区| 免费视频a级毛片免费视频| 精品十三区| 国产97视频| 国产精品成人蜜臀AV在线| 人妻一区久久二区三区色播| 成人无码欧美一级A片狼牙直播| 日韩无码操逼片| 97天天爽| 欧美瑟综合| 日韩精品中文字幕一| sss视频华人在线| 日日躁夜夜躁狠狠躁超爽| 精品一区二区人妖| 成人十八禁日韩欧美一二三| 亚洲熟妇一,二,三期| 色综合99| 97人人色| 在线观看AV片| 伊人伊人LD| 国模无码人体一区二区三| 韩日精品四区| 啊啊啊骚| www激情| 一本色道久久综合熟妇| 在线播放一级无码视频| 国产盗摄美女如厕大神作品在线观看| 中文久久久| 一本道综合色图| 国产精品久久久久9999小说| 人妻精品一区二区在线| 丰满人妻一区二区中文| 伊人久久综合精品欧美| 91少妇香蕉久久精品| 欧亚性爱在线视频| 天美传媒AV国产在线| 人妻丰满熟妇一区二区三| 青苹果影院男人的天堂| 极品综合| 欧美伦乱爱| 青娱乐国产精品| 欧美高清在线| av在线资源| 91成人无码| www.欧精品| 欧美性爱18观看| 男人久久精品| 91动漫操逼视频| 啊啊啊啊嗯嗯在线久久久| 一本道综合色图| 色综合加勒比| 久久中文色图| 亚洲日韩美国人妻| 欧美性爱视频免费一区一A| 在线电影亚洲色图| 国产亚洲99久久精品| 亚洲97| 今日头条成人一区二区三区四虎精品| 人妻少妇被猛烈进入中| 国产精品粉嫩福利在线| 免费精品99| 91久久免费视频互動交流| 91 综合 色| 九九热超碰| 色哟哟AⅤ| 欧美性视频二区三区| 亚洲综合五月天| 亚洲乱码精品一区二区| 欧洲自拍色图gif在线| 色婷婷综合网| 一个色导综合| 不卡六六在线91| 精品国产乱码久久久久A| 操逼日批| 天天在线91| 成人影 天天操 亚洲| 亚洲导航深夜福利| 欧美人妻少妇| 香蕉免费一区二区三区不读| 亚洲第一页色| 老司机老司机午夜影院| 风月影院十八禁| 日本不卡一区二区三区| 久草精品热视| 蜜臀操逼黄色视频操的好爽| 日韩亚洲欧美中文字幕| 少好三P| 欧美日韩免费专区在线| 天天草天天干天天日| 人妻精品免费一二三区| av影院十区| 麻豆伊人网| 无码免费一区二区三区啪啪| 26uuu性| 91精品国产91久久青草| 少妇人妻在线| 久久国模av| 大鸡吧尹人在线| 在线啊v一区| 性爱Av免费| 999久久久免费精品国产牛牛| 久久精品国产97欧美精品亚洲 | 殴美综合色88| 20cm女自慰在线日韩欧美| 嗯嗯嗯啊啊啊操的我好爽| 婷婷五月天激情网| 欧美性生活男人的天堂| 高清无码91| 天堂综合| 九九久久国产精品| 欧美不卡在线美女| AV九九| 国产AV毛片| 久久精品福利影院| 男人的天堂va| 老熟女天天操| 国产黑白丝在线| 伊人久久亚洲色欲综合网站 | 免费看污网站| 26uuu欧美| 色99视频| 69精品久久久久中文字幕| 国产精品视频自拍在线| 立川理惠被中出无码| 凹凸精品熟女在线观看| 啊啊啊啊好多水| 嗯嗯不要视频| 性欧美999| 18精品一二区| 最新日韩黄片| 26uuu性物| 国产成人综合在线播放| 精品国产91av一区二区三区| 日韩簧片免费看| 久热影视| 日小BB小视频| 先锋激情∨在线视频播放| A一区片| 一区不卡在线观看av| 国产在线强奸视频| 无码高清国产AV| 精品偷拍13p欧美dodk视频| 91快色色色色色| 97摸视频| 久热91| 精品超碰中文在线| 91女人的网站| 高潮综合网|