欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

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

SpringCloud微服務(wù)在線教育系統(tǒng)實(shí)戰(zhàn):從單體拆分到部署避坑 簡介一套基于SpringCloud微服務(wù)架構(gòu)的在線教育系統(tǒng)完整項(xiàng)目面向Java初中級(jí)開發(fā)者、畢業(yè)設(shè)計(jì)選題學(xué)生及需要微服務(wù)實(shí)戰(zhàn)經(jīng)驗(yàn)的程序員。系統(tǒng)分為前臺(tái)用戶網(wǎng)站和后臺(tái)運(yùn)營平臺(tái)兩部分前臺(tái)包含課程、問答、文章三大核心模塊后端采用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ù)庫腳本與說明文檔為主可幫助讀者快速理解前后端分離的微服務(wù)項(xiàng)目結(jié)構(gòu)。目前已有1154人學(xué)習(xí)下載適合參考其架構(gòu)設(shè)計(jì)、接口文檔生成及分布式組件集成方式用于個(gè)人項(xiàng)目練手或畢業(yè)設(shè)計(jì)二次開發(fā)。1. 從單體撐不住到 online_edu 微服務(wù)改造這個(gè)在線教育系統(tǒng)到底在解決什么在線教育系統(tǒng) online_edu 的典型痛點(diǎn)不在“寫接口”而在“拆模塊”。前臺(tái)用戶要刷課程、發(fā)問答、看文章后臺(tái)運(yùn)營要傳視頻、導(dǎo)報(bào)表、盯數(shù)據(jù)面板如果全部揉在一個(gè) SpringBoot 單體里熱部署慢、并發(fā)扛不住、運(yùn)營活動(dòng)一上線就得整個(gè)重啟。所以這類系統(tǒng)最常見的落地方案是SpringBoot SpringCloud 做微服務(wù)底座MyBatis-Plus 做數(shù)據(jù)訪問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)成方案避免從頭造輪子的后端開發(fā)。我會(huì)按“怎么拆服務(wù)、怎么寫業(yè)務(wù)、怎么部署、怎么避坑”的順序把這套系統(tǒng)從骨架到上線講透。先說明一點(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)來判斷。online_edu 的前臺(tái)系統(tǒng)包含課程、問答、文章三大部分這三塊業(yè)務(wù)的數(shù)據(jù)表互不重疊、訪問頻率差異大——課程是高頻讀問答是寫多讀少文章是內(nèi)容管理為主。把它們拆成三個(gè)服務(wù)再加上一個(gè)管文件上傳、視頻點(diǎn)播和后臺(tái)報(bào)表的后臺(tái)服務(wù)正好四個(gè)不多不少。拆服務(wù)的時(shí)候有一個(gè)常見誤用把“微服務(wù)”理解成“每個(gè) Controller 一個(gè)服務(wù)”結(jié)果一個(gè)查詢要跨五次 HTTP 調(diào)用延遲直接爆炸。我一般會(huì)這樣判斷——如果兩個(gè)功能要頻繁聯(lián)查同幾張表它們就應(yīng)該在同一個(gè)服務(wù)里如果只是偶爾通過 ID 互相引一下才值得拆開。課程服務(wù)要查講師信息和視頻播放地址這些表天然在一塊硬拆反而不是微服務(wù)是給自己上刑。服務(wù)拆完每個(gè)服務(wù)獨(dú)立一個(gè)數(shù)據(jù)庫至少做到邏輯隔離。online_edu 這種規(guī)模不需要分庫分表但四個(gè)數(shù)據(jù)庫是底線。MySQL 5.7 和 8.0 都能跑建議直接上 8.05.7 的官方支持已經(jīng)走到盡頭新項(xiàng)目沒必要為難自己。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)到一半才爆查起來非常惡心。我一般用 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í)沒必要賭這個(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è)子模塊只需要聲明用到了什么不需要寫版本號(hào)避免子模塊之間依賴版本漂移。注意 SpringCloud 的版本號(hào)是倫敦地鐵站名命名的2021.0.x 對(duì)應(yīng) Jubilee不要寫錯(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)是中文的排查問題方便很多。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字段開發(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ù)名寫錯(cuò)了Nacos 控制臺(tái)里能看到服務(wù)但網(wǎng)關(guān)路由永遠(yuǎn)轉(zhuǎn)發(fā)不過去日志里只會(huì)報(bào) 503非常隱蔽。3. 前臺(tái)用戶系統(tǒng)落地課程、問答、文章三大模塊的代碼實(shí)現(xiàn)3.1 課程模塊MyBatis-Plus 分頁查詢與視頻點(diǎn)播的配合課程模塊是 online_edu 的前臺(tái)核心用戶需要按分類瀏覽課程、搜索課程、查看課程詳情、播放視頻。數(shù)據(jù)庫設(shè)計(jì)上課程表、課程分類表、講師表、課程視頻表四張表就夠了不需要過度設(shè)計(jì)。課程列表頁的典型接口是分頁查詢這里直接用 MyBatis-Plus 的 Page 對(duì)象避免手寫 LIMIT 分頁的邊界判斷。MyBatis-Plus 的 BaseMapper 已經(jīng)封裝了大部分單表 CRUD寫代碼的核心就變成“怎么組合條件”。// 課程分頁查詢接口實(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)建分頁對(duì)象current 從 1 開始 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í)行分頁查詢MyBatis-Plus 會(huì)自動(dòng)生成 COUNT 查詢 return courseMapper.selectPage(page, wrapper); } }這段代碼的關(guān)鍵邏輯是LambdaQueryWrapper它用方法引用的方式指定列名編譯期就能發(fā)現(xiàn)字段名拼寫錯(cuò)誤不用等運(yùn)行期報(bào) SQL 異常。like和eq第一個(gè)參數(shù)是布爾條件為 true 才拼接這個(gè)條件這樣查詢參數(shù)為空的時(shí)候不會(huì)生成多余 WHERE 子句。selectPage會(huì)自動(dòng)執(zhí)行一條 COUNT 查詢和一條分頁查詢返回的 Page 對(duì)象里帶總條數(shù)和頁數(shù)前端直接拿來渲染分頁組件。課程詳情頁要展示視頻播放地址這就涉及阿里云視頻點(diǎn)播的接入。常見做法是后端調(diào)用視頻點(diǎn)播的接口獲取播放憑證PlayAuth返回給前端前端配合視頻播放器 SDK 播放。播放憑證有過期時(shí)間一般是 100 秒所以不能緩存必須每次進(jìn)入播放頁時(shí)實(shí)時(shí)獲取。這里有個(gè)小坑憑證獲取接口要加防盜鏈配置否則播放地址泄露出去別人可以直接扒流。3.2 問答模塊Redis 緩存熱點(diǎn)問題與 ActiveMQ 異步通知問答模塊的業(yè)務(wù)特征是用戶提問、其他用戶回答、提問者采納答案。這個(gè)模塊的并發(fā)模型和課程模塊不一樣——一個(gè)熱門問題可能在短時(shí)間內(nèi)被大量瀏覽但回答數(shù)遠(yuǎn)小于瀏覽數(shù)。所以問答模塊的緩存策略是題目詳情頁用 Redis 緩存回答列表也緩存用戶提交新回答時(shí)先更新數(shù)據(jù)庫再刪除緩存等下次查詢時(shí)重建。這里我用的是“先更新數(shù)據(jù)庫再刪除緩存”的模式而不是“先刪緩存再更新數(shù)據(jù)庫”。原因很簡單先刪緩存的話更新數(shù)據(jù)庫那段時(shí)間內(nèi)來了請(qǐng)求緩存沒有會(huì)直接去打數(shù)據(jù)庫如果請(qǐng)求量大的話數(shù)據(jù)庫瞬間被壓垮這就是緩存擊穿。先更新庫再刪緩存雖然極端條件下會(huì)有幾百毫秒的臟讀但對(duì)問答場景完全可接受。// 回答問題的異步處理邏輯 Service public class AnswerServiceImpl implements AnswerService { Autowired private StringRedisTemplate redisTemplate; Autowired private JmsTemplate jmsTemplate; Override public void submitAnswer(Answer answer) { // 1. 保存回答到數(shù)據(jù)庫 answerMapper.insert(answer); // 2. 刪除問題詳情的緩存下次查詢時(shí)自動(dòng)重建 redisTemplate.delete(qa:question:detail: answer.getQuestionId()); // 3. 發(fā)送異步消息通知提問者 jmsTemplate.convertAndSend(edu.qa.answer, JSON.toJSONString(answer)); } }ActiveMQ 在這里的作用是解耦把“新回答通知”這個(gè)非關(guān)鍵路徑剝離出去。如果不用消息隊(duì)列用戶提交回答后要同步調(diào)郵件或短信服務(wù)一旦短信服務(wù)掛了回答就提交失敗。用 ActiveMQ 之后回答只要存進(jìn)庫里就算成功通知失敗可以重試互不影響。上面代碼里convertAndSend是 JmsTemplate 最簡單的用法消息體直接傳 JSON 字符串消費(fèi)者那邊用JmsListener注解接消息就行。Redis 緩存這里還有一層設(shè)計(jì)熱門的瀏覽計(jì)數(shù)也不直接寫數(shù)據(jù)庫而是先寫 Redis再定時(shí)批量同步到 MySQL。不然用戶每打開一次問題詳情頁就 UPDATE 一次數(shù)據(jù)庫問答這種讀多寫少的場景也能把數(shù)據(jù)庫打滿。3.3 文章模塊富文本編輯與靜態(tài)化方案的取舍文章模塊相對(duì)簡單核心就是兩類頁面文章列表和文章詳情。文章詳情如果每次請(qǐng)求都從數(shù)據(jù)庫查、再用模板渲染數(shù)據(jù)庫壓力大不說響應(yīng)速度也慢。常見做法是文章發(fā)布時(shí)生成靜態(tài) HTML 頁面存到 OSS 或者本地磁盤前臺(tái)詳情頁直接返回靜態(tài)文件。我做過一個(gè)簡化版本前端用 Vue.js 的vue-quill-editor做富文本編輯器文章正文以 HTML 片段存進(jìn) MySQL。詳情頁請(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 前端文章列表頁的分頁邏輯 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 } } }這里要說一個(gè)很多人忽略的細(xì)節(jié)分頁接口返回的records是文章列表但列表里不應(yīng)該包含文章正文這個(gè)字段。文章正文可能幾十 KB列表頁一次性拉 10 篇就是幾百 KB移動(dòng)端網(wǎng)絡(luò)扛不住。正確做法是列表接口只返回 ID、標(biāo)題、摘要、封面圖、發(fā)布時(shí)間詳情頁再單獨(dú)查正文。這個(gè)字段裁剪邏輯要看 SQL 里 select 了哪些列MyBatis-Plus 里用select(Course::getId, Course::getTitle, ...)指定就好。4. 后臺(tái)運(yùn)營平臺(tái)ECharts 看板與 POI 報(bào)表導(dǎo)出的實(shí)現(xiàn)細(xì)節(jié)4.1 運(yùn)營后臺(tái)的數(shù)據(jù)面板ECharts 圖表接口怎么設(shè)計(jì)才不卡后臺(tái)運(yùn)營平臺(tái)要展示課程銷售趨勢、用戶增長曲線、問答活躍度這些圖表。ECharts 渲染本身是純前端的事后端的工作是提供聚合好的數(shù)據(jù)接口。最容易犯的錯(cuò)誤是后端直接返回明細(xì)數(shù)據(jù)讓前端去聚合。用戶量大了以后報(bào)表接口一次返回幾萬條記錄前端渲染直接卡死而且圖表數(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 直接寫 SQL是因?yàn)榫酆喜樵兺嵌啾?JOIN 加復(fù)雜條件用 MyBatis-Plus 的 Wrapper 反而難寫。一個(gè)項(xiàng)目里別只用一種數(shù)據(jù)訪問方式聚合報(bào)表類和業(yè)務(wù) CRUD 類用不同工具很正常。圖表數(shù)據(jù)接口的響應(yīng)速度一般要求 200ms 以內(nèi)超過這個(gè)時(shí)間前端就能感知到卡頓。如果聚合查詢超過 1 秒優(yōu)先加聯(lián)合索引只要 WHERE 條件和 GROUP BY 的字段在同一個(gè)索引里性能通常能提升一個(gè)數(shù)量級(jí)。4.2 POI 實(shí)現(xiàn) Excel 導(dǎo)出百萬行數(shù)據(jù)的正確導(dǎo)出姿勢后臺(tái)運(yùn)營平臺(tái)離不開導(dǎo)出功能課程清單、學(xué)員信息、問答列表都要導(dǎo)成 Excel。POI 是最常用的庫但很多人只會(huì)用XSSFWorkbook數(shù)據(jù)量一超過幾萬行就內(nèi)存溢出。POI 有 SXSSFWorkbook 專門處理大文件導(dǎo)出用內(nèi)存和磁盤交換的方式避免 OOM百萬行數(shù)據(jù)毫無壓力。// POI 導(dǎo)出課程列表數(shù)據(jù)量大時(shí)使用 SXSSFWorkbook public void exportCourses(ListCourse courses, HttpServletResponse response) { // 1. 用 SXSSFWorkbook1000 行刷一次盤避免內(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. 寫表頭 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. 寫數(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. 寫響應(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 行超過的行會(huì)刷到磁盤臨時(shí)文件。dispose()必須調(diào)用否則臨時(shí)文件會(huì)留在磁盤上一次導(dǎo)出清不干凈時(shí)間長了磁盤被占滿。數(shù)據(jù)量大導(dǎo)出耗時(shí)超過幾秒時(shí)前端要配合 loading 狀態(tài)不然用戶會(huì)以為界面卡死了。POI 導(dǎo)出還有一個(gè)常見的亂碼坑文件名里的中文如果直接拼在Content-Disposition里瀏覽器會(huì)變成下劃線。需要做 URL 編碼URLEncoder.encode(課程列表.xlsx, UTF-8)這樣 Chrome、Edge、Safari 都不會(huì)亂。4.3 運(yùn)營后臺(tái)的權(quán)限處理為什么把權(quán)限判斷放在網(wǎng)關(guān)層后臺(tái)運(yùn)營平臺(tái)不允許普通用戶訪問管理員和運(yùn)營人員要分開角色。微服務(wù)架構(gòu)下權(quán)限有網(wǎng)關(guān)層攔截和服務(wù)層校驗(yàn)兩層。網(wǎng)關(guān)層做粗粒度校驗(yàn)判斷請(qǐng)求路徑是否要求登錄、用戶有沒有這個(gè)角色的訪問權(quán)限服務(wù)層做細(xì)粒度校驗(yàn)判斷用戶對(duì)某條數(shù)據(jù)有沒有操作權(quán)。SpringCloud Gateway 的全局過濾器可以統(tǒng)一做登錄態(tài)校驗(yàn)和角色判斷這樣四個(gè)服務(wù)不用每個(gè)都寫一遍權(quán)限邏輯。token 用 JWT 格式網(wǎng)關(guān)解析出用戶 ID 和角色 ID 后通過 Header 傳給下游服務(wù)。這里有個(gè)坑下游服務(wù)直接信任網(wǎng)關(guān)傳來的 Header 有安全風(fēng)險(xiǎn)要加一個(gè)內(nèi)部密鑰校驗(yàn)防止服務(wù)端口暴露時(shí)被繞過網(wǎng)關(guān)直接調(diào)用。5. 避坑與排查online_edu 從開發(fā)到部署的 6 個(gè)真實(shí)踩坑記錄5.1 MySQL 連接報(bào)錯(cuò)SSL 連接錯(cuò)誤和時(shí)區(qū)問題一起出現(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è)問題同時(shí)出現(xiàn)。原因MySQL 8.0 默認(rèn)啟用 SSL 連接而且時(shí)區(qū)配置從SYSTEM改成了需要明確指定。JDBC 連接串里既沒配useSSLfalse也沒配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ù)建議直接寫進(jìn)每個(gè)微服務(wù)的配置文件里不要漏。5.2 Docker 安裝 MySQL 失敗鏡像拉不下來和容器起不來現(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ò)問題容器秒退則是 MySQL 初始化時(shí)往宿主機(jī)掛載目錄寫文件沒有權(quán)限。很多教程讓你掛載/my/own/datadir:/var/lib/mysql但這個(gè)目錄如果宿主機(jī)上沒有合適的權(quán)限MySQL 的mysqld進(jìn)程無法寫入數(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ù)調(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í)開啟evictExpiredConnections()和evictIdleConnections(60, TimeUnit.SECONDS)定期清理空閑連接避免連接池被死連接占滿。5.4 Vue 打包放進(jìn) SpringBoot 之后的刷新 404 問題現(xiàn)象前端 Vue.js 項(xiàng)目打包后的 dist 目錄放到 SpringBoot 的static目錄下訪問首頁沒問題但點(diǎn)擊前端路由跳轉(zhuǎn)到/course/1這種路徑后按 F5 刷新就報(bào) 404。原因Vue 是單頁應(yīng)用路由用的 history 模式刷新時(shí)瀏覽器向服務(wù)器請(qǐng)求/course/1這個(gè)路徑但 SpringBoot 里沒有對(duì)應(yīng)的靜態(tài)文件后端直接返回 404。開發(fā)環(huán)境沒有這個(gè)問題是 vite 或 webpack 的 dev server 做了 history 回退。解決后端加一個(gè)轉(zhuǎn)發(fā)規(guī)則把非接口路徑的請(qǐng)求都轉(zhuǎn)發(fā)到首頁。寫一個(gè)配置類實(shí)現(xiàn)WebMvcConfigurer添加一個(gè) ViewController 把錯(cuò)誤路徑轉(zhuǎn)發(fā)到index.html。但是要注意/api/**和/admin/**這些接口路徑不能轉(zhuǎn)否則請(qǐng)求后端接口會(huì)被錯(cuò)誤地返回 HTML排查起來更迷惑。5.5 阿里云 OSS 視頻上傳失敗STS 臨時(shí)憑證失效現(xiàn)象后臺(tái)運(yùn)營在管理臺(tái)上傳課程視頻時(shí)偶爾上傳到一半報(bào)InvalidAccessKeyId特別是上傳大視頻時(shí)幾乎必現(xiàn)。原因視頻點(diǎn)播和 OSS 的臨時(shí)憑證 STS 默認(rèn)有效期是一個(gè)小時(shí)但視頻上傳不是一次性的前端分片上傳大文件可能超過憑證有效期。憑證過期后后續(xù)分片攜帶舊憑證請(qǐng)求 OSS服務(wù)端直接拒絕。解決不要在前端固定一個(gè) STS 憑證上傳所有文件。每次開始上傳時(shí)后端重新頒發(fā) STS前端檢測到上傳失敗時(shí)捕獲InvalidAccessKeyId錯(cuò)誤后重新獲取憑證并重試當(dāng)前分片。同時(shí)在服務(wù)端把 STS 的有效期適當(dāng)延長比如 3 個(gè)小時(shí)但不要超過 12 小時(shí)安全性和體驗(yàn)要權(quán)衡。5.6 ActiveMQ 消息堆積消費(fèi)速度跟不上生產(chǎn)速度現(xiàn)象問答模塊的異步通知越來越多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ā)郵件的操作改成先入庫、再異步批量發(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ù)庫里加一個(gè)message_id唯一索引消費(fèi)前先嘗試插入插入沖突說明處理過了直接跳過。6. 進(jìn)階驗(yàn)證用 Docker Compose 一鍵部署 壓測確認(rèn)系統(tǒng)能上線項(xiàng)目開發(fā)完本地能跑通不等于能上線。我習(xí)慣把所有中間件編排進(jìn) Docker Compose在測試環(huán)境一鍵拉起然后立刻做一輪簡單的壓測確認(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ù)說明TZ: Asia/Shanghai同時(shí)設(shè)置了容器的時(shí)區(qū)和 MySQL 的時(shí)區(qū)解決 5.1 提到的 serverTimezone 報(bào)錯(cuò)Redis 加了appendonly yes開啟持久化避免容器重啟后緩存數(shù)據(jù)全部丟失ActiveMQ 映射了 61616服務(wù)端口和 8161控制臺(tái)端口控制臺(tá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è)很簡單的方法用ab壓測網(wǎng)關(guān)接口看吞吐量和錯(cuò)誤率。# 壓測課程列表接口模擬 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 # 壓測結(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)超過 500壓測結(jié)果如果 Failed requests 不為零先用dmesg看是不是端口隊(duì)列滿了再逐個(gè)排查是 MySQL 慢查詢還是 Redis 連接數(shù)不夠。我的經(jīng)驗(yàn)是online_edu 這種體量的系統(tǒng)先確認(rèn)基礎(chǔ)設(shè)施沒選錯(cuò)型號(hào)再談業(yè)務(wù)優(yōu)化。做 docker compose 部署和壓測這件事我吃了不少虧。以前圖省事本地直接把服務(wù)跑起來就給測試看結(jié)果每次環(huán)境不一致要么 MySQL 配置不一樣要么 Redis 版本不同測試報(bào) bug 我本地又復(fù)現(xiàn)不了最后發(fā)現(xiàn)是環(huán)境差異。用 Docker Compose 之后整個(gè)團(tuán)隊(duì)的環(huán)境完全一致這個(gè)“在我電腦上能跑”的玄學(xué)問題算是徹底根治了。最后的習(xí)慣是每次改完代碼先跑一遍壓測接口確認(rèn)響應(yīng)時(shí)間沒有明顯劣化再提交合并。壓測腳本放在項(xiàng)目的script目錄下隨手就能執(zhí)行不用臨時(shí)敲命令。希望這些步驟和踩坑記錄能幫你少走一段彎路把 online_edu 從本機(jī)跑通做到真正敢上線。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久久久久人妻| 丰满少妇猛烈A片免费看观看| 97操碰碰无码视频| 99精品视频在线观看| 天天插天天日天天爽| 三级片AAA久久久AAA久久久AAA| 噜噜噜精品欧美成人在线观看| 丁香五月 性爱| 欧美成人色婷婷| 日本久久超碰| 久热久| 啊V视频在线观看| 亚洲九区| 九九热在线视频观看| 91视频久久久| 综合色色网| 五月天婷婷丁香蜜桃91| 中文字幕人妻AV| 人人综合久| 婷婷第六色| 99热这里有精品| 在热视频精品| 97色碰| 色婷婷成人做爰A片免费看网站 | 丁香六月成人| 丁香五月天社区| 免费黄色片子| 成人精品网站在线观看| 99久热| 五月婷久久在线| 97极品在线| 天天天天操| 久久久久思思热| 九热免费视频| 偷拍丁香九月激情| 99啪啪视频| 国产一区男女| 丝袜激情网| 禁欲电影完整版在线播放| 五月丁香黄色视频| 亚洲婷婷开心五月| 色综合天堂| 国产精品久久久久久亚洲毛片| SS丁香五月婷婷| 国产成人高清| 人妻激情久久| 五月丁香啪啪啪综合网| 婷婷丁香五月综合激情视频| 国产亚洲99| www.五月天婷婷| 日韩抽插操逼| 亚洲不卡| 第五婷婷伊人丁香| 色婷婷综合久久| 五月婷婷六月丁香综合| 欧美人妻一区二区| 婷婷激情区| 无码髙清| 97婷婷五月| 在线观看中文字幕| 日日夜夜天天| 色五月婷婷久久| av 一区三区四区| 伊人五月婷婷国产视频| 综合色图婷婷| 丁香六月婷婷色XXXXX| 久久中文人妻系列| 婷婷激情四射网| 屁股翘好撅高迎合跪趴| 久久这里只有精品热在99| 五月婷婷基地| 激情五月婷婷老师| 另类国产欧美视频| 久久久香| 五月丁香福利| 91狠狠色色丁香婷婷综合久久| 99视频久久免费视频| 另类国产欧美视频| 99超碰欧美| 六月婷婷综合激情| 久久这里只有精品99| 五月丁香久久久日婷婷久久婷婷日| 超色欲天天| 亚洲在线免费成人| 97人人草| 九九婷婷网五月天| 久热成人| 99热日韩| 综合99久久天天综合| 色原狠狠综合| 丁香五月亚洲综合| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 五月Huangsewang| caop在线| 五月天伊人久久久久| 成人欧美一区二区三区在线观看| 天天在线久久综合 | 日韩AV在线免费| 202丰满熟女妇大| 久久婷色| 激情av| 激情综合激情综合| 99无码黄色视频| 久久99色色| 韩国情人在线电视剧免费观看高清版全集 | 色综合99| 欧美成人精品A片免费一区99| 99热在线中文字幕| 久久久香| 丁香六月婷婷五月天| 亚洲无线视频| 五月色婷婷中文字幕| 极品九九九九九九| 婷婷五月色播天| 国产精品a无线| 97色色色| 亚洲综合五月天| 99亚州综合精品成人网| 丁香五月手机在线| 91九色网| 99热综合网| 丁香五月伊人| 91一起操| 9久精品| 亚洲天堂aaaa| 天天日天天色| 日本三级中文字幕| 日本高清久| 久操97| 五月激情在线| 99re在线精品视频| 激情五月天社区| 亚洲色婷婷五月天| 熟妇内谢69XXXXXA片| 99无码视频| 99在线观看| 综合久| 婷婷六月激情在线视频| 99热精品中文字幕| 久热这里| 99九九在线| 丁香九月婷| 国产激情视频在线观看| 另类专区在线观看| 五月丁香在线| 思思热99在线视频| 一起草无码视频| 男人天堂99| 五月丁香啪综合| 操操天堂| 精品婷婷五月视| 亚洲AAA| 校园激情 亚洲| 色情丁香五月天| 狠狠狠狠狠狠草| 午夜不卡成人一区二区| 狠狠草狠狠草| 99热这里精品| 婷婷情色开心五月天99| 色月丁| 丁香五月最新网址| 国产成人综合网| 天天爽夜夜爽夜夜爽精| 涩五月色婷婷| 夜夜躁爽日日| 九九XX视频| 98色丁香五月婷婷综合网| 狠狠色五月| 色五月色五天色情网| 青青草性爱视频| 伊人超碰| 激情 婷婷| 婷婷色五月开心五月| 婷婷天堂站| 久久97| 91热久88| WWW,激情五月天,COM| 五月丁激情| 丁香六月情| 啪啪99| 日本99热| 婷婷成人AV| 激情欧美婷婷| 婷婷五月天久久| 久久婷婷色| 强壮公让我夜夜高潮A片视频| 天天操天天插天天射| 久久伦乱| 国产色五月| 九热...av| 最近中文字幕在线中文视频| 色五月婷婷影院| 99性视频| 超碰99在线| 成人av免费观看| 日韩国产AV播放| 99精品人人| 天天操夜夜夜拍拍拍| 色婷视频| 亚洲视频在线观看| 亚洲啪视频| 久久人人人人妻| 五月婷婷偷拍| 99精品综合在线| 色综合激情| 婷婷开心激情综合五月天| 久久婷婷五月天激情四射| 国产精品成人AV在线观看春天 | 伊人久久艹| 丁香五月第四色88| 色婷婷成人| 影音先锋天天日| 五月丁香好婷婷姑娘综合网| 超碰在线人妻| 日韩伊人大香蕉| 99成人网站| 久婷婷色| 伊人激情综合| 五月婷婷六月丁香综合视频在线| 五月丁香六月婷| 超碰免费电影| 天天碰天天插天天操| 六月婷婷av| 26uuu成人网| 91丨九色丨东北熟女| 五月婷婷婷婷| 亚洲久久天堂| 91啪级电影| 五月久久婷婷| 五月综合丁香婷婷| www.狠狠| 97超级碰碰碰| 夜夜操夜夜操| 艹色18p| 91超碰人人操| www.五月天色色.com| 婷婷酒色网| 99热九九这里只有精品10| 激情床戏| 超碰免费99| 激情五月色在线播放| 亚洲V国产V欧美V久久久久久| 色五月色五天色情网| 五月天狠狠网| 美日韩成人| 国精产品一区二区三区| 九九热视频思思| 人妻体体内射精一区二区| 成人亚洲精品| 中文字幕在线免费观看视频| 久久东京热婷婷五月| 色婷婷的五月天| 果冻传媒A片一二三区| 精品九九在线观看视频| 婷婷俺去也| 亚洲操精品| 丁香五月天电影| 无人区码一码二码三码医生系列| 日韩无码人妻一区二区三区综合 | 99热97| 内射 无码 伊人| 五月天婷婷久久综合| 色五婷婷开心缴| 丁香五月天激情综合网| 性色婷婷| av九九| 超碰色婷婷| 在线中文亚洲| 这里只有精品99视频| 91视频综合网| 伊人玖玖综合| 婷婷午夜综合| 成人片在线播放| 五月丁香啪综合| 丁香婷婷五月综合影院| 丝袜人妻| 综合五月草| 色爱亚洲| 日日爱678| 中文字幕永久在线| 五月天婷五月天综合网在线观| 激情第四色| 久久久久亚洲A∨成人乱码电影| 久操热线| 婷婷五月天在婷| 欧美熟女视频 色婷婷| 五月丁香青草综合啪啪| 五月天激情图片网| 综合大香蕉| 久热这里只精品| 久久这里只有精品热在99| 欧美va视频不用播放器的va视频网| CHINESE熟女老女人HD视频| 色噜噜,噜噜色| 综合欧美五月婷婷| 久久aaaa片一区二区| 婷婷五月丁香四射| 最新色色五月天| 成人版视频在线观看| 深爱开心五月天| 精品一区二区三区四区五区六区介绍 | 久久婷婷五月综合色奶水99啪| 五月天婷婷Av| 亚洲色亚洲精品| 色九九综合色| 激情五月开心五月丁香五月| 免费AV在线网址| 丁香五月综合AV在线| 色噜噜狠狠狠狠色综合久欧美| 五月丁香久久激情网| 色呦精品| 天天爽免费视频| 日韩成人电影Av| 色色色色色色色色综合网| 久久久久久9热不雅视频| 婷婷五月激情在线视频| 大胆伊人久久| 大香蕉五月天婷婷| 天天天操天天天爰| www.99热| 日本精品在线噜噜噜| 亚洲无码99| 999热在线视频| 成人毛片在线免费观看| 婷婷亚洲综合| 天堂爱爱| 久久受www免费人成| 激情综合网激情五月丁香| 色在线免费观看| 久久婷婷五月综合色和| 九九色播五月丁香| 狠狠狠狠狠狠| 国产精品久久久60086| 色综合网上班开心婷婷久久| 欧美搡BBBBB摔BBBBB| 五月天亚洲最大成人| 深爱五月日韩| 日本人妻操| 欧美成人精品A片免费一区99| 激情婷婷在线中文字幕| 色情五月综合婷婷| 99热在线观看免费| 五月天丁香久久| 欧美色色色色色色色色色色| 欧美99热| 99精品国产在热久久| 天天操夜夜爽| 婷婷99狠狠躁天天躁中文| 久久99婷婷| 精品国产人人爱人人| 亚洲春色奇米影视| 九色啦蜜臀| 亚洲永久四色| 色色五月婷婷网| 99这里有精品| 丁香激惜男女| 婷婷丁香黄色| 丁香六月啪啪| 天天夜天天色天天| 91精品91久久久中77777久久玖玖九九| 婷香五月激情视频| 天天干天天爽天天操| 中文字幕激情综合| 国外亚洲成AV人片在线观看 | 日韩一区二区A片免费观看| 六月天无码网址| 亚洲 欧洲 国产 伦综合| www色色com| 五月丁香综合啪啪対白| 综合五月丁香六月婷婷| 亚洲精品V天堂中文字幕| 综合色色色色色色| 色婷婷久久综合| 伊人综合网站| www.99精品在线| 开心深爱五月天| 亚洲人成网站999综合| 国产9色在线/日韩| 九九热在这里只有精品| 亚洲无码成人| 久久加勤综合| 99热6精品| 激情五月婷婷色播网| 五月天色色婷婷| 色婷婷小说| 欧美成人精品老美女噜噜噜| 九九热这里只有精品5| 五月美女婷婷风骚| 六月婷婷中文字幕| 俺去也五月| 五月婷五月婷伊人伊人五月婷| 久久精品熟女亚洲AV麻豆| 亚洲成人超碰| 日日爽天天| 久久香蕉网| 精品五月花| 97人人干| 五月婷婷在线观看黄| 五月丁香婷婷AV天堂| 日韩无码系列| 色狠狠色噜噜AV天堂五区| 玖玖五月| 久久婷婷五月综合色丁香| 婷婷成人综合| 亚洲精品中文字幕成人片| 日本色婷婷| 色激情五月| 亚洲VA在线| 日韩欧洲亚洲| 99免费偷拍视频| 嫩草AV久久伊人妇女超级A| 婷丁香五月天| 新精品99| 熟女五月天久久综合| 99福利导航| 99九九热播在线免费视频| 色婷五月| 伊人99热| 激情久久久久久久久久久| 激情网站综合五月天| 色月九九| 色婷婷无吗| 疯狂做受XXXX高潮A片动画| 91干视频| 夜夜撸日日操| 五月香六月婷| 五月丁香六月婷婷免费| 综合久久影院| 婷婷性爱视频在线| 五月天啪啪网| 天天狠狠综合精区| 嫩草AV久久伊人妇女超级A| 五月丁香久久网| 欧美国产一区二区三区| 五月丁香伊人网| 丁香五月天激情网址| 国产视频福利| 婷婷五月天首页激情| 荫道BBWBBB高潮潮喷| 色五月六月| 色五月婷婷大香蕉| 九九精品免费| 色亚洲欧洲| 另类小说婷婷色| 丁香五月AV在线| 无码人妻电影| 日韩无码91| 亚洲中文字幕翔田千里| 五月丁香婷婷五月色| 色婷婷小说| 久久思思热| 久久99久久久久久| 九九精品99| 丁香九月综合| 亚洲99综合| 色情丁香五月婷婷精品| 无码人妻激情| 色综合久久久久| 五月婷婷啪啪啪| 大香蕉婷婷久久| 可似看的AV| 丁香婷婷成人在线播放| 五月婷六月丁| 热99只有里视频| 人人干AV| 日日日影院| 色宗合久久五月婷婷| 精品无码色欲AV| 天天拍夜夜撸| 五月综合婷婷开心网| 五月丁香激情四射综合| 婷婷五月天久久久| 亚洲丁香花色| 玖玖综合色| 综合激情在线| 99网| 亚洲高清在线| 亚洲成人AV在线观看| 俺去婷婷 丁香| 在线成人va| 少妇性按摩无码中文A片| 丁香五月欧美色综合| 性爱先锋AV| 99色在线观看| 日本色噜| 色婷五月天亚洲| WWW五月天| 五月丁香av在线| 99热在线中文字幕| 黄色91在线观看| 久久九⑨| 亚洲无码另类| 婷婷爱综合| 这里只有精品在线播放| 五月天婷婷在线AN| 色射影院| 成人视频网| 亚洲六月综合激情久久下卡| 国产44页| 丁香五月天啪啪| 五月香蕉婷婷| 终合激情网| 五月婷婷人人人操| 91婷婷| 婷婷丁香九色| 九九色院| 成人va在线观看视频| 狠狠干在线视频| 新伍月婷婷| 99久久玖玖| 色五月亚洲| 五月婷三级片| 久久精品五月天| 亚洲va日| 天天操综合网站| 熟女网站久久| 国产肥白大熟妇BBBB视频| 伊人久久丁香五月91| 婷婷综合九月| 五月婷婷开心亚洲无| 99只有这里是精品| 97色在线观看视频| 欧美成人AAA片一区国产精品| 婷婷综合久久综合| 大香蕉精品视频| 春色激情第四色| 538在线精品| 丁香六月婷婷色XXXXX| 666555。COm毛片| 黑人无码一区| 综合狠狠干| 人妻性爱av网站| 久久婷婷五月综合色播| 一月婷婷色色| 激情操逼婷婷| 婷婷爱爱蜜臀天天操| 激情五月婷婷网在线观看| 五月婷婷第四色| 色五月网址| 亚洲av另类在线观看| 伊人婷婷综合| 欧美日本一区二区三区| 久久综合干| 久久色大香蕉| 久/久精品99看9| 亚洲精品国产精品乱码不99| 99热啪啪| 91亚洲视频| 激情另类综合| 六月天婷婷| 99这里都是精品| 色婷婷情片| 五月青青草综合| 色九亚洲| 99riAV成人在线视频| 成人网站av免费网站推荐| 五月丁香六月婷婷的女人| 99性爱| 免费看欧美成人A片无码| 97久久五月丁香婷婷| 天天在线久久综合| 久久亚洲天堂| 婷婷五月天干干| 91.com男女操| Blackedraw视频一区二区| 久99久精品| 久久久久人妻中文| www.色综合.com| 4438亚洲欧美| 99久久婷婷国产综合精品| 五月丁香啪啪综合| 丁香五月婷婷激情中文| 另类视频在线| 99视频九九热| 日韩1区2区| 亚洲国产精品SUV| 五月丁香六月激情综合| 五月五婷婷| 黑人糟蹋人妻HD中文字幕| 午夜九九九九九九九九九九九九九| 97婷婷丁香五月| 久久只有18视频| 五月丁香久久丝袜啪啪| 丁香五月激情性色郤| 久久婷婷视频| 99热碰碰热| 天天激情| 超碰在线50| 都市激情蜜桃婷婷五月天 | 草草色情综合网| 久热久色| 日韩999| 人碰91| 欧美婷婷五月天综合| 丁香五月社区| 亚洲第一黄网| 欧美影院| 五月丁香婷婷99| 热久久视频99| 国产成人精品一区二三区熟女在线| 日本99视频| av在线免费网站 | 天天干天天色综合| 九九精品综合| 玖玖五月丁香| 五月婷婷黄| 久久婷婷五月综合啪| 午夜69成人做爰视频| 九九热这里只有精品23| AAA久久久| 99综合熟女| 久久久久9| 婷婷五月天亚洲综合| 五月婷天堂视频| 天天干天天叉| 665566 无码| 色五月视频无码播放| 桃色五月天| 99亚色色色| 97人人超| 97婷婷色| 97自拍视频在线| 婷婷97碰碰| 超碰97干| 九九色之九九色88| 久久东京热婷婷五月| 日韩肏屄网| 五月天成人综合| 一区二区传媒视频| 五月天亚洲综合网| 五月婷免费视频| 五月天最新网| 狠狠色婷婷7777久综合| 久久九九色| 男人天堂AV在线一区二区| 丁香久久| 久久大香免费| 婷婷综合成人| 九九精品综合| 久久丁香五月天| 国产成人AV在线| 99九九久久| 色墦五月丁香| 欧美激情五月天| 99热日韩这里只有精品| 国产在线aaa片一区二区99| 一夜福利不卡| 天天揷综合网| 婷婷视频在线| 热996精品在线观看| 色五月婷婷基地| 97人妻碰碰碰久久| 天天粽合合合合| 久操欧美在线观看97| 五月婷婷无码专区| 婷婷五月成人社区| 五月丁香六月综合激情| 久久久久亚洲AV成人无码电影| 99re在线精品视频| 毛片网站谁有| 无码日本精品XXXXXXXXX | 色综合久久88色综合中文字幕| 久久大国产香蕉| 丁香五月婷婷激情中文| 综合亚洲AV| AV在线免费播放| 人妻性操逼中文字幕 国产| 婷婷六月天| 狠狠999| 校园春色亚洲色| 色色AV色色色东莞| 婷婷射图| 色情五月综合婷婷| 深爱丁香激情| 色欧美日| 久久精品99| 小视频aaa久久久| 伊人婷婷99热精品| 99视频这里有精品| 91操人视频| 欧美电影在线播放| 91色情播放| 综合久久高清| 五月丁香另类网| 久草五月丁香婷婷综合| 色狠狠综合| 中文字幕综合网| 综合在线色婷婷| 另类图片婷婷五月天| 九九aV| 激情婷婷五月天网址| 国产古装妇女野外A片| 久久99精品视频| www色色com| 熟女色专区| 五月天色色无码| 色色激情网| 黄网免费看| 俺去也五月天婷婷| 婷婷色五月91啪啪| 天天爱天天操| 亚洲激情图文小说| 香蕉99网| 丝袜大香蕉| 伊人五月网| 99精品97| 国产欧美精品AAAAAA片| 五月婷婷之婷婷| 538午夜激情| 丁香五月瑟瑟| 91九色在线| 囯产精品一品二区三区| 国产精品操| 国产成人精品一区二三区熟女在线| 可似看的AV| 激情欧美婷婷| 热婷婷av| 五月丁香啪啪| 99热官网精品在线| 激情六月丁香综合| 婷婷五月无码| 女人高潮内射99精品| 色 色 色综合com| 五月激情丁香六月狠狠干| 婷婷丁香综合在线| 在线播放成人网站| 五月丁香激情综合网| 日本本土色网第一区| 亚洲综合欧美色丁香婷婷888月图片| 日夜夜天天| 99精品人人| 日韩黄色中文字幕| 久久久久9| 欧美成人精品一区二区| 五月丁香六月综合情在线观看| 99操不停| 欧美大肥婆大肥BBBBB| 久久色9| 亚洲小说欧美激情| 日韩成人av在线| 婷婷中文综合网| 日本色婷婷| 丁香五月成人婷婷| 五月丁香久久久| 色优久久| 99在线视频女女视频| 国产乱人偷精品人妻A片| 综合激情在线视频| 婷婷六月视频| 五月婷婷狠天天色综合| 久久女人天堂| 国产三级在线播放| 久久久国产精品黄毛片| 九月激情网| 久久综合人妻| 五月丁香色狠狠干大屄| 婷婷香香五月| 9l视频自拍9l视频自拍九色学生| 99久久婷婷精品视频| 色播综合| 婷婷五月天久久| 国产婷婷五月色情综合| 另类激情五月| 丁香六月天AV| 精品在线网站| 99久久.www| 激情综合网激情五月丁香五月俺也去| 午夜丁香婷婷| 97干在线视频| 丁香五月天视频| 天天五月情| 激情婷婷五月天伊人在线观看| 67194成I人在线观看线路1| 久久久五月天婷婷成人网| 国外亚洲成AV人片在线观看| 99re6久热只有精品6在线直播| 午夜婷婷久久| 婷婷丁香五月在线播放| 六月婷婷七月丁香| av超碰在线| 玖玖色综合色| 欧美日韩中文国产一区发布| 五月激情影视| 日本综合久久| 啪啪黄页网| 欧美婷婷五月天| 精品51XX| 深爱激情网噜噜色| 婷婷色5月天在线。| 丁香色五月直播| 亚洲AV成人片无码网站| 五月丁香黄色| 婷婷终合色图| 国产在线视频1234| 久久99草五月婷婷| 丁香花大香蕉婷婷综合| 欧美性生交XXXXX无码小说| 九九色逼| 五月天色综合| 天天操天天操天天操天天操天天操| 色色色国产| 欧美日本黄色| 色噜噜狠狠色综合成人网| 五月天婷婷丁香导航| 熟女激情五月天| 亚洲狠狠干| 五月婷婷六月少妇激情| 日日舔夜夜操| 五月丁香龟婷婷| 色婷婷丁香五月综合| 天天操夜夜爱| 五月婷婷精品无在线| 久久深爱激情网| 热久久精品视频网站| 五月丁香婷中文| 99色播| 五月丁香久久激情网| 天天干天天 亚洲| 激情五月色综合国产精品| 99久久成人| 亚洲99在线| 99热精品一| 色婷亚洲| 婷婷成人五月天成人文学小说| 五月开心深爱激情网| 天天爽天天摸人妻综合网| 天天色色天天| 天天天天天天操| 成人精品一区二区三区四区五区 | 99视频在线播放大全| 色激情五月| www.五月婷婷| 夜夜爱网站| 另类视频在线| 极品人妻VIDEOSSS人妻| 色婷婷中文| 婷婷干六月综合旧址| 午夜日韩久久久网站| 91色吧网| 9色视频在线| 婷婷五月四狠狠| 天天色爽| 婷婷丁香激情| 这里只有精品免费| 色情五月婷| 婷婷久久综合久| 在线不卡视频| av大片在线| 99久久人人| 久久一品区| AV在线观看网站| 99热这里只有99| 激情婷婷丁香色情五月天| 日日操,夜夜爽| 夜夜操夜夜操| 婷婷久久五月丁香| 玖玖在线视频| 亚洲操女| www.9797国产| 色 免费网站视频| 婷婷五月欧美综合| 久热A| 天堂综合久久 | 久久免片| 91综合国免费久入| 日本三级日本三级99| 综合色、色综合| 国产操逼网站| 久久久久久综合88| 五月婷婷六月丁香激情综合网| 五月开心激情网| 久色五月丁香视频| 五月激情小说网| 国产无遮挡又黄又爽免费网站| 亚洲成人在线观看网址| 人人97碰| 婷婷激情六月综合| 六月丁香六月婷婷欧美| 天天开心AV色综合婷婷五月天| 亚洲天码视频www蛋播视频| 人妻视频在线| 图片区 小说区 区 亚洲五月 | 99福利导航| 婷婷丁香五| 精品久久久人妻| 五月天啪啪| 95精品区一区二| A级毛片高清免费不卡播放谢谢谢谢| 另类图片天天影视在线观看| 天天干天天干天天干天天干天天干天天 | 97五月久久丁香婷婷| 日日夜夜干| 婷婷久久爱| 婷婷五月天黄色| 五月的丁香六月的婷婷| 四月婷婷五月丁香| AV电影在线播放| 涩玖玖免费视频| 久久久人妻人伦| 激情五月少妇| 成人在线网址| WWW.亚洲无码| 亚洲婷婷91丁香| 人妻在线中文字幕久久| 亚洲综合另类| ..真实国产乱子伦对白在线_欧| 婷婷五月天丁香激情| 五月婷婷偷| 人妻久久久久久久| 日韩操人| 99热在线看| 丁香五月综合久久八| 色导航色婷婷五月天在线观看| 色色色色五月| 曰本aaaaaa丈片| 在线国产精品色| 国产日韩欧美| 嫩BBB槡BBBB搡BBBB| 91色吧网| 夜夜操狠狠操天天操| 色婷婷欧美| 性爱技巧五月| 在线国产精品色| 国产成人亚洲综合A∨婷婷| 亚洲色五月| 精品99视频| 五月天色五月天| 欧美色99| 亚洲啪| Se.婷婷五月天| 五月天婷婷丁香| 五月天天天天天天天天天天天婷婷婷| 亚洲色五月| 97人人搞| www,婷婷| 欧美成人精品A片免费一区99| 91无码高清| 99热这里只是精品| 六月丁香五月天| 日本三级网址| 六月婷婷色宗合| 久久怕怕视频| 免费人人操| 天天操,天天插| 日日噜噜夜夜狠狠久久丁香六月| 亚洲免费视频网站| 九九九九九九九热| 丁香五月成人| 91婷婷搞| 五月天婷婷激情在线色图| 蜜臀AV在线观看| 婷婷综合网| 开心五月天激情网| 黄色av高清| 国产阿姨日皮艹逼内射视频| www.99久| 九月丁香欧美综合| 99热777| 91碰碰| 婷婷久久亚洲| 五月天婷婷在线视频| 91干婷婷| 精品国产va久| 夜夜干 夜夜操| 婷婷内射视频在线| 天天舔天天操| 婷婷综合九色伊人| 婷色成人| 狠狠色成人影片| 日本熟妇精品99| 99综合网| 9999综合99综合人| 婷婷五月天激情五月天网站| 成人做爰A片免费看视频| 亚洲色碰| 综合激情在线| 久久婷婷五月激情综合| 99爱在线视频观看| 超碰在线日夜| 深爱网深爱综合网| 婷婷久久五月| 久久久精品视频79| 色色五月天丁香| 婷婷五月天亚洲综合| 99久久极情精品一区| 中文字幕不卡网站| 激情五月婷婷综合网| 五月丁香啪啪啪| 久久久精品99亚洲综合| 久久99久久99久久99人受| 色综合视频| 狠狠色噜噜狠狠狠狠综合| 色综合女人99| 人人视频色| 五月丁香亭亭操逼| 超碰国产在线观看| 夜夜爽天天爽| 五月天激情综合网| 九九99精品视频在线观看| 色婷婷精| 九九热精品6| 亚洲精品**不卡在线播he| WWW.桔色成人.COM| 综合色在线| 国色天香伊人狠狠色| 大香蕉综合视频在线| 伊人狠狠狠综合| 98国产精品综合一区二区三区| 久er7久热| 思思热在线观看| 激情婷婷内射| www.五月天| 欧洲激情五月天婷婷| 天天操天天插| www.狠狠色.com| 欧美顶级少妇做爰HD| 狠狠色狠狠鲁| 国产性爱在线| 日日操,天天操| 91a片爽| 五月丁香激情婷婷| 影音先锋91男人资源在线播放| 婷婷激情五月综合| 婷婷六月色情| 日韩av在线免费观看| 9久热免费视频99| 超碰人人操人人干| 婷婷久久五月天| 激情99| 久草五月天电影网| 狠狠插.com| 成人视频婷婷| 五月婷婷综合丁香视频| 五月天婷婷成人网| 激情丁香六月| 另类五月激情| 九一99| 亚洲激情| 97影院一级片| 99久热| 婷婷五月影院| 91小黄书网址在线观看| 丁香婷婷婷| 天天综合精品| 粉嫩av懂色av蜜臀av熟妇| 99热综合| 婷婷六月插屄激情| 午夜在线成人网站免费观看| www,天天干| 色狠狠999综合| 五月天综合色| 丁香五月天av| 九九九九九九九九九九九九九国产精品| 99热66| 狠狠丁香| 色婷婷小说| 久久视频这里99| 色欲婷婷五月天丁香| 99热最新网址| 丁香五月骚喷水视频| 亚洲成人丁香花| 9l视频自拍九色9l视频在线观看| 久99热| 亭亭五月丁香五月天激情| 欧美色99| 五月丁香成人网| 伊人色综在线| 婷婷趴趴| 亚洲综合另类| 日日做天天操夜夜爽| 欧美日韩精品一区二区三区钱| 色色狼人综合| 就99这里只有精品| 丁香亚洲色综合| 成人一级片| 国产阿姨日皮艹逼内射视频| 婷婷九月丁香中文| 91久久| 内射激情在线| 久热伊人9| 精品人妻久久久久久| 26uuu91| 五月天天综合| 欧美在线视频99| 99re这里只有精品视频了| 色婷婷久久综合久色综| 天天色情站| 激情综合网五月天| 婷婷丁香六月综合激情站| www.丁香黄色五月天人与| 五月天婷婷綜合院| 五月丁香六月婷精品视频| 五月婷婷色白丝| 色五月五月婷婷| www夜夜操comwww| 丁香五月婷婷黑人妻黄色电影院| 国产成人AV| 任你操精品免费| 五月激情另类| 狠狠爱夜夜| 99网| 超碰国产AV| 欧美激情xxxXX| 婷婷爱五月| 伊人综合网站| www.色婷婷.com| va中文资源在线观看| 亚洲热久| 日本色婷婷| 激情五月久久| 五月六月激情婷婷| 懂色av蜜臀av粉嫩av永陈冠希| 日本色婷婷| 狠狠狠狠狠狠| 婷婷九月激情网| 99久久婷婷五月综合| 国产午夜伦鲁鲁| 婷婷激情性爱| 久久思思热视频| 日本久久精品| 婷婷综合伊人| 香蕉久久国产AV一区二区| 99久视频| 9久久久久久久久久久| 美女五月天婷婷| 大香蕉五月婷婷丁香| 久久九区| 亚洲夜夜操| 影音先锋色色色资源色资源色| 色原狠狠综合| 国产亚洲精品久久久久久郑州| 七七色色综合| 久99久热只有精品国产99| 99热这里只有精品1025| 91九色 熟| 久久婷婷热| www.天天干| 五月婷综合网| www.xtbsty.cn.com蜜乳AV| 欧美亚洲成人在线| 热91久| 色婷婷婷婷| 日本爆乳片手机在线播放| 开心日韩丁香婷婷五月| 午夜成人综合| 色激情网| 狠狠精品干练久久久无码中文字幕| 五月天操逼网| 五月天 另类图片| 草美女在线观看视频在线播放| 激情婷婷久久| 色吊操色妞| 四LLL少妇BBBB槡BBBB| 色墦五月丁香| 天天在线XXX| 99热99热99热99热| 狠狠狠狠免费| 九九热超碰| 91大屁股精品| 五月丁香亚州综合网| 99国产精品久久久久久久久久久| 中文字幕成人| 九色啦蜜臀| 五月婷婷性| 欧美婷| 五月丁香婷成人网| 婷婷91| 无码髙清| 996re热精品视频| 久久久亚洲精品一区二区三区浴池| 国产精品成人在线| 日本女人久久| 狠狠做深爱婷婷久久综合一区| 六月激情婷婷| 久久久97| 99久久97久久欧美综合网| 亚洲美女裸体被操在线观看| 免费观看18视频网站| 婷婷五月色播放| 91碰| 五月婷婷激情综合| 五月天综合婷婷| 激情五月天婷婷视频| 色。 日日日| 激情5月舔| 久久xxxx| 99综合一区| 色色九九五月天 | 日本激情ⅩXX免费视频| 亚洲AV成人精品日韩在线播放| 丁香婷婷91在线观看视频| 精品导航在线x不卡| 91a片爽| 五月丁香久久久| 狠狠精品干练久久久无码中文字幕| 99热99在线| 成功精品影院| 五月婷综合| 99久视频| 婷婷天堂站| 久99久在线| 任你日视频| 9999三级片| 五月婷婷偷拍| 99a级片| 丁香婷五月天开心六月| 激情丁香五月天| 青草五月天| 99视频在线精品| 五月丁香六月婷婷网| 五月综合无码| 四色五月婷婷| 99热精品在这里| 综合在线色婷婷| 四色五月婷婷| 九九热精品| h亚洲| 99九九精品视频| 丁香五月另类色婷婷麻豆| 91综合国免费久入| 操一区| 五月天婷婷色色| 亚洲综合五月| 婷婷久久综合久| 五月天婷婷成人网| 久久精品国产一区二区三区四区 | 婷婷综合成人五月天| 深爱激情五月天色婷婷| 成人网站免费sxj| WWW激情五月天| 嫩草AV久久伊人妇女超级a| 五月婷婷在线观看| 六月合五月婷| 九九在线精点品| 色99热| 婷婷九月| 五月天婷婷久久视频| 成人精品在线观看| 荫道BBWBBB高潮潮喷| www.丁香六月婷婷久久天堂影院.con| 六月婷婷色色网| 久久爱综合| 色综合偷拍| 久久婷狠狠色| 婷婷色激情网| 五月丁香视频在线观看| 亚洲mm色| 草逼大片| 激情综合五月| 成人亚洲精品| 99成人| 成人中文网| 婷婷婷久久| 99热丁香五月| 丁香九月激情| 久久这有这里精品| 色六月天| 婷婷五月天电影网| 色色激情网| 性爱久久| 久久五月天激情| 91色碰| 91色久| 婷婷五月天亚洲色| 久久这里有精品视频| 日本3级片一区2区|